From 6086edf25bfc9fbc70ea982d514b257454dc5f2d Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Tue, 11 Sep 2018 11:17:14 +0200 Subject: [PATCH 01/27] MQ/examples/simulation_split First version of the MC simulation in MQ, where generated events are sent to transport devices: - FairMQPrimaryGeneratorDevice - generates events and pushes them; - FairMQTransportDevices - pulls generated events and transports them in G3 or G4; - FairGenericStack/FairStack - added new function SetParticleArray(); - FairMQRunDevice - base class for FairMQSimDevice. --- base/sim/FairGenericStack.h | 1 + examples/CMakeLists.txt | 1 + examples/MQ/pixelDetector/run/runMQSim.cxx | 2 +- examples/MQ/pixelDetector/src/CMakeLists.txt | 2 + .../MQ/pixelDetector/src/FairOnlineSink.cxx | 8 +- .../MQ/pixelDetector/src/FairOnlineSink.h | 6 +- .../src/devices/FairMQRunDevice.cxx | 109 +++++++++ .../src/devices/FairMQRunDevice.h | 45 ++++ .../src/devices/FairMQSimDevice.cxx | 59 +---- .../src/devices/FairMQSimDevice.h | 9 +- examples/MQ/simulation_split/CMakeLists.txt | 9 + .../simulation_split/devices/CMakeLists.txt | 68 ++++++ .../devices/FairMQPrimaryGeneratorDevice.cxx | 120 ++++++++++ .../devices/FairMQPrimaryGeneratorDevice.h | 66 ++++++ .../devices/FairMQTransportDevice.cxx | 210 ++++++++++++++++++ .../devices/FairMQTransportDevice.h | 97 ++++++++ .../MQ/simulation_split/run/CMakeLists.txt | 71 ++++++ examples/MQ/simulation_split/run/runMQGen.cxx | 54 +++++ examples/MQ/simulation_split/run/runMQSim.cxx | 53 +++++ .../MQ/simulation_split/run/runMQTrans.cxx | 96 ++++++++ examples/common/mcstack/FairStack.h | 13 +- 21 files changed, 1033 insertions(+), 66 deletions(-) create mode 100644 examples/MQ/pixelDetector/src/devices/FairMQRunDevice.cxx create mode 100644 examples/MQ/pixelDetector/src/devices/FairMQRunDevice.h create mode 100644 examples/MQ/simulation_split/CMakeLists.txt create mode 100644 examples/MQ/simulation_split/devices/CMakeLists.txt create mode 100644 examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.cxx create mode 100644 examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.h create mode 100644 examples/MQ/simulation_split/devices/FairMQTransportDevice.cxx create mode 100644 examples/MQ/simulation_split/devices/FairMQTransportDevice.h create mode 100644 examples/MQ/simulation_split/run/CMakeLists.txt create mode 100644 examples/MQ/simulation_split/run/runMQGen.cxx create mode 100644 examples/MQ/simulation_split/run/runMQSim.cxx create mode 100644 examples/MQ/simulation_split/run/runMQTrans.cxx diff --git a/base/sim/FairGenericStack.h b/base/sim/FairGenericStack.h index 71e6c22504..9bc79831a1 100644 --- a/base/sim/FairGenericStack.h +++ b/base/sim/FairGenericStack.h @@ -97,6 +97,7 @@ class FairGenericStack : public TVirtualMCStack virtual void Register() {} virtual TClonesArray* GetListOfParticles() { return 0; } + virtual void SetParticleArray(TClonesArray* partArray) {} /** Clone this object (used in MT mode only) */ virtual FairGenericStack* CloneStack() const; diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index de03945e47..014fe90823 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -19,6 +19,7 @@ If(GEANT3_FOUND) add_subdirectory(MQ/serialization) add_subdirectory(MQ/pixelDetector) add_subdirectory(MQ/pixelAlternative) + add_subdirectory(MQ/simulation_split) add_subdirectory(advanced/Tutorial3) EndIf() add_subdirectory(simulation/rutherford) diff --git a/examples/MQ/pixelDetector/run/runMQSim.cxx b/examples/MQ/pixelDetector/run/runMQSim.cxx index 24d09ff840..84a04a0dd1 100644 --- a/examples/MQ/pixelDetector/run/runMQSim.cxx +++ b/examples/MQ/pixelDetector/run/runMQSim.cxx @@ -56,7 +56,7 @@ FairMQDevicePtr getDevice(const FairMQProgOptions& config) // TString outputfilename = Form("outputfile_%d.root",(int)(getpid())); // FairRootFileSink* sink = new FairRootFileSink(outputfilename); FairOnlineSink* sink = new FairOnlineSink(); - sink->SetMQSimDevice(run); + sink->SetMQRunDevice(run); run->SetSink(sink); run->SetParamUpdateChannelName(config.GetValue("param-channel-name")); diff --git a/examples/MQ/pixelDetector/src/CMakeLists.txt b/examples/MQ/pixelDetector/src/CMakeLists.txt index beac85f5ba..f8a4c55226 100644 --- a/examples/MQ/pixelDetector/src/CMakeLists.txt +++ b/examples/MQ/pixelDetector/src/CMakeLists.txt @@ -42,6 +42,7 @@ devices/PixelFindHitsTask.cxx devices/FairMQPixelMerger.cxx devices/FairMQPixelFileSink.cxx devices/FairMQPixelFileSinkBin.cxx +devices/FairMQRunDevice.cxx devices/FairMQSimDevice.cxx FairOnlineSink.cxx ) @@ -57,6 +58,7 @@ devices/FairMQPixelTaskProcessor.h devices/FairMQPixelTaskProcessor.tpl devices/FairMQPixelTaskProcessorBin.h devices/FairMQPixelTaskProcessorBin.tpl +devices/FairMQRunDevice.h devices/FairMQSimDevice.h FairOnlineSink.h ) diff --git a/examples/MQ/pixelDetector/src/FairOnlineSink.cxx b/examples/MQ/pixelDetector/src/FairOnlineSink.cxx index dd4a13842e..76a102bbd1 100644 --- a/examples/MQ/pixelDetector/src/FairOnlineSink.cxx +++ b/examples/MQ/pixelDetector/src/FairOnlineSink.cxx @@ -18,7 +18,7 @@ #include "FairMQMessage.h" #include "FairMQProgOptions.h" -#include "FairMQSimDevice.h" +#include "FairMQRunDevice.h" #include "FairRootManager.h" #include "FairEventHeader.h" @@ -41,7 +41,7 @@ using namespace std; FairOnlineSink::FairOnlineSink() : FairSink() - , fMQSimDevice(NULL) + , fMQRunDevice(NULL) { } @@ -66,8 +66,8 @@ void FairOnlineSink::Fill() /// Fill the Root tree. LOG(DEBUG) << "called FairOnlineSink::Fill()!!!!"; - if ( fMQSimDevice ) - fMQSimDevice->SendBranches(); + if ( fMQRunDevice ) + fMQRunDevice->SendBranches(); } Bool_t FairOnlineSink::InitSink() diff --git a/examples/MQ/pixelDetector/src/FairOnlineSink.h b/examples/MQ/pixelDetector/src/FairOnlineSink.h index 231b2a0868..f1f9805842 100644 --- a/examples/MQ/pixelDetector/src/FairOnlineSink.h +++ b/examples/MQ/pixelDetector/src/FairOnlineSink.h @@ -21,7 +21,7 @@ #include "FairSink.h" class FairEventHeader; -class FairMQSimDevice; +class FairMQRunDevice; class FairOnlineSink : public FairSink { @@ -52,10 +52,10 @@ class FairOnlineSink : public FairSink virtual void WriteObject(TObject* /* f */, const char*, Int_t /* option = 0 */) {} virtual void WriteGeometry() {} - virtual void SetMQSimDevice(FairMQSimDevice* mrs) { fMQSimDevice = mrs;} + virtual void SetMQRunDevice(FairMQRunDevice* mrs) { fMQRunDevice = mrs;} private: - FairMQSimDevice* fMQSimDevice; + FairMQRunDevice* fMQRunDevice; FairOnlineSink(const FairOnlineSink&); FairOnlineSink& operator=(const FairOnlineSink&); diff --git a/examples/MQ/pixelDetector/src/devices/FairMQRunDevice.cxx b/examples/MQ/pixelDetector/src/devices/FairMQRunDevice.cxx new file mode 100644 index 0000000000..6e3885a6d8 --- /dev/null +++ b/examples/MQ/pixelDetector/src/devices/FairMQRunDevice.cxx @@ -0,0 +1,109 @@ +/******************************************************************************** + * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * + * * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence version 3 (LGPL) version 3, * + * copied verbatim in the file "LICENSE" * + ********************************************************************************/ +/** + * FairMQRunDevice.cxx + * + * @since 2017.10.24 + * @author R. Karabowicz + */ + +#include "FairMQRunDevice.h" + +#include "FairMQLogger.h" +#include "FairMQMessage.h" +#include "FairMQProgOptions.h" + +#include "FairOnlineSink.h" + +#include "FairMCEventHeader.h" +#include "FairRootManager.h" +#include "FairRunSim.h" +#include "FairRuntimeDb.h" + +#include "FairEventHeader.h" +#include "FairModule.h" +#include "FairPrimaryGenerator.h" +#include "FairParRootFileIo.h" +#include "FairParSet.h" + +#include "TROOT.h" +#include "TRint.h" +#include "TVirtualMC.h" +#include "TVirtualMCApplication.h" +#include "TList.h" +#include "TObjString.h" +#include "TObjArray.h" +#include "TMessage.h" + +using namespace std; + +FairMQRunDevice::FairMQRunDevice() + : FairMQDevice() +{ +} + +void FairMQRunDevice::SendObject(TObject* obj, std::string chan) { + TMessage* tmsg = new TMessage(kMESS_OBJECT); + tmsg->WriteObject(obj); + + FairMQMessagePtr mess(NewMessage(tmsg->Buffer(), + tmsg->BufferSize(), + [](void* /*data*/, void* object){ delete static_cast(object); }, + tmsg)); + std::unique_ptr rep(NewMessage()); + + printf ("sending %s",obj->GetName()); + if (Send(mess, chan) > 0) + { + if (Receive(rep, chan) > 0) + { + std::string repString = string(static_cast(rep->GetData()), rep->GetSize()); + LOG(INFO) << " -> " << repString.data(); + } + } +} + +FairMQRunDevice::~FairMQRunDevice() +{ +} + +void FairMQRunDevice::SendBranches() +{ + /// Fill the Root tree. + LOG(DEBUG) << "called FairMQRunDevice::SendBranches()!!!!"; + + TList* branchNameList = FairRootManager::Instance()->GetBranchNameList(); + TObjString* ObjStr; + + for (auto& mi : fChannels) + { + LOG(DEBUG) << "trying channel >" << mi.first.data() << "<"; + + FairMQParts parts; + + for(Int_t t=0; tGetEntries(); t++) + { + ObjStr= static_cast(branchNameList->TList::At(t)); + LOG(DEBUG) << " branch >" << ObjStr->GetString().Data() << "<"; + std::string modifiedBranchName = std::string("#") + ObjStr->GetString().Data() + "#"; + if ( mi.first.find(modifiedBranchName) != std::string::npos || mi.first.find("#all#") != std::string::npos ) + { + TObject* object = (FairRootManager::Instance()->GetObject(ObjStr->GetString()))->Clone(); + TMessage* message = new TMessage(kMESS_OBJECT); + message->WriteObject(object); + parts.AddPart(NewMessage(message->Buffer(), + message->BufferSize(), + [](void* /*data*/, void* hint) { delete (TMessage*)hint;}, + message)); + LOG(DEBUG) << "channel >" << mi.first.data() << "< --> >" << ObjStr->GetString().Data() << "<"; + } + } + if ( parts.Size() > 0 ) + Send(parts,mi.first.data()); + } +} diff --git a/examples/MQ/pixelDetector/src/devices/FairMQRunDevice.h b/examples/MQ/pixelDetector/src/devices/FairMQRunDevice.h new file mode 100644 index 0000000000..d4641d05c8 --- /dev/null +++ b/examples/MQ/pixelDetector/src/devices/FairMQRunDevice.h @@ -0,0 +1,45 @@ +/******************************************************************************** + * Copyright (C) 2017 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * + * * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence version 3 (LGPL) version 3, * + * copied verbatim in the file "LICENSE" * + ********************************************************************************/ + +/** + * FairMQRunDevice.h + * + * @since 2018-02-01 + * @author R. Karabowicz + */ + +#ifndef FAIRMQRUNDEVICE_H_ +#define FAIRMQRUNDEVICE_H_ + +#include +#include "TString.h" + +#include "FairMQDevice.h" + +class TObject; +class TObjArray; +class FairSink; + +class FairMQRunDevice : public FairMQDevice +{ + public: + FairMQRunDevice(); + virtual ~FairMQRunDevice(); + + virtual void SendBranches(); + + protected: + void SendObject(TObject* obj, std::string chan); + + private: + + FairMQRunDevice(const FairMQRunDevice&); + FairMQRunDevice& operator=(const FairMQRunDevice&); +}; + +#endif /* FAIRMQRUNDEVICE_H_ */ diff --git a/examples/MQ/pixelDetector/src/devices/FairMQSimDevice.cxx b/examples/MQ/pixelDetector/src/devices/FairMQSimDevice.cxx index 6b56078800..29dcb2d14d 100644 --- a/examples/MQ/pixelDetector/src/devices/FairMQSimDevice.cxx +++ b/examples/MQ/pixelDetector/src/devices/FairMQSimDevice.cxx @@ -43,7 +43,7 @@ using namespace std; FairMQSimDevice::FairMQSimDevice() - : FairMQDevice() + : FairMQRunDevice() , fSimDeviceId(0) , fUpdateChannelName("updateChannel") , fRunSim(NULL) @@ -174,27 +174,19 @@ void FairMQSimDevice::UpdateParameterServer() { std::string ridString = std::string("RUNID") + std::to_string(fRunSim->GetRunId()) + std::string("RUNID") + std::string(cont->getDescription()); cont->setDescription(ridString.data()); - SendObject(cont,fUpdateChannelName); + FairMQRunDevice::SendObject(cont,fUpdateChannelName); } printf("FairMQSimDevice::UpdateParameterServer() finished\n"); } -void FairMQSimDevice::SendObject(TObject* obj, std::string chan) { - FairMQMessagePtr mess(NewMessage()); - Serialize(*mess,obj); - - std::unique_ptr rep(NewMessage()); - - printf ("sending %s",obj->GetName()); - if (Send(mess, chan) > 0) +void FairMQSimDevice::SendBranches() +{ + if ( !CheckCurrentState(RUNNING) ) { - if (Receive(rep, chan) > 0) - { - std::string repString = string(static_cast(rep->GetData()), rep->GetSize()); - LOG(INFO) << " -> " << repString.data(); - } + fRunSim->StopMCRun(); } + FairMQRunDevice::SendBranches(); } void FairMQSimDevice::PostRun() @@ -204,40 +196,3 @@ void FairMQSimDevice::PostRun() FairMQSimDevice::~FairMQSimDevice() { } - -void FairMQSimDevice::SendBranches() -{ - /// Fill the Root tree. - LOG(DEBUG) << "called FairMQSimDevice::SendBranches()!!!!"; - if ( !CheckCurrentState(RUNNING) ) - { - fRunSim->StopMCRun(); - } - - TList* branchNameList = FairRootManager::Instance()->GetBranchNameList(); - TObjString* ObjStr; - - for (auto& mi : fChannels) - { - LOG(DEBUG) << "trying channel >" << mi.first.data() << "<"; - - FairMQParts parts; - - for(Int_t t=0; tGetEntries(); t++) - { - ObjStr= static_cast(branchNameList->TList::At(t)); - LOG(DEBUG) << " branch >" << ObjStr->GetString().Data() << "<"; - std::string modifiedBranchName = std::string("#") + ObjStr->GetString().Data() + "#"; - if ( mi.first.find(modifiedBranchName) != std::string::npos || mi.first.find("#all#") != std::string::npos ) - { - TObject* object = (FairRootManager::Instance()->GetObject(ObjStr->GetString()))->Clone(); - FairMQMessagePtr mess(NewMessage()); - Serialize(*mess,object); - parts.AddPart(std::move(mess)); - LOG(DEBUG) << "channel >" << mi.first.data() << "< --> >" << ObjStr->GetString().Data() << "<"; - } - } - if ( parts.Size() > 0 ) - Send(parts,mi.first.data()); - } -} diff --git a/examples/MQ/pixelDetector/src/devices/FairMQSimDevice.h b/examples/MQ/pixelDetector/src/devices/FairMQSimDevice.h index 7a92e62b88..d342bebc91 100644 --- a/examples/MQ/pixelDetector/src/devices/FairMQSimDevice.h +++ b/examples/MQ/pixelDetector/src/devices/FairMQSimDevice.h @@ -19,7 +19,7 @@ #include #include "TString.h" -#include "FairMQDevice.h" +#include "FairMQRunDevice.h" class FairEventHeader; class FairRunSim; @@ -30,13 +30,13 @@ class TObject; class TObjArray; class FairSink; -class FairMQSimDevice : public FairMQDevice +class FairMQSimDevice : public FairMQRunDevice { public: FairMQSimDevice(); virtual ~FairMQSimDevice(); - virtual void SendBranches(); + virtual void SetParamUpdateChannelName(TString tString) { fUpdateChannelName = tString; } // ------ FairRunSim setters ------ void SetNofEvents (int64_t nofev) { fNofEvents = nofev;}; @@ -54,7 +54,7 @@ class FairMQSimDevice : public FairMQDevice void SetSink (FairSink* sink) { fSink = sink;} // ------ ---------- -------- ------ - void SetParamUpdateChannelName(TString tString) { fUpdateChannelName = tString; } + virtual void SendBranches(); protected: virtual void InitTask(); @@ -84,7 +84,6 @@ class FairMQSimDevice : public FairMQDevice // ------ ---------- -------- ------ void UpdateParameterServer(); - void SendObject(TObject* obj, std::string chan); FairMQSimDevice(const FairMQSimDevice&); FairMQSimDevice& operator=(const FairMQSimDevice&); diff --git a/examples/MQ/simulation_split/CMakeLists.txt b/examples/MQ/simulation_split/CMakeLists.txt new file mode 100644 index 0000000000..2f93a01975 --- /dev/null +++ b/examples/MQ/simulation_split/CMakeLists.txt @@ -0,0 +1,9 @@ + ################################################################################ + # Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # + # # + # This software is distributed under the terms of the # + # GNU Lesser General Public Licence (LGPL) version 3, # + # copied verbatim in the file "LICENSE" # + ################################################################################ +Add_Subdirectory(devices) +Add_Subdirectory(run) diff --git a/examples/MQ/simulation_split/devices/CMakeLists.txt b/examples/MQ/simulation_split/devices/CMakeLists.txt new file mode 100644 index 0000000000..729011003e --- /dev/null +++ b/examples/MQ/simulation_split/devices/CMakeLists.txt @@ -0,0 +1,68 @@ + ################################################################################ + # Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # + # # + # This software is distributed under the terms of the # + # GNU Lesser General Public Licence (LGPL) version 3, # + # copied verbatim in the file "LICENSE" # + ################################################################################ +# Create a library called "libPixel" which includes the source files given in +# the array . +# The extension is already found. Any number of sources could be listed here. + +set(INCLUDE_DIRECTORIES + ${BASE_INCLUDE_DIRECTORIES} + ${FairMQ_INCDIR}/fairmq/options + ${CMAKE_SOURCE_DIR}/base/MQ/policies/Serialization + ${CMAKE_SOURCE_DIR}/examples/common/mcstack + ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/devices + ${CMAKE_SOURCE_DIR}/examples/MQ/pixelDetector/src + ${CMAKE_SOURCE_DIR}/examples/MQ/pixelDetector/src/devices + ${FairLogger_INCDIR} +) + + +Set(SYSTEM_INCLUDE_DIRECTORIES + ${SYSTEM_INCLUDE_DIRECTORIES} + ${ZeroMQ_INCLUDE_DIR} +) + +include_directories( ${INCLUDE_DIRECTORIES}) +Include_Directories(SYSTEM ${SYSTEM_INCLUDE_DIRECTORIES}) + +set(LINK_DIRECTORIES +${ROOT_LIBRARY_DIR} +${Boost_LIBRARY_DIRS} +) + +link_directories( ${LINK_DIRECTORIES}) + +Set(NO_DICT_SRCS +FairMQPrimaryGeneratorDevice.cxx +FairMQTransportDevice.cxx +) + +Set(NO_DICT_HEADERS +FairMQPrimaryGeneratorDevice.h +FairMQTransportDevice.h +) + +Set(LIBRARY_NAME SimMQ) +Set(DEPENDENCIES + Base + GeoBase + ParBase + MCStack + FairMQ::FairMQ + BaseMQ + Gen + Passive + Pixel + ${Boost_THREAD_LIBRARY} + ${Boost_SYSTEM_LIBRARY} + ${Boost_SERIALIZATION_LIBRARY} + ${Boost_PROGRAM_OPTIONS_LIBRARY} +) + +GENERATE_LIBRARY() + +Install(FILES ${NO_DICT_HEADERS} DESTINATION include) diff --git a/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.cxx b/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.cxx new file mode 100644 index 0000000000..1ee89762ba --- /dev/null +++ b/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.cxx @@ -0,0 +1,120 @@ +/******************************************************************************** + * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * + * * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence version 3 (LGPL) version 3, * + * copied verbatim in the file "LICENSE" * + ********************************************************************************/ +/** + * FairMQPrimaryGeneratorDevice.cxx + * + * @since 2017.10.24 + * @author R. Karabowicz + */ + +#include "FairMQPrimaryGeneratorDevice.h" + +#include "FairMQLogger.h" +#include "FairMQMessage.h" +#include "FairMQProgOptions.h" + +#include "FairMCEventHeader.h" +#include "FairRootManager.h" +#include "FairRunSim.h" +#include "FairRuntimeDb.h" + +#include "FairEventHeader.h" +#include "FairModule.h" +#include "FairPrimaryGenerator.h" +#include "FairParRootFileIo.h" +#include "FairParSet.h" +#include "FairStack.h" + + +#include "TROOT.h" +#include "TRint.h" +#include "TVirtualMC.h" +#include "TVirtualMCApplication.h" +#include "TList.h" +#include "TObjString.h" +#include "TObjArray.h" +#include "TMessage.h" + +using namespace std; + +// special class to expose protected TMessage constructor +class SimMQTMessage : public TMessage +{ + public: + SimMQTMessage(void* buf, Int_t len) + : TMessage(buf, len) + { + ResetBit(kIsOwner); + } +}; + +FairMQPrimaryGeneratorDevice::FairMQPrimaryGeneratorDevice() + : FairMQDevice() + , fGeneratorChannelName("simout") + , fEventCounter(0) + , fNofEvents(10) + , fPrimaryGenerator(NULL) + , fMCEventHeader(NULL) + , fStack(NULL) +{ +} + +void FairMQPrimaryGeneratorDevice::InitTask() +{ + fStack = new FairStack(); + fMCEventHeader = new FairMCEventHeader(); + fPrimaryGenerator->SetEvent(fMCEventHeader); + fPrimaryGenerator->Init(); +} + +void FairMQPrimaryGeneratorDevice::PreRun() +{ +} + +bool FairMQPrimaryGeneratorDevice::ConditionalRun() +{ + fStack->Reset(); + fPrimaryGenerator->GenerateEvent(fStack); + + TClonesArray* prims = fStack->GetListOfParticles(); + + TMessage* tmsg = new TMessage(kMESS_OBJECT); + tmsg->WriteObject(prims); + + FairMQMessagePtr mess(NewMessage(tmsg->Buffer(), + tmsg->BufferSize(), + [](void* /*data*/, void* object){ delete static_cast(object); }, + tmsg)); + std::unique_ptr rep(NewMessage()); + + if (Send(mess, fGeneratorChannelName) > 0) + { + } + + int numberofparts = (int)prims->GetEntries(); + + fEventCounter++; + + if ( fEventCounter >= fNofEvents ) + return false; + + return true; +} + + +void FairMQPrimaryGeneratorDevice::PostRun() +{ +} + +FairMQPrimaryGeneratorDevice::~FairMQPrimaryGeneratorDevice() +{ +} + +void FairMQPrimaryGeneratorDevice::SendPrimaries() +{ +} diff --git a/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.h b/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.h new file mode 100644 index 0000000000..7fca10f5ea --- /dev/null +++ b/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.h @@ -0,0 +1,66 @@ +/******************************************************************************** + * Copyright (C) 2017 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * + * * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence version 3 (LGPL) version 3, * + * copied verbatim in the file "LICENSE" * + ********************************************************************************/ + +/** + * FairMQPrimaryGeneratorDevice.h + * + * @since 2018-08-31 + * @author R. Karabowicz + */ + +#ifndef FAIRMQPRIMARYGENERATORDEVICE_H_ +#define FAIRMQPRIMARYGENERATORDEVICE_H_ + +#include +#include "TString.h" + +#include "FairMQDevice.h" + +class FairMCEventHeader; +class FairRunSim; +class FairField; +class FairParIo; +class FairPrimaryGenerator; +class TObject; +class TObjArray; +class FairSink; +class FairStack; + +class FairMQPrimaryGeneratorDevice : public FairMQDevice +{ + public: + FairMQPrimaryGeneratorDevice(); + virtual ~FairMQPrimaryGeneratorDevice(); + + virtual void SendPrimaries(); + + void SetNofEvents (int64_t nofev) { fNofEvents = nofev;}; + void SetGenerator (FairPrimaryGenerator* primGen) { fPrimaryGenerator = primGen;}; + + protected: + virtual void InitTask(); + virtual void PreRun(); + virtual void PostRun(); + virtual bool ConditionalRun(); + + private: + std::string fGeneratorChannelName; + + FairPrimaryGenerator* fPrimaryGenerator; + FairMCEventHeader* fMCEventHeader; + FairStack* fStack; + int64_t fNofEvents; + int64_t fEventCounter; + + void SendObject(TObject* obj, std::string chan); + + FairMQPrimaryGeneratorDevice(const FairMQPrimaryGeneratorDevice&); + FairMQPrimaryGeneratorDevice& operator=(const FairMQPrimaryGeneratorDevice&); +}; + +#endif /* FAIRMQPRIMARYGENERATORDEVICE_H_ */ diff --git a/examples/MQ/simulation_split/devices/FairMQTransportDevice.cxx b/examples/MQ/simulation_split/devices/FairMQTransportDevice.cxx new file mode 100644 index 0000000000..23278badd5 --- /dev/null +++ b/examples/MQ/simulation_split/devices/FairMQTransportDevice.cxx @@ -0,0 +1,210 @@ +/******************************************************************************** + * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * + * * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence version 3 (LGPL) version 3, * + * copied verbatim in the file "LICENSE" * + ********************************************************************************/ +/** + * FairMQTransportDevice.cxx + * + * @since 2017.10.24 + * @author R. Karabowicz + */ + +#include "FairMQTransportDevice.h" + +#include "FairMQLogger.h" +#include "FairMQMessage.h" +#include "FairMQProgOptions.h" + +#include "FairOnlineSink.h" + +#include "FairMCEventHeader.h" +#include "FairRootManager.h" +#include "FairRunSim.h" +#include "FairRuntimeDb.h" + +#include "FairGenericStack.h" +#include "FairMCApplication.h" + +#include "FairEventHeader.h" +#include "FairModule.h" +#include "FairParRootFileIo.h" +#include "FairParSet.h" + +#include "TClonesArray.h" +#include "TROOT.h" +#include "TRint.h" +#include "TVirtualMC.h" +#include "TVirtualMCApplication.h" +#include "TList.h" +#include "TObjString.h" +#include "TObjArray.h" +#include "TMessage.h" + +using namespace std; + +// special class to expose protected TMessage constructor +class TransTMessage : public TMessage +{ + public: + TransTMessage(void* buf, Int_t len) + : TMessage(buf, len) + { + ResetBit(kIsOwner); + } +}; + +FairMQTransportDevice::FairMQTransportDevice() + : FairMQRunDevice() + , fTransportDeviceId(0) + , fGeneratorChannelName("simIn") + , fRunSim(NULL) + , fNofEvents(1) + , fTransportName("TGeant3") + , fMaterialsFile("") + , fMagneticField(NULL) + , fDetectorArray(NULL) + , fStoreTrajFlag(false) + , fTaskArray(NULL) + , fFirstParameter(NULL) + , fSecondParameter(NULL) + , fSink(NULL) + , fVMC(NULL) + , fStack(NULL) + , fMCApplication(NULL) +{ +} + +void FairMQTransportDevice::Init() +{ + OnData(fGeneratorChannelName, &FairMQTransportDevice::TransportData); +} + +void FairMQTransportDevice::InitTask() +{ + fRunSim = new FairRunSim(); + + fRunSim->SetSink(fSink); + + if ( fFirstParameter || fSecondParameter ) { + FairRuntimeDb *rtdb=fRunSim->GetRuntimeDb(); + if ( fFirstParameter ) + rtdb->setFirstInput(fFirstParameter); + if ( fSecondParameter ) + rtdb->setSecondInput(fSecondParameter); + } + + fRunSim->SetName(fTransportName.data()); + + if ( fUserConfig.Length() > 0 ) + fRunSim->SetUserConfig(fUserConfig); + if ( fUserCuts.Length() > 0 ) + fRunSim->SetUserCuts(fUserCuts); + // ------------------------------------------------------------------------ + + // ----- Create media ------------------------------------------------- + fRunSim->SetMaterials(fMaterialsFile.data()); + // ------------------------------------------------------------------------ + + // ----- Magnetic field ------------------------------------------- + if ( fMagneticField ) + fRunSim->SetField(fMagneticField); + // -------------------------------------------------------------------- + + // ----- Create geometry ---------------------------------------------- + for ( int idet = 0 ; idet < fDetectorArray->GetEntries() ; idet++ ) { + fRunSim->AddModule((FairModule*)(fDetectorArray->At(idet))); + } + // ------------------------------------------------------------------------ + + // ----- Negotiate the run number ------------------------------------- + // ----- via the fUpdateChannelName -------------------------------- + // ----- ask the fParamMQServer ------------------------------------ + // ----- receive the run number and sampler id --------------------- + std::string* askForRunNumber = new string("ReportSimDevice"); + FairMQMessagePtr req(NewMessage(const_cast(askForRunNumber->c_str()), + askForRunNumber->length(), + [](void* /*data*/, void* object) { delete static_cast(object); }, + askForRunNumber)); + std::unique_ptr rep(NewMessage()); + + unsigned int runId = 0; + if (Send(req, fUpdateChannelName) > 0) + { + if (Receive(rep, fUpdateChannelName) > 0) + { + std::string repString = string(static_cast(rep->GetData()), rep->GetSize()); + LOG(INFO) << " -> " << repString.data(); + runId = stoi(repString); + repString = repString.substr(repString.find_first_of('_')+1,repString.length()); + fTransportDeviceId = stoi(repString); + LOG(INFO) << "runId = " << runId << " /// fTransportDeviceId = " << fTransportDeviceId; + } + } + // ------------------------------------------------------------------------ + + fRunSim->SetStoreTraj(fStoreTrajFlag); + + // ----- Set tasks ---------------------------------------------------- + if ( fTaskArray ) { + for ( int itask = 0 ; itask < fTaskArray->GetEntries() ; itask++ ) { + fRunSim->AddTask((FairTask*)(fTaskArray->At(itask))); + } + } + // ------------------------------------------------------------------------ + + // ----- Initialize simulation run ------------------------------------ + fRunSim->SetRunId(runId); // run n simulations with same run id - offset the event number + fRunSim->Init(); + // ------------------------------------------------------------------------ + + fVMC = TVirtualMC::GetMC(); + fMCApplication = FairMCApplication::Instance(); + fStack = fMCApplication->GetStack(); + fStack->Register(); + // fRunSim->Run(0); +} + +void FairMQTransportDevice::PreRun() +{ +} + +bool FairMQTransportDevice::TransportData(FairMQMessagePtr& mPtr, int /*index*/) +{ + auto message = new TransTMessage(mPtr->GetData(), mPtr->GetSize()); + auto chunk = static_cast(message->ReadObjectAny(message->GetClass())); + + fStack->SetParticleArray(chunk); + fVMC->ProcessRun(1); + + return true; +} + +void FairMQTransportDevice::UpdateParameterServer() +{ + FairRuntimeDb* rtdb = fRunSim->GetRuntimeDb(); + + printf("FairMQTransportDevice::UpdateParameterServer() (%d containers)\n",rtdb->getListOfContainers()->GetEntries()); + + // send the parameters to be saved + TIter next(rtdb->getListOfContainers()); + FairParSet* cont; + while ((cont=static_cast(next()))) + { + std::string ridString = std::string("RUNID") + std::to_string(fRunSim->GetRunId()) + std::string("RUNID") + std::string(cont->getDescription()); + cont->setDescription(ridString.data()); + SendObject(cont,fUpdateChannelName); + } + + printf("FairMQTransportDevice::UpdateParameterServer() finished\n"); +} + +void FairMQTransportDevice::PostRun() +{ +} + +FairMQTransportDevice::~FairMQTransportDevice() +{ +} diff --git a/examples/MQ/simulation_split/devices/FairMQTransportDevice.h b/examples/MQ/simulation_split/devices/FairMQTransportDevice.h new file mode 100644 index 0000000000..e1f65ddafd --- /dev/null +++ b/examples/MQ/simulation_split/devices/FairMQTransportDevice.h @@ -0,0 +1,97 @@ +/******************************************************************************** + * Copyright (C) 2017 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * + * * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence version 3 (LGPL) version 3, * + * copied verbatim in the file "LICENSE" * + ********************************************************************************/ + +/** + * FairMQTransportDevice.h + * + * @since 2018-02-01 + * @author R. Karabowicz + */ + +#ifndef FAIRMQTRANSPORTDEVICE_H_ +#define FAIRMQTRANSPORTDEVICE_H_ + +#include +#include "TString.h" + +#include "FairMQRunDevice.h" + +class FairEventHeader; +class FairRunSim; +class FairField; +class FairParIo; +class FairPrimaryGenerator; +class TObject; +class TObjArray; +class FairSink; +class FairMCApplication; +class FairGenericStack; +class TVirtualMC; + +class FairMQTransportDevice : public FairMQRunDevice +{ + public: + FairMQTransportDevice(); + virtual ~FairMQTransportDevice(); + + // ------ FairRunSim setters ------ + void SetNofEvents (int64_t nofev) { fNofEvents = nofev;}; + void SetTransportName (std::string str) { fTransportName = str;}; + void SetMaterials (std::string str) { fMaterialsFile = str;}; + void SetMagneticField (FairField* field) { fMagneticField = field;}; + void SetDetectorArray (TObjArray* array) { fDetectorArray = array;}; + void SetStoreTraj (bool flag=true) { fStoreTrajFlag = flag;}; + void SetTaskArray (TObjArray* array) { fTaskArray = array;}; + void SetFirstParameter (FairParIo* par) { fFirstParameter = par;}; + void SetSecondParameter (FairParIo* par) { fSecondParameter = par;}; + void SetUserConfig (const TString& Config) { fUserConfig = Config;} + void SetUserCuts (const TString& Cuts) { fUserCuts = Cuts;} + void SetSink (FairSink* sink) { fSink = sink;} + // ------ ---------- -------- ------ + + void SetParamUpdateChannelName(TString tString) { fUpdateChannelName = tString; } + + protected: + // bool TransportData(FairMQParts&, int); + bool TransportData(FairMQMessagePtr&, int); + virtual void Init(); + virtual void InitTask(); + virtual void PreRun(); + virtual void PostRun(); + + private: + UInt_t fTransportDeviceId; + std::string fGeneratorChannelName; + std::string fUpdateChannelName; + + TVirtualMC* fVMC; + FairGenericStack* fStack; + FairMCApplication* fMCApplication; + FairRunSim* fRunSim; + // ------ FairRunSim settings ------ + int64_t fNofEvents; + std::string fTransportName; + std::string fMaterialsFile; + FairField* fMagneticField; + TObjArray* fDetectorArray; + bool fStoreTrajFlag; + TObjArray* fTaskArray; + FairParIo* fFirstParameter; // first (prefered) input for parameters + FairParIo* fSecondParameter; // second input (used if not found in first input) + TString fUserConfig; //! /** Macro for geant configuration*/ + TString fUserCuts; //! /** Macro for geant cuts*/ + FairSink* fSink; + // ------ ---------- -------- ------ + + void UpdateParameterServer(); + + FairMQTransportDevice(const FairMQTransportDevice&); + FairMQTransportDevice& operator=(const FairMQTransportDevice&); +}; + +#endif /* FAIRMQTRANSPORTDEVICE_H_ */ diff --git a/examples/MQ/simulation_split/run/CMakeLists.txt b/examples/MQ/simulation_split/run/CMakeLists.txt new file mode 100644 index 0000000000..d51c3b61e8 --- /dev/null +++ b/examples/MQ/simulation_split/run/CMakeLists.txt @@ -0,0 +1,71 @@ + ################################################################################ + # Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # + # # + # This software is distributed under the terms of the # + # GNU Lesser General Public Licence (LGPL) version 3, # + # copied verbatim in the file "LICENSE" # + ################################################################################ + +Set(MaxTestTime 60) + +set(INCLUDE_DIRECTORIES + ${BASE_INCLUDE_DIRECTORIES} + ${CMAKE_SOURCE_DIR}/base/MQ/policies/Sampler + ${CMAKE_SOURCE_DIR}/base/MQ/policies/Serialization + ${CMAKE_SOURCE_DIR}/base/MQ/policies/Storage + ${CMAKE_SOURCE_DIR}/base/MQ/baseMQtools + ${CMAKE_SOURCE_DIR}/generators + ${CMAKE_SOURCE_DIR}/examples/common/passive + ${CMAKE_SOURCE_DIR}/examples/MQ/pixelDetector + ${CMAKE_SOURCE_DIR}/examples/MQ/pixelDetector/src + ${CMAKE_SOURCE_DIR}/examples/MQ/pixelDetector/src/devices + ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/devices +) + +Set(SYSTEM_INCLUDE_DIRECTORIES + ${SYSTEM_INCLUDE_DIRECTORIES} + ${ZeroMQ_INCLUDE_DIR} +) + +include_directories(${INCLUDE_DIRECTORIES}) +include_directories(SYSTEM ${SYSTEM_INCLUDE_DIRECTORIES}) + +set(NETWORK_INTERFACE eth0) +If(APPLE) + set(NETWORK_INTERFACE lo0) +EndIf(APPLE) + +set(LINK_DIRECTORIES + ${ROOT_LIBRARY_DIR} + ${Boost_LIBRARY_DIRS} +) + +link_directories(${LINK_DIRECTORIES}) + + +Set(Exe_Names + runMQGen + runMQTrans +) + +set(Exe_Source + runMQGen.cxx + runMQTrans.cxx +) + + +List(LENGTH Exe_Names _length) +Math(EXPR _length ${_length}-1) + + +set(BIN_DESTINATION share/fairbase/examples/MQ/simulation-split/bin) +set(EXECUTABLE_OUTPUT_PATH "${EXECUTABLE_OUTPUT_PATH}/examples/MQ/simulation-split") + +ForEach(_file RANGE 0 ${_length}) + List(GET Exe_Names ${_file} _name) + List(GET Exe_Source ${_file} _src) + Set(EXE_NAME ${_name}) + Set(SRCS ${_src}) + Set(DEPENDENCIES Pixel SimMQ) + GENERATE_EXECUTABLE() +EndForEach(_file RANGE 0 ${_length}) diff --git a/examples/MQ/simulation_split/run/runMQGen.cxx b/examples/MQ/simulation_split/run/runMQGen.cxx new file mode 100644 index 0000000000..f775b7cdbe --- /dev/null +++ b/examples/MQ/simulation_split/run/runMQGen.cxx @@ -0,0 +1,54 @@ +#include "runFairMQDevice.h" + +// MQRunSim +#include "FairPrimaryGenerator.h" +#include "FairBoxGenerator.h" +#include "FairMQPrimaryGeneratorDevice.h" + +#include "TRandom.h" +#include "TRint.h" +#include "TROOT.h" +#include "TSystem.h" +#include "TVirtualMC.h" +#include "TVirtualMCApplication.h" + +namespace bpo = boost::program_options; + +void addCustomOptions(bpo::options_description& options) +{ + options.add_options() + ("random-seed", bpo::value ()->default_value(0) , "Random seed number") + ("nof-events", bpo::value ()->required() , "Number of events to simulate") + ; +} + +FairMQDevicePtr getDevice(const FairMQProgOptions& config) +{ + gRandom->SetSeed(config.GetValue ("random-seed")); + + TString dir = getenv("VMCWORKDIR"); + TString tutdir = dir + "/MQ/pixelDetector"; + + TString tut_configdir = config.GetValue("fairroot-config-dir"); + if ( tut_configdir.Length() < 1 ) + tut_configdir = dir + "/common/gconfig"; + gSystem->Setenv("CONFIG_DIR",tut_configdir.Data()); + + TString partName[] = {"pions","eplus","proton"}; + Int_t partPdgC[] = { 211, 11, 2212}; + Int_t chosenPart = 0; + + FairPrimaryGenerator* primGen = new FairPrimaryGenerator(); + FairBoxGenerator* boxGen = new FairBoxGenerator(partPdgC[chosenPart], 100); + boxGen->SetPRange(1,2); + boxGen->SetThetaRange(0,180); + boxGen->SetPhiRange(0,360); + primGen->AddGenerator(boxGen); + + FairMQPrimaryGeneratorDevice* mqDevice = new FairMQPrimaryGeneratorDevice(); + LOG(INFO) << "Going to generate " << config.GetValue ("nof-events") << " events!!"; + mqDevice->SetNofEvents(config.GetValue ("nof-events")); + mqDevice->SetGenerator(primGen); + + return mqDevice; +} diff --git a/examples/MQ/simulation_split/run/runMQSim.cxx b/examples/MQ/simulation_split/run/runMQSim.cxx new file mode 100644 index 0000000000..6694f3c3d2 --- /dev/null +++ b/examples/MQ/simulation_split/run/runMQSim.cxx @@ -0,0 +1,53 @@ +#include "runFairMQDevice.h" + +// MQRunSim +#include "FairPrimaryGenerator.h" +#include "FairBoxGenerator.h" +#include "FairMQPrimaryGeneratorDevice.h" + +#include "TRandom.h" +#include "TRint.h" +#include "TROOT.h" +#include "TSystem.h" +#include "TVirtualMC.h" +#include "TVirtualMCApplication.h" + +namespace bpo = boost::program_options; + +void addCustomOptions(bpo::options_description& options) +{ + options.add_options() + ("random-seed", bpo::value ()->default_value(0) , "Random seed number") + ("nof-events", bpo::value ()->required() , "Number of events to simulate") + ; +} + +FairMQDevicePtr getDevice(const FairMQProgOptions& config) +{ + LOG(INFO) << "WHAT THE HELL?"; + gRandom->SetSeed(config.GetValue ("random-seed")); + + TString dir = getenv("VMCWORKDIR"); + TString tutdir = dir + "/MQ/pixelDetector"; + + TString tut_configdir = config.GetValue("fairroot-config-dir"); + if ( tut_configdir.Length() < 1 ) + tut_configdir = dir + "/common/gconfig"; + gSystem->Setenv("CONFIG_DIR",tut_configdir.Data()); + + TString partName[] = {"pions","eplus","proton"}; + Int_t partPdgC[] = { 211, 11, 2212}; + Int_t chosenPart = 0; + + FairPrimaryGenerator* primGen = new FairPrimaryGenerator(); + FairBoxGenerator* boxGen = new FairBoxGenerator(partPdgC[chosenPart], 5); + boxGen->SetPRange(1,2); + boxGen->SetThetaRange(0,40); + boxGen->SetPhiRange(0,360); + primGen->AddGenerator(boxGen); + + FairMQPrimaryGeneratorDevice* mqDevice = new FairMQPrimaryGeneratorDevice(); + mqDevice->SetNofEvents(config.GetValue ("nof-events")); + mqDevice->SetGenerator(primGen); + return mqDevice; +} diff --git a/examples/MQ/simulation_split/run/runMQTrans.cxx b/examples/MQ/simulation_split/run/runMQTrans.cxx new file mode 100644 index 0000000000..9271dbaafe --- /dev/null +++ b/examples/MQ/simulation_split/run/runMQTrans.cxx @@ -0,0 +1,96 @@ +#include "runFairMQDevice.h" + +// MQRunSim +#include "FairMQTransportDevice.h" +#include "FairRuntimeDb.h" +#include "FairModule.h" +#include "FairCave.h" +#include "FairParRootFileIo.h" +#include "FairParAsciiFileIo.h" + +#include "Pixel.h" +#include "PixelDigitize.h" + +#include "FairOnlineSink.h" +//#include "FairRootFileSink.h" + +#include "TRandom.h" +#include "TRint.h" +#include "TROOT.h" +#include "TSystem.h" +#include "TVirtualMC.h" +#include "TVirtualMCApplication.h" + +namespace bpo = boost::program_options; + +void addCustomOptions(bpo::options_description& options) +{ + options.add_options() + ("random-seed", bpo::value ()->default_value(0) , "Random seed number") + ("transport-name", bpo::value()->default_value("TGeant3") , "Transport name") + ("fairroot-config-dir", bpo::value()->default_value("") , "FairRoot config dir") + ("param-channel-name", bpo::value()->default_value("updateChannel"), "Parameter update channel name") + ; +} + +FairMQDevicePtr getDevice(const FairMQProgOptions& config) +{ + gRandom->SetSeed(config.GetValue ("random-seed")); + + TString dir = getenv("VMCWORKDIR"); + TString tutdir = dir + "/MQ/pixelDetector"; + + TString tut_geomdir = dir + "/common/geometry"; + gSystem->Setenv("GEOMPATH",tut_geomdir.Data()); + + TString tut_configdir = config.GetValue("fairroot-config-dir"); + if ( tut_configdir.Length() < 1 ) + tut_configdir = dir + "/common/gconfig"; + gSystem->Setenv("CONFIG_DIR",tut_configdir.Data()); + + FairMQTransportDevice* run = new FairMQTransportDevice(); + + // TString outputfilename = Form("outputfile_%d.root",(int)(getpid())); + // FairRootFileSink* sink = new FairRootFileSink(outputfilename); + FairOnlineSink* sink = new FairOnlineSink(); + sink->SetMQRunDevice(run); + run->SetSink(sink); + + run->SetParamUpdateChannelName(config.GetValue("param-channel-name")); + + run->SetTransportName (config.GetValue("transport-name")); + run->SetMaterials ("media.geo"); + + TObjArray* detArray = new TObjArray(); + FairModule* cave= new FairCave("CAVE"); + cave->SetGeometryFileName("cave_vacuum.geo"); + detArray->Add(cave); + Pixel* det = new Pixel("PixelDetector", kTRUE); + det->SetGeometryFileName("pixel.geo"); + detArray->Add(det); + run->SetDetectorArray (detArray); + + TString partName[] = {"pions","eplus","proton"}; + Int_t partPdgC[] = { 211, 11, 2212}; + Int_t chosenPart = 0; + + run->SetStoreTraj (false); + + // --------------------------------------------------- + if ( 1==0 ) + { + // try to run digi task in the simulation device + TString digParFile = tutdir + "/param/pixel_digi.par"; + FairParAsciiFileIo* parIo1 = new FairParAsciiFileIo(); + parIo1->open(digParFile.Data(),"in"); + run->SetFirstParameter(parIo1); + + TObjArray* taskArray = new TObjArray(); + PixelDigitize* digiTask = new PixelDigitize(); + taskArray->Add(digiTask); + run->SetTaskArray(taskArray); + } + // --------------------------------------------------- + + return run; +} diff --git a/examples/common/mcstack/FairStack.h b/examples/common/mcstack/FairStack.h index c0d72d511a..216278ff99 100644 --- a/examples/common/mcstack/FairStack.h +++ b/examples/common/mcstack/FairStack.h @@ -48,8 +48,9 @@ #include // for stack #include // for pair +#include "TParticle.h" + class TClonesArray; -class TParticle; class TRefArray; class FairStack : public FairGenericStack @@ -202,6 +203,16 @@ class FairStack : public FairGenericStack TParticle* GetParticle(Int_t trackId) const; TClonesArray* GetListOfParticles() { return fParticles; } + void SetParticleArray(TClonesArray* partArray) { + for ( Int_t ipart = 0 ; ipart < partArray->GetEntries() ; ipart++ ) { + ((TParticle*)(partArray->At(ipart)))->SetUniqueID(fNPrimaries); + fStack.push((TParticle*)partArray->At(ipart)); + AddParticle((TParticle*)partArray->At(ipart)); + fNParticles++; + fNPrimaries++; + } + } + /** Clone this object (used in MT mode only) */ virtual FairGenericStack* CloneStack() const { return new FairStack(); } From cece980e8b639f3d138e00b122f7920c4fa75b85 Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Thu, 13 Sep 2018 10:06:32 +0200 Subject: [PATCH 02/27] examples/MQ/simulation_split Replaced usage of TMessage with RootSerializer. Added possibility to run in different regime: - generator pushes the data, transporter pulls the data (default); - transporter requests data, generator replies with the data (new). Added script to run the example in DDS. --- examples/MQ/simulation_split/CMakeLists.txt | 1 + .../devices/FairMQPrimaryGeneratorDevice.cxx | 42 ++- .../devices/FairMQPrimaryGeneratorDevice.h | 13 +- .../devices/FairMQTransportDevice.cxx | 243 +++++++++--------- .../devices/FairMQTransportDevice.h | 10 +- .../MQ/simulation_split/run/CMakeLists.txt | 4 +- examples/MQ/simulation_split/run/runMQGen.cxx | 69 ++--- examples/MQ/simulation_split/run/runMQSim.cxx | 53 ---- .../MQ/simulation_split/run/runMQTrans.cxx | 130 +++++----- .../simulation_split/scripts/CMakeLists.txt | 33 +++ .../scripts/dds-simulation-split.xml | 45 ++++ 11 files changed, 352 insertions(+), 291 deletions(-) delete mode 100644 examples/MQ/simulation_split/run/runMQSim.cxx create mode 100644 examples/MQ/simulation_split/scripts/CMakeLists.txt create mode 100644 examples/MQ/simulation_split/scripts/dds-simulation-split.xml diff --git a/examples/MQ/simulation_split/CMakeLists.txt b/examples/MQ/simulation_split/CMakeLists.txt index 2f93a01975..60d24db916 100644 --- a/examples/MQ/simulation_split/CMakeLists.txt +++ b/examples/MQ/simulation_split/CMakeLists.txt @@ -7,3 +7,4 @@ ################################################################################ Add_Subdirectory(devices) Add_Subdirectory(run) +Add_Subdirectory(scripts) diff --git a/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.cxx b/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.cxx index 1ee89762ba..c2bdc77311 100644 --- a/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.cxx +++ b/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.cxx @@ -30,6 +30,7 @@ #include "FairParSet.h" #include "FairStack.h" +#include "RootSerializer.h" #include "TROOT.h" #include "TRint.h" @@ -38,24 +39,13 @@ #include "TList.h" #include "TObjString.h" #include "TObjArray.h" -#include "TMessage.h" using namespace std; -// special class to expose protected TMessage constructor -class SimMQTMessage : public TMessage -{ - public: - SimMQTMessage(void* buf, Int_t len) - : TMessage(buf, len) - { - ResetBit(kIsOwner); - } -}; - FairMQPrimaryGeneratorDevice::FairMQPrimaryGeneratorDevice() : FairMQDevice() - , fGeneratorChannelName("simout") + , fRunConditional(true) + , fGeneratorChannelName("primariesChannel") , fEventCounter(0) , fNofEvents(10) , fPrimaryGenerator(NULL) @@ -70,6 +60,9 @@ void FairMQPrimaryGeneratorDevice::InitTask() fMCEventHeader = new FairMCEventHeader(); fPrimaryGenerator->SetEvent(fMCEventHeader); fPrimaryGenerator->Init(); + + if ( !fRunConditional ) + OnData(fGeneratorChannelName, &FairMQPrimaryGeneratorDevice::Reply); } void FairMQPrimaryGeneratorDevice::PreRun() @@ -78,20 +71,24 @@ void FairMQPrimaryGeneratorDevice::PreRun() bool FairMQPrimaryGeneratorDevice::ConditionalRun() { + if ( !fRunConditional ) return false; + return GenerateAndSendData(); +} + +bool FairMQPrimaryGeneratorDevice::Reply(FairMQMessagePtr& mPtr, int /*index*/) +{ + return GenerateAndSendData(); +} + +bool FairMQPrimaryGeneratorDevice::GenerateAndSendData() { fStack->Reset(); fPrimaryGenerator->GenerateEvent(fStack); - + TClonesArray* prims = fStack->GetListOfParticles(); - TMessage* tmsg = new TMessage(kMESS_OBJECT); - tmsg->WriteObject(prims); + FairMQMessagePtr mess(NewMessage()); + Serialize(*mess,prims); - FairMQMessagePtr mess(NewMessage(tmsg->Buffer(), - tmsg->BufferSize(), - [](void* /*data*/, void* object){ delete static_cast(object); }, - tmsg)); - std::unique_ptr rep(NewMessage()); - if (Send(mess, fGeneratorChannelName) > 0) { } @@ -106,7 +103,6 @@ bool FairMQPrimaryGeneratorDevice::ConditionalRun() return true; } - void FairMQPrimaryGeneratorDevice::PostRun() { } diff --git a/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.h b/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.h index 7fca10f5ea..2886c1e3f0 100644 --- a/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.h +++ b/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.h @@ -1,8 +1,8 @@ /******************************************************************************** * Copyright (C) 2017 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * * * - * This software is distributed under the terms of the * - * GNU Lesser General Public Licence version 3 (LGPL) version 3, * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence version 3 (LGPL) version 3, * * copied verbatim in the file "LICENSE" * ********************************************************************************/ @@ -42,7 +42,11 @@ class FairMQPrimaryGeneratorDevice : public FairMQDevice void SetNofEvents (int64_t nofev) { fNofEvents = nofev;}; void SetGenerator (FairPrimaryGenerator* primGen) { fPrimaryGenerator = primGen;}; + void RunInPushMode(bool tb=true) { fRunConditional = tb; }; + void RunInRepMode (bool tb=true) { fRunConditional = !tb; }; + protected: + bool Reply(FairMQMessagePtr&, int); virtual void InitTask(); virtual void PreRun(); virtual void PostRun(); @@ -51,12 +55,15 @@ class FairMQPrimaryGeneratorDevice : public FairMQDevice private: std::string fGeneratorChannelName; + bool fRunConditional; // if true run ConditionalRun, if false run Reply + FairPrimaryGenerator* fPrimaryGenerator; FairMCEventHeader* fMCEventHeader; FairStack* fStack; int64_t fNofEvents; int64_t fEventCounter; - + + bool GenerateAndSendData(); void SendObject(TObject* obj, std::string chan); FairMQPrimaryGeneratorDevice(const FairMQPrimaryGeneratorDevice&); diff --git a/examples/MQ/simulation_split/devices/FairMQTransportDevice.cxx b/examples/MQ/simulation_split/devices/FairMQTransportDevice.cxx index 23278badd5..cfb3eace09 100644 --- a/examples/MQ/simulation_split/devices/FairMQTransportDevice.cxx +++ b/examples/MQ/simulation_split/devices/FairMQTransportDevice.cxx @@ -1,8 +1,8 @@ /******************************************************************************** * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * * * - * This software is distributed under the terms of the * - * GNU Lesser General Public Licence version 3 (LGPL) version 3, * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence version 3 (LGPL) version 3, * * copied verbatim in the file "LICENSE" * ********************************************************************************/ /** @@ -13,7 +13,7 @@ */ #include "FairMQTransportDevice.h" - + #include "FairMQLogger.h" #include "FairMQMessage.h" #include "FairMQProgOptions.h" @@ -33,6 +33,8 @@ #include "FairParRootFileIo.h" #include "FairParSet.h" +#include "RootSerializer.h" + #include "TClonesArray.h" #include "TROOT.h" #include "TRint.h" @@ -41,25 +43,14 @@ #include "TList.h" #include "TObjString.h" #include "TObjArray.h" -#include "TMessage.h" using namespace std; -// special class to expose protected TMessage constructor -class TransTMessage : public TMessage -{ - public: - TransTMessage(void* buf, Int_t len) - : TMessage(buf, len) - { - ResetBit(kIsOwner); - } -}; - FairMQTransportDevice::FairMQTransportDevice() : FairMQRunDevice() + , fRunConditional(false) , fTransportDeviceId(0) - , fGeneratorChannelName("simIn") + , fGeneratorChannelName("primariesChannel") , fRunSim(NULL) , fNofEvents(1) , fTransportName("TGeant3") @@ -79,103 +70,125 @@ FairMQTransportDevice::FairMQTransportDevice() void FairMQTransportDevice::Init() { - OnData(fGeneratorChannelName, &FairMQTransportDevice::TransportData); + if ( !fRunConditional ) + OnData(fGeneratorChannelName, &FairMQTransportDevice::TransportData); } -void FairMQTransportDevice::InitTask() +void FairMQTransportDevice::InitTask() { - fRunSim = new FairRunSim(); - - fRunSim->SetSink(fSink); - - if ( fFirstParameter || fSecondParameter ) { - FairRuntimeDb *rtdb=fRunSim->GetRuntimeDb(); - if ( fFirstParameter ) - rtdb->setFirstInput(fFirstParameter); - if ( fSecondParameter ) - rtdb->setSecondInput(fSecondParameter); - } - - fRunSim->SetName(fTransportName.data()); - - if ( fUserConfig.Length() > 0 ) - fRunSim->SetUserConfig(fUserConfig); - if ( fUserCuts.Length() > 0 ) - fRunSim->SetUserCuts(fUserCuts); - // ------------------------------------------------------------------------ - - // ----- Create media ------------------------------------------------- - fRunSim->SetMaterials(fMaterialsFile.data()); - // ------------------------------------------------------------------------ - - // ----- Magnetic field ------------------------------------------- - if ( fMagneticField ) - fRunSim->SetField(fMagneticField); - // -------------------------------------------------------------------- - - // ----- Create geometry ---------------------------------------------- - for ( int idet = 0 ; idet < fDetectorArray->GetEntries() ; idet++ ) { - fRunSim->AddModule((FairModule*)(fDetectorArray->At(idet))); - } - // ------------------------------------------------------------------------ - - // ----- Negotiate the run number ------------------------------------- - // ----- via the fUpdateChannelName -------------------------------- - // ----- ask the fParamMQServer ------------------------------------ - // ----- receive the run number and sampler id --------------------- - std::string* askForRunNumber = new string("ReportSimDevice"); - FairMQMessagePtr req(NewMessage(const_cast(askForRunNumber->c_str()), - askForRunNumber->length(), - [](void* /*data*/, void* object) { delete static_cast(object); }, - askForRunNumber)); - std::unique_ptr rep(NewMessage()); - - unsigned int runId = 0; - if (Send(req, fUpdateChannelName) > 0) - { - if (Receive(rep, fUpdateChannelName) > 0) - { - std::string repString = string(static_cast(rep->GetData()), rep->GetSize()); - LOG(INFO) << " -> " << repString.data(); - runId = stoi(repString); - repString = repString.substr(repString.find_first_of('_')+1,repString.length()); - fTransportDeviceId = stoi(repString); - LOG(INFO) << "runId = " << runId << " /// fTransportDeviceId = " << fTransportDeviceId; - } - } - // ------------------------------------------------------------------------ - - fRunSim->SetStoreTraj(fStoreTrajFlag); - - // ----- Set tasks ---------------------------------------------------- - if ( fTaskArray ) { - for ( int itask = 0 ; itask < fTaskArray->GetEntries() ; itask++ ) { - fRunSim->AddTask((FairTask*)(fTaskArray->At(itask))); + fRunSim = new FairRunSim(); + + fRunSim->SetSink(fSink); + + if ( fFirstParameter || fSecondParameter ) { + FairRuntimeDb *rtdb=fRunSim->GetRuntimeDb(); + if ( fFirstParameter ) + rtdb->setFirstInput(fFirstParameter); + if ( fSecondParameter ) + rtdb->setSecondInput(fSecondParameter); + } + + fRunSim->SetName(fTransportName.data()); + + if ( fUserConfig.Length() > 0 ) + fRunSim->SetUserConfig(fUserConfig); + if ( fUserCuts.Length() > 0 ) + fRunSim->SetUserCuts(fUserCuts); + // ------------------------------------------------------------------------ + + // ----- Create media ------------------------------------------------- + fRunSim->SetMaterials(fMaterialsFile.data()); + // ------------------------------------------------------------------------ + + // ----- Magnetic field ------------------------------------------- + if ( fMagneticField ) + fRunSim->SetField(fMagneticField); + // -------------------------------------------------------------------- + + // ----- Create geometry ---------------------------------------------- + for ( int idet = 0 ; idet < fDetectorArray->GetEntries() ; idet++ ) { + fRunSim->AddModule((FairModule*)(fDetectorArray->At(idet))); + } + // ------------------------------------------------------------------------ + + // ----- Negotiate the run number ------------------------------------- + // ----- via the fUpdateChannelName -------------------------------- + // ----- ask the fParamMQServer ------------------------------------ + // ----- receive the run number and sampler id --------------------- + std::string* askForRunNumber = new string("ReportSimDevice"); + FairMQMessagePtr req(NewMessage(const_cast(askForRunNumber->c_str()), + askForRunNumber->length(), + [](void* /*data*/, void* object) { delete static_cast(object); }, + askForRunNumber)); + std::unique_ptr rep(NewMessage()); + + unsigned int runId = 0; + if (Send(req, fUpdateChannelName) > 0) + { + if (Receive(rep, fUpdateChannelName) > 0) + { + std::string repString = string(static_cast(rep->GetData()), rep->GetSize()); + LOG(INFO) << " -> " << repString.data(); + runId = stoi(repString); + repString = repString.substr(repString.find_first_of('_')+1,repString.length()); + fTransportDeviceId = stoi(repString); + LOG(INFO) << "runId = " << runId << " /// fTransportDeviceId = " << fTransportDeviceId; + } + } + // ------------------------------------------------------------------------ + + fRunSim->SetStoreTraj(fStoreTrajFlag); + + // ----- Set tasks ---------------------------------------------------- + if ( fTaskArray ) { + for ( int itask = 0 ; itask < fTaskArray->GetEntries() ; itask++ ) { + fRunSim->AddTask((FairTask*)(fTaskArray->At(itask))); + } } - } - // ------------------------------------------------------------------------ - - // ----- Initialize simulation run ------------------------------------ - fRunSim->SetRunId(runId); // run n simulations with same run id - offset the event number - fRunSim->Init(); - // ------------------------------------------------------------------------ - - fVMC = TVirtualMC::GetMC(); - fMCApplication = FairMCApplication::Instance(); - fStack = fMCApplication->GetStack(); - fStack->Register(); - // fRunSim->Run(0); + // ------------------------------------------------------------------------ + + // ----- Initialize simulation run ------------------------------------ + fRunSim->SetRunId(runId); // run n simulations with same run id - offset the event number + fRunSim->Init(); + // ------------------------------------------------------------------------ + + fVMC = TVirtualMC::GetMC(); + fMCApplication = FairMCApplication::Instance(); + fStack = fMCApplication->GetStack(); + fStack->Register(); + // fRunSim->Run(0); + UpdateParameterServer(); } void FairMQTransportDevice::PreRun() { } -bool FairMQTransportDevice::TransportData(FairMQMessagePtr& mPtr, int /*index*/) +bool FairMQTransportDevice::ConditionalRun() { - auto message = new TransTMessage(mPtr->GetData(), mPtr->GetSize()); - auto chunk = static_cast(message->ReadObjectAny(message->GetClass())); + if ( !fRunConditional ) return false; + + std::string* requestString = new string("RequestData"); + FairMQMessagePtr req(NewMessage(const_cast(requestString->c_str()), + requestString->length(), + [](void* /*data*/, void* object) { delete static_cast(object); }, + requestString)); + FairMQMessagePtr rep(NewMessage()); + + if (Send(req, fGeneratorChannelName) > 0) + { + if (Receive(rep, fGeneratorChannelName) > 0) + { + return TransportData(rep,0); + } + } + return false; +} +bool FairMQTransportDevice::TransportData(FairMQMessagePtr& mPtr, int /*index*/) +{ + TClonesArray* chunk = nullptr; + Deserialize(*mPtr, chunk); fStack->SetParticleArray(chunk); fVMC->ProcessRun(1); @@ -184,21 +197,21 @@ bool FairMQTransportDevice::TransportData(FairMQMessagePtr& mPtr, int /*index*/) void FairMQTransportDevice::UpdateParameterServer() { - FairRuntimeDb* rtdb = fRunSim->GetRuntimeDb(); - - printf("FairMQTransportDevice::UpdateParameterServer() (%d containers)\n",rtdb->getListOfContainers()->GetEntries()); - - // send the parameters to be saved - TIter next(rtdb->getListOfContainers()); - FairParSet* cont; - while ((cont=static_cast(next()))) - { - std::string ridString = std::string("RUNID") + std::to_string(fRunSim->GetRunId()) + std::string("RUNID") + std::string(cont->getDescription()); - cont->setDescription(ridString.data()); - SendObject(cont,fUpdateChannelName); - } + FairRuntimeDb* rtdb = fRunSim->GetRuntimeDb(); + + LOG(info) << "FairMQTransportDevice::UpdateParameterServer() (" << rtdb->getListOfContainers()->GetEntries() << " containers)"; + + // send the parameters to be saved + TIter next(rtdb->getListOfContainers()); + FairParSet* cont; + while ((cont=static_cast(next()))) + { + std::string ridString = std::string("RUNID") + std::to_string(fRunSim->GetRunId()) + std::string("RUNID") + std::string(cont->getDescription()); + cont->setDescription(ridString.data()); + SendObject(cont,fUpdateChannelName); + } - printf("FairMQTransportDevice::UpdateParameterServer() finished\n"); + LOG(info) << "FairMQTransportDevice::UpdateParameterServer() finished"; } void FairMQTransportDevice::PostRun() diff --git a/examples/MQ/simulation_split/devices/FairMQTransportDevice.h b/examples/MQ/simulation_split/devices/FairMQTransportDevice.h index e1f65ddafd..163bc9ed59 100644 --- a/examples/MQ/simulation_split/devices/FairMQTransportDevice.h +++ b/examples/MQ/simulation_split/devices/FairMQTransportDevice.h @@ -1,8 +1,8 @@ /******************************************************************************** * Copyright (C) 2017 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * * * - * This software is distributed under the terms of the * - * GNU Lesser General Public Licence version 3 (LGPL) version 3, * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence version 3 (LGPL) version 3, * * copied verbatim in the file "LICENSE" * ********************************************************************************/ @@ -56,6 +56,9 @@ class FairMQTransportDevice : public FairMQRunDevice void SetParamUpdateChannelName(TString tString) { fUpdateChannelName = tString; } + void RunInPullMode(bool tb=true) { fRunConditional = !tb; }; + void RunInReqMode (bool tb=true) { fRunConditional = tb; }; + protected: // bool TransportData(FairMQParts&, int); bool TransportData(FairMQMessagePtr&, int); @@ -63,12 +66,15 @@ class FairMQTransportDevice : public FairMQRunDevice virtual void InitTask(); virtual void PreRun(); virtual void PostRun(); + virtual bool ConditionalRun(); private: UInt_t fTransportDeviceId; std::string fGeneratorChannelName; std::string fUpdateChannelName; + bool fRunConditional; // if true run ConditionalRun, if false run TransportData + TVirtualMC* fVMC; FairGenericStack* fStack; FairMCApplication* fMCApplication; diff --git a/examples/MQ/simulation_split/run/CMakeLists.txt b/examples/MQ/simulation_split/run/CMakeLists.txt index d51c3b61e8..11e53339da 100644 --- a/examples/MQ/simulation_split/run/CMakeLists.txt +++ b/examples/MQ/simulation_split/run/CMakeLists.txt @@ -58,8 +58,8 @@ List(LENGTH Exe_Names _length) Math(EXPR _length ${_length}-1) -set(BIN_DESTINATION share/fairbase/examples/MQ/simulation-split/bin) -set(EXECUTABLE_OUTPUT_PATH "${EXECUTABLE_OUTPUT_PATH}/examples/MQ/simulation-split") +set(BIN_DESTINATION share/fairbase/examples/MQ/simulation_split/bin) +set(EXECUTABLE_OUTPUT_PATH "${EXECUTABLE_OUTPUT_PATH}/examples/MQ/simulation_split") ForEach(_file RANGE 0 ${_length}) List(GET Exe_Names ${_file} _name) diff --git a/examples/MQ/simulation_split/run/runMQGen.cxx b/examples/MQ/simulation_split/run/runMQGen.cxx index f775b7cdbe..b0267f567e 100644 --- a/examples/MQ/simulation_split/run/runMQGen.cxx +++ b/examples/MQ/simulation_split/run/runMQGen.cxx @@ -16,39 +16,48 @@ namespace bpo = boost::program_options; void addCustomOptions(bpo::options_description& options) { - options.add_options() - ("random-seed", bpo::value ()->default_value(0) , "Random seed number") - ("nof-events", bpo::value ()->required() , "Number of events to simulate") + options.add_options() + ("random-seed", bpo::value ()->default_value(0) , "Random seed number") + ("nof-events", bpo::value ()->required() , "Number of events to simulate") + ("running-mode", bpo::value()->default_value("pp") , "pp to push, rr to reply") ; } FairMQDevicePtr getDevice(const FairMQProgOptions& config) { - gRandom->SetSeed(config.GetValue ("random-seed")); - - TString dir = getenv("VMCWORKDIR"); - TString tutdir = dir + "/MQ/pixelDetector"; - - TString tut_configdir = config.GetValue("fairroot-config-dir"); - if ( tut_configdir.Length() < 1 ) - tut_configdir = dir + "/common/gconfig"; - gSystem->Setenv("CONFIG_DIR",tut_configdir.Data()); - - TString partName[] = {"pions","eplus","proton"}; - Int_t partPdgC[] = { 211, 11, 2212}; - Int_t chosenPart = 0; - - FairPrimaryGenerator* primGen = new FairPrimaryGenerator(); - FairBoxGenerator* boxGen = new FairBoxGenerator(partPdgC[chosenPart], 100); - boxGen->SetPRange(1,2); - boxGen->SetThetaRange(0,180); - boxGen->SetPhiRange(0,360); - primGen->AddGenerator(boxGen); - - FairMQPrimaryGeneratorDevice* mqDevice = new FairMQPrimaryGeneratorDevice(); - LOG(INFO) << "Going to generate " << config.GetValue ("nof-events") << " events!!"; - mqDevice->SetNofEvents(config.GetValue ("nof-events")); - mqDevice->SetGenerator(primGen); - - return mqDevice; + gRandom->SetSeed(config.GetValue ("random-seed")); + + TString dir = getenv("VMCWORKDIR"); + TString tutdir = dir + "/MQ/pixelDetector"; + + TString tut_configdir = config.GetValue("fairroot-config-dir"); + if ( tut_configdir.Length() < 1 ) + tut_configdir = dir + "/common/gconfig"; + gSystem->Setenv("CONFIG_DIR",tut_configdir.Data()); + + TString partName[] = {"pions","eplus","proton"}; + Int_t partPdgC[] = { 211, 11, 2212}; + Int_t chosenPart = 0; + + FairPrimaryGenerator* primGen = new FairPrimaryGenerator(); + FairBoxGenerator* boxGen = new FairBoxGenerator(partPdgC[chosenPart], 100); + boxGen->SetPRange(1,2); + boxGen->SetThetaRange(0,180); + boxGen->SetPhiRange(0,360); + primGen->AddGenerator(boxGen); + + FairMQPrimaryGeneratorDevice* mqDevice = new FairMQPrimaryGeneratorDevice(); + LOG(INFO) << "Going to generate " << config.GetValue ("nof-events") << " events."; + mqDevice->RunInPushMode(true); + if ( config.GetValue ("running-mode") == "rr" ) { + LOG(INFO) << "Going to reply with data."; + mqDevice->RunInPushMode(false); + } + else + LOG(INFO) << "Going to push data."; + + mqDevice->SetNofEvents(config.GetValue ("nof-events")); + mqDevice->SetGenerator(primGen); + + return mqDevice; } diff --git a/examples/MQ/simulation_split/run/runMQSim.cxx b/examples/MQ/simulation_split/run/runMQSim.cxx deleted file mode 100644 index 6694f3c3d2..0000000000 --- a/examples/MQ/simulation_split/run/runMQSim.cxx +++ /dev/null @@ -1,53 +0,0 @@ -#include "runFairMQDevice.h" - -// MQRunSim -#include "FairPrimaryGenerator.h" -#include "FairBoxGenerator.h" -#include "FairMQPrimaryGeneratorDevice.h" - -#include "TRandom.h" -#include "TRint.h" -#include "TROOT.h" -#include "TSystem.h" -#include "TVirtualMC.h" -#include "TVirtualMCApplication.h" - -namespace bpo = boost::program_options; - -void addCustomOptions(bpo::options_description& options) -{ - options.add_options() - ("random-seed", bpo::value ()->default_value(0) , "Random seed number") - ("nof-events", bpo::value ()->required() , "Number of events to simulate") - ; -} - -FairMQDevicePtr getDevice(const FairMQProgOptions& config) -{ - LOG(INFO) << "WHAT THE HELL?"; - gRandom->SetSeed(config.GetValue ("random-seed")); - - TString dir = getenv("VMCWORKDIR"); - TString tutdir = dir + "/MQ/pixelDetector"; - - TString tut_configdir = config.GetValue("fairroot-config-dir"); - if ( tut_configdir.Length() < 1 ) - tut_configdir = dir + "/common/gconfig"; - gSystem->Setenv("CONFIG_DIR",tut_configdir.Data()); - - TString partName[] = {"pions","eplus","proton"}; - Int_t partPdgC[] = { 211, 11, 2212}; - Int_t chosenPart = 0; - - FairPrimaryGenerator* primGen = new FairPrimaryGenerator(); - FairBoxGenerator* boxGen = new FairBoxGenerator(partPdgC[chosenPart], 5); - boxGen->SetPRange(1,2); - boxGen->SetThetaRange(0,40); - boxGen->SetPhiRange(0,360); - primGen->AddGenerator(boxGen); - - FairMQPrimaryGeneratorDevice* mqDevice = new FairMQPrimaryGeneratorDevice(); - mqDevice->SetNofEvents(config.GetValue ("nof-events")); - mqDevice->SetGenerator(primGen); - return mqDevice; -} diff --git a/examples/MQ/simulation_split/run/runMQTrans.cxx b/examples/MQ/simulation_split/run/runMQTrans.cxx index 9271dbaafe..6777d01abb 100644 --- a/examples/MQ/simulation_split/run/runMQTrans.cxx +++ b/examples/MQ/simulation_split/run/runMQTrans.cxx @@ -25,72 +25,76 @@ namespace bpo = boost::program_options; void addCustomOptions(bpo::options_description& options) { - options.add_options() - ("random-seed", bpo::value ()->default_value(0) , "Random seed number") - ("transport-name", bpo::value()->default_value("TGeant3") , "Transport name") - ("fairroot-config-dir", bpo::value()->default_value("") , "FairRoot config dir") - ("param-channel-name", bpo::value()->default_value("updateChannel"), "Parameter update channel name") - ; + options.add_options() + ("random-seed", bpo::value ()->default_value(0) , "Random seed number") + ("transport-name", bpo::value()->default_value("TGeant3") , "Transport name") + ("fairroot-config-dir", bpo::value()->default_value("") , "FairRoot config dir") + ("param-channel-name", bpo::value()->default_value("updateChannel"), "Parameter update channel name") + ("running-mode", bpo::value()->default_value("pp") , "pp to pull, rr to request") + ; } FairMQDevicePtr getDevice(const FairMQProgOptions& config) { - gRandom->SetSeed(config.GetValue ("random-seed")); - - TString dir = getenv("VMCWORKDIR"); - TString tutdir = dir + "/MQ/pixelDetector"; - - TString tut_geomdir = dir + "/common/geometry"; - gSystem->Setenv("GEOMPATH",tut_geomdir.Data()); - - TString tut_configdir = config.GetValue("fairroot-config-dir"); - if ( tut_configdir.Length() < 1 ) - tut_configdir = dir + "/common/gconfig"; - gSystem->Setenv("CONFIG_DIR",tut_configdir.Data()); - - FairMQTransportDevice* run = new FairMQTransportDevice(); - - // TString outputfilename = Form("outputfile_%d.root",(int)(getpid())); - // FairRootFileSink* sink = new FairRootFileSink(outputfilename); - FairOnlineSink* sink = new FairOnlineSink(); - sink->SetMQRunDevice(run); - run->SetSink(sink); - - run->SetParamUpdateChannelName(config.GetValue("param-channel-name")); - - run->SetTransportName (config.GetValue("transport-name")); - run->SetMaterials ("media.geo"); - - TObjArray* detArray = new TObjArray(); - FairModule* cave= new FairCave("CAVE"); - cave->SetGeometryFileName("cave_vacuum.geo"); - detArray->Add(cave); - Pixel* det = new Pixel("PixelDetector", kTRUE); - det->SetGeometryFileName("pixel.geo"); - detArray->Add(det); - run->SetDetectorArray (detArray); - - TString partName[] = {"pions","eplus","proton"}; - Int_t partPdgC[] = { 211, 11, 2212}; - Int_t chosenPart = 0; - - run->SetStoreTraj (false); - - // --------------------------------------------------- - if ( 1==0 ) - { - // try to run digi task in the simulation device - TString digParFile = tutdir + "/param/pixel_digi.par"; - FairParAsciiFileIo* parIo1 = new FairParAsciiFileIo(); - parIo1->open(digParFile.Data(),"in"); - run->SetFirstParameter(parIo1); - - TObjArray* taskArray = new TObjArray(); - PixelDigitize* digiTask = new PixelDigitize(); - taskArray->Add(digiTask); - run->SetTaskArray(taskArray); - } - // --------------------------------------------------- + gRandom->SetSeed(config.GetValue ("random-seed")); + + TString dir = getenv("VMCWORKDIR"); + TString tutdir = dir + "/MQ/pixelDetector"; + + TString tut_geomdir = dir + "/common/geometry"; + gSystem->Setenv("GEOMPATH",tut_geomdir.Data()); - return run; + TString tut_configdir = config.GetValue("fairroot-config-dir"); + if ( tut_configdir.Length() < 1 ) + tut_configdir = dir + "/common/gconfig"; + gSystem->Setenv("CONFIG_DIR",tut_configdir.Data()); + + FairMQTransportDevice* run = new FairMQTransportDevice(); + run->RunInPullMode(true); + if ( config.GetValue ("running-mode") == "rr" ) { + LOG(INFO) << "Going to request data."; + run->RunInPullMode(false); + } + else + LOG(INFO) << "Going to pull data."; + + // TString outputfilename = Form("outputfile_%d.root",(int)(getpid())); + // FairRootFileSink* sink = new FairRootFileSink(outputfilename); + FairOnlineSink* sink = new FairOnlineSink(); + sink->SetMQRunDevice(run); + run->SetSink(sink); + + run->SetParamUpdateChannelName(config.GetValue("param-channel-name")); + + run->SetTransportName (config.GetValue("transport-name")); + run->SetMaterials ("media.geo"); + + TObjArray* detArray = new TObjArray(); + FairModule* cave= new FairCave("CAVE"); + cave->SetGeometryFileName("cave_vacuum.geo"); + detArray->Add(cave); + Pixel* det = new Pixel("PixelDetector", kTRUE); + det->SetGeometryFileName("pixel.geo"); + detArray->Add(det); + run->SetDetectorArray (detArray); + + run->SetStoreTraj (false); + + // --------------------------------------------------- + if ( 1==0 ) + { + // try to run digi task in the simulation device + TString digParFile = tutdir + "/param/pixel_digi.par"; + FairParAsciiFileIo* parIo1 = new FairParAsciiFileIo(); + parIo1->open(digParFile.Data(),"in"); + run->SetFirstParameter(parIo1); + + TObjArray* taskArray = new TObjArray(); + PixelDigitize* digiTask = new PixelDigitize(); + taskArray->Add(digiTask); + run->SetTaskArray(taskArray); + } + // --------------------------------------------------- + + return run; } diff --git a/examples/MQ/simulation_split/scripts/CMakeLists.txt b/examples/MQ/simulation_split/scripts/CMakeLists.txt new file mode 100644 index 0000000000..27eab6d0da --- /dev/null +++ b/examples/MQ/simulation_split/scripts/CMakeLists.txt @@ -0,0 +1,33 @@ + ################################################################################ + # Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # + # # + # This software is distributed under the terms of the # + # GNU Lesser General Public Licence (LGPL) version 3, # + # copied verbatim in the file "LICENSE" # + ################################################################################ + +set(NETWORK_INTERFACE eth0) +If(APPLE) + set(NETWORK_INTERFACE lo0) +EndIf(APPLE) + +set(SIM_FILE_LOCATION ${CMAKE_SOURCE_DIR}) +set(SIM_BIN_LOCATION ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split) +set(PIXEL_BIN_LOCATION ${CMAKE_BINARY_DIR}/bin/examples/MQ/pixelDetector) +set(FAIRROOT_BIN_LOCATION ${CMAKE_BINARY_DIR}/bin) + +configure_file( ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/scripts/dds-simulation-split.xml + ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split/dds-simulation-split.xml ) + +set(SIM_FILE_LOCATION ${CMAKE_INSTALL_PREFIX}/share/fairbase) +set(SIM_BIN_LOCATION ${CMAKE_INSTALL_PREFIX}/share/fairbase/examples/MQ/simulation_split/bin) +set(PIXEL_BIN_LOCATION ${CMAKE_INSTALL_PREFIX}/share/fairbase/examples/MQ/pixelDetector/bin) +set(FAIRROOT_BIN_LOCATION ${CMAKE_INSTALL_PREFIX}/bin) +configure_file( ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/scripts/dds-simulation-split.xml + ${CMAKE_BINARY_DIR}/examples/MQ/simulation_split/scripts/dds-simulation-split.xml_install ) + +set(SIM_INSTALL_BIN share/fairbase/examples/MQ/simulation_split/bin) + +Install(FILES ${CMAKE_BINARY_DIR}/examples/MQ/simulation_split/scripts/dds-simulation-split.xml_install + DESTINATION ${SIM_INSTALL_BIN} + RENAME dds-simulation-split.xml PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ WORLD_READ) diff --git a/examples/MQ/simulation_split/scripts/dds-simulation-split.xml b/examples/MQ/simulation_split/scripts/dds-simulation-split.xml new file mode 100644 index 0000000000..cd8ff510fe --- /dev/null +++ b/examples/MQ/simulation_split/scripts/dds-simulation-split.xml @@ -0,0 +1,45 @@ + + + + + + + @SIM_BIN_LOCATION@/runMQGen --config-key generator --channel-config name=primariesChannel,type=push,method=bind --running-mode pp --severity INFO --nof-events 100000 --id sampler --random-seed 0 -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false + + primariesChannel + + + + + @SIM_BIN_LOCATION@/runMQTrans --config-key transporter --channel-config name=primariesChannel,type=pull,method=connect --running-mode pp --channel-config name=data#all#,type=push,method=connect --channel-config name=updateChannel,type=req,method=connect --severity DEBUG --transport-name TGeant3 --id transporter_%taskIndex% --random-seed 0 -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false + + primariesChannel + data#all# + updateChannel + + + + + @PIXEL_BIN_LOCATION@/pixel-sink --in-channel data#all# --severity DEBUG --id sink1 --channel-config name=data#all#,type=pull,method=bind --class-name FairMCEventHeader --branch-name MCEventHeader. --class-name "TClonesArray(PixelPoint)" --branch-name PixelPoint --class-name "TClonesArray(FairMCTrack)" --branch-name MCTrack --file-name @SIM_FILE_LOCATION@/examples/MQ/simulation_split/run/DDS.simulation_TGeant3.data.root -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false + + data#all# + + + + + @FAIRROOT_BIN_LOCATION@/parmq-server zeromq --id parmq-server --channel-config name=updateChannel,type=rep,method=bind --severity DEBUG --update-channel-name updateChannel --output-name @SIM_FILE_LOCATION@/examples/MQ/simulation_split/run/DDS.simulation_TGeant3.pars.root -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false + + updateChannel + + + +
+ Sink + ParamServer + Generator + + Transporter + +
+ +
From 0480f0bc61c26af190031b03db28de703d07435c Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Tue, 2 Oct 2018 12:20:24 +0200 Subject: [PATCH 03/27] examples/MQ/pixelDetector PixelFileSink now stores all the data that arrive in the message. Obsolete method my specifing data to store via command line interface removed. --- examples/MQ/pixelDetector/run/CMakeLists.txt | 1 + .../MQ/pixelDetector/run/runPixelFileSink.cxx | 2 - .../run/scripts/startFairMQPixel.sh.in | 8 +- .../run/scripts/startFairMQPixelMerger.sh.in | 2 +- .../scripts/startFairMQPixelSimulation.sh.in | 3 - .../scripts/startFairMQPixel_3Levels.sh.in | 4 +- .../src/devices/FairMQPixelFileSink.cxx | 106 +++++------------- .../src/devices/FairMQPixelFileSink.h | 11 -- 8 files changed, 33 insertions(+), 104 deletions(-) diff --git a/examples/MQ/pixelDetector/run/CMakeLists.txt b/examples/MQ/pixelDetector/run/CMakeLists.txt index d8234adc7e..17266ac8d3 100644 --- a/examples/MQ/pixelDetector/run/CMakeLists.txt +++ b/examples/MQ/pixelDetector/run/CMakeLists.txt @@ -12,6 +12,7 @@ GENERATE_TEST_SCRIPT(${CMAKE_BINARY_DIR}/bin/examples/MQ/pixelDetector/startFair Add_Test(pixel_simulation ${CMAKE_CURRENT_BINARY_DIR}/startFairMQPixelSimulation.sh --work-dir ${CMAKE_BINARY_DIR} -n 1000 -g TGeant3 -c static -s 6 --force-kill true -m 20 -v veryhigh -l false) +Set_Tests_Properties(pixel_simulation PROPERTIES DEPENDS pixel_static) Set_Tests_Properties(pixel_simulation PROPERTIES TIMEOUT ${MaxTestTime}) Set_Tests_Properties(pixel_simulation PROPERTIES PASS_REGULAR_EXPRESSION "Shell script finished successfully") diff --git a/examples/MQ/pixelDetector/run/runPixelFileSink.cxx b/examples/MQ/pixelDetector/run/runPixelFileSink.cxx index 83ceb90c75..ff60fc822b 100644 --- a/examples/MQ/pixelDetector/run/runPixelFileSink.cxx +++ b/examples/MQ/pixelDetector/run/runPixelFileSink.cxx @@ -17,8 +17,6 @@ void addCustomOptions(bpo::options_description& options) { options.add_options() ("file-name", bpo::value () , "Path to the output file") - ("class-name", bpo::value>() , "class name") - ("branch-name", bpo::value>() , "branch name") ("in-channel", bpo::value ()->default_value("data-in") , "input channel name") ("ack-channel", bpo::value () , "ack channel name"); } diff --git a/examples/MQ/pixelDetector/run/scripts/startFairMQPixel.sh.in b/examples/MQ/pixelDetector/run/scripts/startFairMQPixel.sh.in index 6ff49eb52a..889e440f77 100755 --- a/examples/MQ/pixelDetector/run/scripts/startFairMQPixel.sh.in +++ b/examples/MQ/pixelDetector/run/scripts/startFairMQPixel.sh.in @@ -76,8 +76,6 @@ if [ "$FAIRTASKNAME" == "--task-name PixelFindHits" ] ; then # output file for sink OUTPUTFILE="$WORKDIR/examples/MQ/pixelDetector/macros/MQ.pixel_TGeant3.hits.root" - OUTPUTCLASS="--class-name TClonesArray(PixelHit)" - OUTPUTBRANCH="--branch-name PixelHits" elif [ "$FAIRTASKNAME" == "--task-name PixelFindTracks" ] ; then # input file and branch for the sampler device FAIRTASKNAME+=" --keep-data PixelHits" @@ -86,8 +84,6 @@ elif [ "$FAIRTASKNAME" == "--task-name PixelFindTracks" ] ; then # output file for sink OUTPUTFILE="$WORKDIR/examples/MQ/pixelDetector/macros/MQ.pixel_TGeant3.hits_tracks.root" - OUTPUTCLASS="--class-name TClonesArray(PixelHit) --class-name TClonesArray(PixelTrack)" - OUTPUTBRANCH="--branch-name PixelHits --branch-name PixelTracks" elif [ "$FAIRTASKNAME" == "--task-name PixelFitTracks" ] ; then # input file and branch for the sampler device INPUTFILE="$WORKDIR/examples/MQ/pixelDetector/macros/MQ.pixel_TGeant3.hits_tracks.root" @@ -95,8 +91,6 @@ elif [ "$FAIRTASKNAME" == "--task-name PixelFitTracks" ] ; then # output file for sink OUTPUTFILE="$WORKDIR/examples/MQ/pixelDetector/macros/MQ.pixel_TGeant3.fitTracks.root" - OUTPUTCLASS="--class-name TClonesArray(PixelTrack)" - OUTPUTBRANCH="--branch-name PixelFitTracks" else echo "TASK $FAIRTASKNAME UNKNOWN!!!" exit @@ -145,7 +139,7 @@ FILESINK+=" --id pixDet-sink1 --channel-config name=data-in,type=pull,method=bin if [ "$COMMAND" == "static" ]; then FILESINK+=" --ack-channel ack --channel-config name=ack,type=push,method=connect,rateLogging=0,address=tcp://localhost:5108" fi -FILESINK+=" --file-name $OUTPUTFILE --class-name FairEventHeader --branch-name EventHeader. $OUTPUTCLASS $OUTPUTBRANCH $CONTROL" +FILESINK+=" --file-name $OUTPUTFILE $CONTROL" ########################## run all if [ "$COMMAND" == "print" ]; then diff --git a/examples/MQ/pixelDetector/run/scripts/startFairMQPixelMerger.sh.in b/examples/MQ/pixelDetector/run/scripts/startFairMQPixelMerger.sh.in index 8d2fa13a41..a3ce345204 100755 --- a/examples/MQ/pixelDetector/run/scripts/startFairMQPixelMerger.sh.in +++ b/examples/MQ/pixelDetector/run/scripts/startFairMQPixelMerger.sh.in @@ -140,7 +140,7 @@ xterm +aw -geometry 80x25+500+700 -hold -e @PIXEL_BIN_LOCATION@/$MERGER & ########################## start FILESINK FILESINK="pixel-sink $TRANSPORT" FILESINK+=" --id sink 1 --channel-config name=data-in,type=pull,method=bind,rateLogging=1,address=tcp://*:5230" -FILESINK+=" --file-name $OUTPUTFILE --class-name FairEventHeader --branch-name EventHeader. --class-name $OUTPUTCLASS --branch-name $OUTPUTBRANCH" +FILESINK+=" --file-name $OUTPUTFILE" xterm +aw -geometry 80x25+1000+700 -hold -e @PIXEL_BIN_LOCATION@/$FILESINK & diff --git a/examples/MQ/pixelDetector/run/scripts/startFairMQPixelSimulation.sh.in b/examples/MQ/pixelDetector/run/scripts/startFairMQPixelSimulation.sh.in index 9ee0eefbda..4fa0c07775 100755 --- a/examples/MQ/pixelDetector/run/scripts/startFairMQPixelSimulation.sh.in +++ b/examples/MQ/pixelDetector/run/scripts/startFairMQPixelSimulation.sh.in @@ -181,9 +181,6 @@ FILESINK+=" $SEVERITY " FILESINK+=" $VERBOSITY " FILESINK+=" $COLOR " FILESINK+=" --id pixSim-sink1 --channel-config name=data#all#,type=pull,method=bind,rateLogging=1,address=tcp://*:5206" -FILESINK+=" --class-name FairMCEventHeader --branch-name MCEventHeader." -FILESINK+=" --class-name TClonesArray(PixelPoint) --branch-name PixelPoint" -FILESINK+=" --class-name TClonesArray(FairMCTrack) --branch-name MCTrack" FILESINK+=" --file-name $OUTPUTFILE $CONTROL" ########################## run all diff --git a/examples/MQ/pixelDetector/run/scripts/startFairMQPixel_3Levels.sh.in b/examples/MQ/pixelDetector/run/scripts/startFairMQPixel_3Levels.sh.in index 6ae02f28eb..b2bf6740f9 100755 --- a/examples/MQ/pixelDetector/run/scripts/startFairMQPixel_3Levels.sh.in +++ b/examples/MQ/pixelDetector/run/scripts/startFairMQPixel_3Levels.sh.in @@ -40,8 +40,6 @@ INPUTBRANCH="PixelDigis" # output file for sink OUTPUTFILE="@PIXEL_FILE_LOCATION@/examples/MQ/pixelDetector/macros/MQ.pixel_TGeant3.3Levels.fitTracks.root" -OUTPUTCLASS="--class-name TClonesArray(PixelTrack)" -OUTPUTBRANCH="--branch-name PixelFitTracks" ########################### @@ -109,7 +107,7 @@ xterm -geometry 80x22+1000+700 -hold -e @PIXEL_BIN_LOCATION@/$PROCESSOR3_2 & ########################## start FILESINK FILESINK="pixel-sink $TRANSPORT" FILESINK+=" --id sink1 --channel-config name=data-in,type=pull,method=bind,rateLogging=1,address=tcp://*:5330" -FILESINK+=" --file-name $OUTPUTFILE --class-name FairEventHeader --branch-name EventHeader. $OUTPUTCLASS $OUTPUTBRANCH" +FILESINK+=" --file-name $OUTPUTFILE" xterm +aw -geometry 80x22+0+700 -hold -e @PIXEL_BIN_LOCATION@/$FILESINK & diff --git a/examples/MQ/pixelDetector/src/devices/FairMQPixelFileSink.cxx b/examples/MQ/pixelDetector/src/devices/FairMQPixelFileSink.cxx index 813fb6b925..f4336e2352 100644 --- a/examples/MQ/pixelDetector/src/devices/FairMQPixelFileSink.cxx +++ b/examples/MQ/pixelDetector/src/devices/FairMQPixelFileSink.cxx @@ -17,7 +17,6 @@ #include "RootSerializer.h" -#include "FairMCEventHeader.h" #include "FairMQPixelFileSink.h" #include "FairMQLogger.h" #include @@ -31,8 +30,6 @@ FairMQPixelFileSink::FairMQPixelFileSink() , fFileName() , fTreeName() - , fBranchNames() - , fClassNames() , fFileOption() , fFlowMode(false) , fWrite(false) @@ -48,8 +45,6 @@ FairMQPixelFileSink::FairMQPixelFileSink() void FairMQPixelFileSink::Init() { fFileName = fConfig->GetValue ("file-name"); - fClassNames = fConfig->GetValue>("class-name"); - fBranchNames = fConfig->GetValue>("branch-name"); fInputChannelName = fConfig->GetValue ("in-channel"); fAckChannelName = fConfig->GetValue ("ack-channel"); @@ -57,11 +52,6 @@ void FairMQPixelFileSink::Init() fFileOption = "RECREATE"; fTreeName = "cbmsim"; - // fBranchNames.push_back("EventHeader."); - // fClassNames .push_back("FairEventHeader"); - // fBranchNames.push_back("PixelHits"); - // fClassNames .push_back("TClonesArray(PixelHit)"); - if ( ::getenv("DDS_SESSION_ID") ) { std::string DDS_SESSION_ID = ::getenv("DDS_SESSION_ID"); if ( fFileName.length() > 5 ) { @@ -72,80 +62,42 @@ void FairMQPixelFileSink::Init() fOutFile = TFile::Open(fFileName.c_str(),fFileOption.c_str()); - fTree = new TTree(fTreeName.c_str(), "/cbmout"); - - fFolder = new TFolder("cbmout", "Main Output Folder"); - TFolder* foldEventHeader = fFolder->AddFolder("EvtHeader","EvtHeader"); - TFolder* foldPixel = fFolder->AddFolder("Pixel","Pixel"); - - TList* BranchNameList = new TList(); - - for ( fNObjects = 0 ; fNObjects < fBranchNames.size() ; fNObjects++ ) { - LOG(INFO) << "Creating output branch \"" << fClassNames[fNObjects] << "\" with name \"" << fBranchNames[fNObjects] << "\""; - if ( fClassNames[fNObjects].find("TClonesArray(") == 0 ) { - fClassNames [fNObjects] = fClassNames[fNObjects].substr(13,fClassNames[fNObjects].length()-12-2); - fOutputObjects [fNObjects] = new TClonesArray(fClassNames[fNObjects].c_str()); - fTree->Branch(fBranchNames[fNObjects].c_str(),"TClonesArray", &fOutputObjects[fNObjects]); - foldPixel->Add(fOutputObjects[fNObjects]); - BranchNameList->AddLast(new TObjString(fBranchNames[fNObjects].c_str())); - } - else if ( fClassNames[fNObjects].find("FairEventHeader") == 0 ) { - fOutputObjects [fNObjects] = new FairEventHeader(); - fTree->Branch(fBranchNames[fNObjects].c_str(),"FairEventHeader", &fOutputObjects[fNObjects]); - foldEventHeader->Add(fOutputObjects[fNObjects]); - BranchNameList->AddLast(new TObjString(fBranchNames[fNObjects].c_str())); - } - else if ( fClassNames[fNObjects].find("FairMCEventHeader") == 0 ) { - fOutputObjects [fNObjects] = new FairMCEventHeader(); - fTree->Branch(fBranchNames[fNObjects].c_str(),"FairMCEventHeader", &fOutputObjects[fNObjects]); - foldEventHeader->Add(fOutputObjects[fNObjects]); - BranchNameList->AddLast(new TObjString(fBranchNames[fNObjects].c_str())); - } - else { - LOG(ERROR) << "!!! Unknown output object \"" << fClassNames[fNObjects] << "\" !!!"; - } - } - - fFolder->Write(); - BranchNameList->Write("BranchList", TObject::kSingleKey); - BranchNameList->Delete(); - delete BranchNameList; - OnData(fInputChannelName, &FairMQPixelFileSink::StoreData); } bool FairMQPixelFileSink::StoreData(FairMQParts& parts, int /*index*/) -{ - std::vector tempObjects; - for ( int ipart = 0 ; ipart < parts.Size() ; ipart++ ) - { - TObject* obj = nullptr; - Deserialize(*parts.At(ipart),obj); - tempObjects.push_back(obj); - for ( unsigned int ibr = 0 ; ibr < fBranchNames.size() ; ibr++ ) - { - if ( strcmp(tempObjects.back()->GetName(),fBranchNames[ibr].data()) == 0 ) - { - fOutputObjects[ibr] = tempObjects.back(); - fTree->SetBranchAddress(fBranchNames[ibr].c_str(),&fOutputObjects[ibr]); - } - } +{ + bool creatingTree = false; + std::vector tempObjects; + if ( !fTree ) { + creatingTree = true; + fTree = new TTree(fTreeName.c_str(), "/cbmout"); + } - fTree->Fill(); - - for ( unsigned int ipart = 0 ; ipart < tempObjects.size() ; ipart++ ) - { - if ( tempObjects[ipart] ) - delete tempObjects[ipart]; + + // LOG(INFO) << "Got message with " << parts.Size() << " parts:"; + for ( int ipart = 0 ; ipart < parts.Size() ; ipart++ ) { + PixelTMessage tm(parts.At(ipart)->GetData(), parts.At(ipart)->GetSize()); + tempObjects.push_back((TObject*)tm.ReadObject(tm.GetClass())); + fOutputObjects[ipart] = tempObjects.back(); + if ( creatingTree ) + fTree->Branch(tempObjects.back()->GetName(),tempObjects.back()->ClassName(),&fOutputObjects[ipart]); + fTree->SetBranchAddress(tempObjects.back()->GetName(),&fOutputObjects[ipart]); } - tempObjects.clear(); - - if ( fAckChannelName != "" ) - { - unique_ptr msg(NewMessage()); - Send(msg, fAckChannelName); + // LOG(INFO) << "Finished branches"; + fTree->Fill(); + + for ( unsigned int ipart = 0 ; ipart < tempObjects.size() ; ipart++ ) { + if ( tempObjects[ipart] ) + delete tempObjects[ipart]; + } + tempObjects.clear(); + + if ( fAckChannelName != "" ) { + unique_ptr msg(NewMessage()); + Send(msg, fAckChannelName); } - return true; + return true; } FairMQPixelFileSink::~FairMQPixelFileSink() diff --git a/examples/MQ/pixelDetector/src/devices/FairMQPixelFileSink.h b/examples/MQ/pixelDetector/src/devices/FairMQPixelFileSink.h index 7af805c200..74d47f7e1f 100644 --- a/examples/MQ/pixelDetector/src/devices/FairMQPixelFileSink.h +++ b/examples/MQ/pixelDetector/src/devices/FairMQPixelFileSink.h @@ -19,7 +19,6 @@ #include "TFile.h" #include "TFolder.h" #include "TTree.h" -#include "FairEventHeader.h" #include "FairMQDevice.h" @@ -30,11 +29,6 @@ class FairMQPixelFileSink : public FairMQDevice virtual ~FairMQPixelFileSink(); void SetOutputFileName(std::string tempString) { fFileName = tempString; } - void AddOutputBranch (std::string classString, std::string branchString) - { - fClassNames .push_back(classString); - fBranchNames.push_back(branchString); - } std::string GetOutputFileName () { return fFileName;} void SetInputChannelName (std::string tstr) {fInputChannelName = tstr;} @@ -51,9 +45,6 @@ class FairMQPixelFileSink : public FairMQDevice std::string fFileName; std::string fTreeName; - std::vector fBranchNames; - std::vector fClassNames; - std::string fFileOption; bool fFlowMode; bool fWrite; @@ -62,8 +53,6 @@ class FairMQPixelFileSink : public FairMQDevice TTree* fTree; unsigned int fNObjects; TObject** fOutputObjects; - /* FairEventHeader* fEventHeader; */ - /* TClonesArray* fOutput; */ TFolder* fFolder; FairMQPixelFileSink(const FairMQPixelFileSink&); From 6c8679fcdf69900fd977bc95220ecba024766987 Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Tue, 2 Oct 2018 12:22:58 +0200 Subject: [PATCH 04/27] examples/MQ/simulation_split Restructed the simulation_split example. - FairMQPrimaryGeneratorDevice - now can split simulated events into chunks; - FairMQTransportDevice - transports full or chunk of simulated events; - FairMQChunkMerger - merges chunks of individual events into full events; --- base/sim/FairGenericStack.h | 1 + examples/MQ/simulation_split/CMakeLists.txt | 2 +- .../MQ/simulation_split/run/CMakeLists.txt | 5 +- .../simulation_split/run/runMQChunkMerger.cxx | 26 +++ examples/MQ/simulation_split/run/runMQGen.cxx | 2 + .../{devices => src}/CMakeLists.txt | 24 ++- .../src/FairMCSplitEventHeader.cxx | 42 ++++ .../src/FairMCSplitEventHeader.h | 46 +++++ .../MQ/simulation_split/src/SimMQLinkDef.h | 16 ++ .../src/devices/FairMQChunkMerger.cxx | 184 ++++++++++++++++++ .../src/devices/FairMQChunkMerger.h | 62 ++++++ .../devices/FairMQPrimaryGeneratorDevice.cxx | 52 ++++- .../devices/FairMQPrimaryGeneratorDevice.h | 5 + .../devices/FairMQTransportDevice.cxx | 62 ++++-- .../{ => src}/devices/FairMQTransportDevice.h | 8 +- examples/common/mcstack/FairStack.cxx | 3 +- examples/common/mcstack/FairStack.h | 11 ++ 17 files changed, 518 insertions(+), 33 deletions(-) create mode 100644 examples/MQ/simulation_split/run/runMQChunkMerger.cxx rename examples/MQ/simulation_split/{devices => src}/CMakeLists.txt (80%) create mode 100644 examples/MQ/simulation_split/src/FairMCSplitEventHeader.cxx create mode 100644 examples/MQ/simulation_split/src/FairMCSplitEventHeader.h create mode 100644 examples/MQ/simulation_split/src/SimMQLinkDef.h create mode 100644 examples/MQ/simulation_split/src/devices/FairMQChunkMerger.cxx create mode 100644 examples/MQ/simulation_split/src/devices/FairMQChunkMerger.h rename examples/MQ/simulation_split/{ => src}/devices/FairMQPrimaryGeneratorDevice.cxx (57%) rename examples/MQ/simulation_split/{ => src}/devices/FairMQPrimaryGeneratorDevice.h (90%) rename examples/MQ/simulation_split/{ => src}/devices/FairMQTransportDevice.cxx (73%) rename examples/MQ/simulation_split/{ => src}/devices/FairMQTransportDevice.h (95%) diff --git a/base/sim/FairGenericStack.h b/base/sim/FairGenericStack.h index 9bc79831a1..c5fa8e99fa 100644 --- a/base/sim/FairGenericStack.h +++ b/base/sim/FairGenericStack.h @@ -98,6 +98,7 @@ class FairGenericStack : public TVirtualMCStack virtual TClonesArray* GetListOfParticles() { return 0; } virtual void SetParticleArray(TClonesArray* partArray) {} + virtual void SetParticleArray(TClonesArray* partArray, Int_t partFrom, Int_t partTo) {} /** Clone this object (used in MT mode only) */ virtual FairGenericStack* CloneStack() const; diff --git a/examples/MQ/simulation_split/CMakeLists.txt b/examples/MQ/simulation_split/CMakeLists.txt index 60d24db916..3c7ccd09b1 100644 --- a/examples/MQ/simulation_split/CMakeLists.txt +++ b/examples/MQ/simulation_split/CMakeLists.txt @@ -5,6 +5,6 @@ # GNU Lesser General Public Licence (LGPL) version 3, # # copied verbatim in the file "LICENSE" # ################################################################################ -Add_Subdirectory(devices) +Add_Subdirectory(src) Add_Subdirectory(run) Add_Subdirectory(scripts) diff --git a/examples/MQ/simulation_split/run/CMakeLists.txt b/examples/MQ/simulation_split/run/CMakeLists.txt index 11e53339da..8238882433 100644 --- a/examples/MQ/simulation_split/run/CMakeLists.txt +++ b/examples/MQ/simulation_split/run/CMakeLists.txt @@ -19,7 +19,8 @@ set(INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/examples/MQ/pixelDetector ${CMAKE_SOURCE_DIR}/examples/MQ/pixelDetector/src ${CMAKE_SOURCE_DIR}/examples/MQ/pixelDetector/src/devices - ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/devices + ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/src + ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/src/devices ) Set(SYSTEM_INCLUDE_DIRECTORIES @@ -46,11 +47,13 @@ link_directories(${LINK_DIRECTORIES}) Set(Exe_Names runMQGen runMQTrans + runMQChMer ) set(Exe_Source runMQGen.cxx runMQTrans.cxx + runMQChunkMerger.cxx ) diff --git a/examples/MQ/simulation_split/run/runMQChunkMerger.cxx b/examples/MQ/simulation_split/run/runMQChunkMerger.cxx new file mode 100644 index 0000000000..ef5d870bc8 --- /dev/null +++ b/examples/MQ/simulation_split/run/runMQChunkMerger.cxx @@ -0,0 +1,26 @@ +#include "runFairMQDevice.h" + +// MQRunSim +#include "FairPrimaryGenerator.h" +#include "FairBoxGenerator.h" +#include "FairMQChunkMerger.h" + +#include "TRandom.h" +#include "TRint.h" +#include "TROOT.h" +#include "TSystem.h" +#include "TVirtualMC.h" +#include "TVirtualMCApplication.h" + +namespace bpo = boost::program_options; + +void addCustomOptions(bpo::options_description& options) +{ +} + +FairMQDevicePtr getDevice(const FairMQProgOptions& config) +{ + FairMQChunkMerger* mqDevice = new FairMQChunkMerger(); + + return mqDevice; +} diff --git a/examples/MQ/simulation_split/run/runMQGen.cxx b/examples/MQ/simulation_split/run/runMQGen.cxx index b0267f567e..5208deecd6 100644 --- a/examples/MQ/simulation_split/run/runMQGen.cxx +++ b/examples/MQ/simulation_split/run/runMQGen.cxx @@ -20,6 +20,7 @@ void addCustomOptions(bpo::options_description& options) ("random-seed", bpo::value ()->default_value(0) , "Random seed number") ("nof-events", bpo::value ()->required() , "Number of events to simulate") ("running-mode", bpo::value()->default_value("pp") , "pp to push, rr to reply") + ("chunk-size", bpo::value ()->default_value(0) , "Max nof primaries in chunk") ; } @@ -48,6 +49,7 @@ FairMQDevicePtr getDevice(const FairMQProgOptions& config) FairMQPrimaryGeneratorDevice* mqDevice = new FairMQPrimaryGeneratorDevice(); LOG(INFO) << "Going to generate " << config.GetValue ("nof-events") << " events."; + mqDevice->SetChunkSize(config.GetValue("chunk-size")); mqDevice->RunInPushMode(true); if ( config.GetValue ("running-mode") == "rr" ) { LOG(INFO) << "Going to reply with data."; diff --git a/examples/MQ/simulation_split/devices/CMakeLists.txt b/examples/MQ/simulation_split/src/CMakeLists.txt similarity index 80% rename from examples/MQ/simulation_split/devices/CMakeLists.txt rename to examples/MQ/simulation_split/src/CMakeLists.txt index 729011003e..7365593ed7 100644 --- a/examples/MQ/simulation_split/devices/CMakeLists.txt +++ b/examples/MQ/simulation_split/src/CMakeLists.txt @@ -13,10 +13,11 @@ set(INCLUDE_DIRECTORIES ${BASE_INCLUDE_DIRECTORIES} ${FairMQ_INCDIR}/fairmq/options ${CMAKE_SOURCE_DIR}/base/MQ/policies/Serialization - ${CMAKE_SOURCE_DIR}/examples/common/mcstack - ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/devices ${CMAKE_SOURCE_DIR}/examples/MQ/pixelDetector/src ${CMAKE_SOURCE_DIR}/examples/MQ/pixelDetector/src/devices + ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/src + ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/src/devices + ${CMAKE_SOURCE_DIR}/examples/common/mcstack ${FairLogger_INCDIR} ) @@ -36,16 +37,27 @@ ${Boost_LIBRARY_DIRS} link_directories( ${LINK_DIRECTORIES}) +set(SRCS +FairMCSplitEventHeader.cxx +) + +Set(HEADERS +FairMCSplitEventHeader.h +) + Set(NO_DICT_SRCS -FairMQPrimaryGeneratorDevice.cxx -FairMQTransportDevice.cxx +devices/FairMQPrimaryGeneratorDevice.cxx +devices/FairMQTransportDevice.cxx +devices/FairMQChunkMerger.cxx ) Set(NO_DICT_HEADERS -FairMQPrimaryGeneratorDevice.h -FairMQTransportDevice.h +devices/FairMQPrimaryGeneratorDevice.h +devices/FairMQTransportDevice.h +devices/FairMQChunkMerger.h ) +Set(LINKDEF SimMQLinkDef.h) Set(LIBRARY_NAME SimMQ) Set(DEPENDENCIES Base diff --git a/examples/MQ/simulation_split/src/FairMCSplitEventHeader.cxx b/examples/MQ/simulation_split/src/FairMCSplitEventHeader.cxx new file mode 100644 index 0000000000..979df80b58 --- /dev/null +++ b/examples/MQ/simulation_split/src/FairMCSplitEventHeader.cxx @@ -0,0 +1,42 @@ +/******************************************************************************** + * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * + * * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence (LGPL) version 3, * + * copied verbatim in the file "LICENSE" * + ********************************************************************************/ + +#include "FairMCSplitEventHeader.h" + +// ----- Default constructor ------------------------------------------ +FairMCSplitEventHeader::FairMCSplitEventHeader() + : FairMCEventHeader() + , fNofChunks(1) + , fChunkStart(0) +{ +} +// ------------------------------------------------------------------------ + +// ----- Constructor with run identifier ------------------------------ +FairMCSplitEventHeader::FairMCSplitEventHeader(UInt_t runID, UInt_t eventID, UInt_t nofChunks, UInt_t chunkStart) + : FairMCEventHeader(runID) + , fNofChunks(nofChunks) + , fChunkStart(chunkStart) +{ + SetEventID(eventID); +} +// ------------------------------------------------------------------------ + +// ----- Destructor --------------------------------------------------- +FairMCSplitEventHeader::~FairMCSplitEventHeader() +{ +} +// ------------------------------------------------------------------------ + +void FairMCSplitEventHeader::Register() +{ + // Dot at the end of the name is needed for splitting!! + FairRootManager::Instance()->Register("MCEventHeader.", "Event", this, kTRUE); +} + +ClassImp(FairMCSplitEventHeader) diff --git a/examples/MQ/simulation_split/src/FairMCSplitEventHeader.h b/examples/MQ/simulation_split/src/FairMCSplitEventHeader.h new file mode 100644 index 0000000000..9d600d8deb --- /dev/null +++ b/examples/MQ/simulation_split/src/FairMCSplitEventHeader.h @@ -0,0 +1,46 @@ +/******************************************************************************** + * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * + * * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence (LGPL) version 3, * + * copied verbatim in the file "LICENSE" * + ********************************************************************************/ +/** FairMCSplitEventHeader.h **/ + + +#ifndef FAIRMCSPLITEVENTHEADER_H +#define FAIRMCSPLITEVENTHEADER_H 1 + +#include "FairMCEventHeader.h" +#include "FairRootManager.h" + +class FairMCSplitEventHeader : public FairMCEventHeader +{ + public: + + FairMCSplitEventHeader(); + + FairMCSplitEventHeader(UInt_t runID, UInt_t eventID, UInt_t nofChunks, UInt_t chunkStart); + + /** Destructor **/ + virtual ~FairMCSplitEventHeader(); + + void SetRECC(UInt_t i1, UInt_t i2, UInt_t i3, UInt_t i4) { SetRunID(i1); SetEventID(i2); SetNofChunks(i3); SetChunkStart(i4); }; + void SetNofChunks (UInt_t ti) { fNofChunks = ti; }; + void SetChunkStart(UInt_t ti) { fChunkStart = ti; }; + + UInt_t GetNofChunks () { return fNofChunks; }; + UInt_t GetChunkStart() { return fChunkStart; }; + + virtual void Register(); + + protected: + + UInt_t fNofChunks; + UInt_t fChunkStart; + + ClassDef(FairMCSplitEventHeader,1); + +}; + +#endif /* FAIRMCSPLITEVENTHEADER_H_ */ diff --git a/examples/MQ/simulation_split/src/SimMQLinkDef.h b/examples/MQ/simulation_split/src/SimMQLinkDef.h new file mode 100644 index 0000000000..bf4d19dfe4 --- /dev/null +++ b/examples/MQ/simulation_split/src/SimMQLinkDef.h @@ -0,0 +1,16 @@ +/******************************************************************************** + * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * + * * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence (LGPL) version 3, * + * copied verbatim in the file "LICENSE" * + ********************************************************************************/ +#ifdef __CINT__ + +#pragma link off all globals; +#pragma link off all classes; +#pragma link off all functions; + +#pragma link C++ class FairMCSplitEventHeader+; + +#endif diff --git a/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.cxx b/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.cxx new file mode 100644 index 0000000000..452aedbe40 --- /dev/null +++ b/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.cxx @@ -0,0 +1,184 @@ +/******************************************************************************** + * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * + * * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence (LGPL) version 3, * + * copied verbatim in the file "LICENSE" * + ********************************************************************************/ +/** + * FairMQChunkMerger.cxx + * + * @since 2016-03-21 + * @author R. Karabowicz + */ + +#include +#include + +#include "FairMQChunkMerger.h" +#include "FairMQLogger.h" + +#include "RootSerializer.h" + +#include "FairMCTrack.h" +#include "FairMCPoint.h" + +using namespace std; + +FairMQChunkMerger::FairMQChunkMerger() + : FairMQDevice() + , fInputChannelName("data-in") + , fOutputChannelName("data-out") + , fNofPartsPerEventMap() + , fObjectMap() + , fEvRIPair() + , fEvCOPair() + , fRet() + , fNofReceivedMessages(0) + , fNofSentMessages(0) + , fNofParts(3) + , fMCSplitEventHeader(NULL) +{ +} + +void FairMQChunkMerger::Init() +{ + OnData(fInputChannelName, &FairMQChunkMerger::MergeData); +} + +bool FairMQChunkMerger::MergeData(FairMQParts& parts, int /*index*/) +{ + bool printInfo = false; + int nofReceivedParts = 0; // if set to -1, the data seems to be duplicated + int nofExpectedParts = 1; + + fNofReceivedMessages++; + // dataDuplicationFlag = false; + + std::vector tcaVector; + TObject* tempObject; + for ( int ipart = 0 ; ipart < parts.Size() ; ++ipart ) { + tempObject = nullptr; + Deserialize(*parts.At(ipart),tempObject); + + // LOG(INFO) << "Got object " << tempObject->ClassName() << " named " << tempObject->GetName(); + if ( strcmp(tempObject->GetName(),"MCEventHeader.") == 0 ) { + fMCSplitEventHeader = (FairMCSplitEventHeader*)tempObject; + // LOG(info) << "GOT PART [" << fMCSplitEventHeader->GetRunID() << "][" << fMCSplitEventHeader->GetEventID() << "][" << fMCSplitEventHeader->GetChunkStart() << "]"; + fEvRIPair.first = fMCSplitEventHeader->GetEventID(); + fEvRIPair.second = fMCSplitEventHeader->GetRunID(); + fEvCOPair.first = fMCSplitEventHeader->GetChunkStart(); + nofExpectedParts = fMCSplitEventHeader->GetNofChunks(); + + fRet = fObjectMap.equal_range(fEvRIPair); + for ( MultiMapDef::iterator it = fRet.first ; it != fRet.second ; ++it ) { + // LOG(info) << "comparing " << it->second.first << " and " << fEvCOPair.first; + if ( it->second.first == fMCSplitEventHeader->GetChunkStart() ) + LOG(fatal) << "got part starting at " << fEvCOPair.first << " again!!!"; + } + + std::map,int>::iterator it2; + it2 = fNofPartsPerEventMap.find(fEvRIPair); + if ( it2 == fNofPartsPerEventMap.end() ) { + fNofPartsPerEventMap[fEvRIPair] = 1; + nofReceivedParts = 1; + } + else { + it2->second+=1; + nofReceivedParts = it2->second; + } + } + else { + tcaVector.push_back((TClonesArray*)tempObject); + } + } + + // not all parts are there yet, have to put them in buffer + if ( nofReceivedParts != nofExpectedParts ) { + // LOG(info) << "not all parts are yet here (got " << nofReceivedParts << " out of " << nofExpectedParts << ")... adding to (size = " << fObjectMap.size() << ")"; + // LOG(info) << "+" << fMCSplitEventHeader->GetName() << "[" << fEvRIPair.second << "][" << fEvRIPair.first << "][" << fEvCOPair.first << "]"; + for ( int iarray = 0 ; iarray < tcaVector.size() ; iarray++ ) { + // LOG(info) << "+" << tcaVector[iarray]->GetName() << "[" << fEvRIPair.second << "][" << fEvRIPair.first << "][" << fEvCOPair.first << "]"; + fEvCOPair.second = ((TObject*)tcaVector[iarray]); + fObjectMap.insert(std::pair,std::pair>(fEvRIPair,fEvCOPair)); + } + // LOG(info) << " now we have fObjectMap (size = " << fObjectMap.size() << ")"; + if ( printInfo) + LOG(info) << ">> [" << fMCSplitEventHeader->GetRunID() << "][" << fMCSplitEventHeader->GetEventID() << "][" << fMCSplitEventHeader->GetChunkStart() << "] Received: " << fNofReceivedMessages << " // Buffered: " << fObjectMap.size() << " // Sent: " << fNofSentMessages << " <<"; + } + else { + // got all the parts of the event, have to combine and send message, consisting of objects from fObjectMap + int currentEventPart = fMCSplitEventHeader->GetChunkStart(); + fRet = fObjectMap.equal_range(fEvRIPair); + std::vector trackShift; + for ( int iarray = 0 ; iarray < tcaVector.size() ; iarray++ ) { + if ( strcmp(tcaVector[iarray]->GetName(),"MCTrack") != 0 ) continue; // want only MCTrack array to renumber tracks and get track shifts... + // LOG(info) << "BEFORE ADDING, TCA \"" << tcaVector[iarray]->GetName() << "\" has " << tcaVector[iarray]->GetEntries() << " entries."; + TClonesArray* arrayToAdd; + for ( MultiMapDef::iterator it = fRet.first ; it != fRet.second ; ++it ) { + if ( it->second.first == fMCSplitEventHeader->GetChunkStart() ) continue; + if ( strcmp(tcaVector[iarray]->GetName(),it->second.second->GetName()) == 0 ) { + trackShift.push_back(tcaVector[iarray]->GetEntries()); + arrayToAdd = (TClonesArray*)it->second.second; + for ( int iobj = 0 ; iobj < arrayToAdd->GetEntries() ; ++iobj ) { + FairMCTrack* temp = (FairMCTrack*)arrayToAdd->At(iobj); + if ( temp->GetMotherId() >= 0 ) { + temp->SetMotherId(temp->GetMotherId()+trackShift.back()); + } + } + tcaVector[iarray]->AbsorbObjects(arrayToAdd); + // LOG(info) << "FOUND ONE!, TCA has now " << tcaVector[iarray]->GetEntries() << " entries."; + } + } + } + + for ( int iarray = 0 ; iarray < tcaVector.size() ; iarray++ ) { + if ( strcmp(tcaVector[iarray]->GetName(),"MCTrack") == 0 ) continue; // MCTrack already done, renumber all _other_ arrays... + // LOG(info) << "BEFORE ADDING, TCA \"" << tcaVector[iarray]->GetName() << "\" has " << tcaVector[iarray]->GetEntries() << " entries."; + int addedArray = 0; + TClonesArray* arrayToAdd; + + for ( MultiMapDef::iterator it = fRet.first ; it != fRet.second ; ++it ) { + if ( it->second.first == fMCSplitEventHeader->GetChunkStart() ) continue; + if ( strcmp(tcaVector[iarray]->GetName(),it->second.second->GetName()) == 0 ) { + int objShift = trackShift[addedArray++]; + // LOG(INFO) << "trying to add " << tcaVector[iarray]->GetName() << " and " << it->second.second->GetName() << "(shift = " << objShift << ")"; + arrayToAdd = (TClonesArray*)it->second.second; + for ( int iobj = 0 ; iobj < arrayToAdd->GetEntries() ; ++iobj ) { + FairMCPoint* temp = (FairMCPoint*)arrayToAdd->At(iobj); + temp->SetTrackID(temp->GetTrackID()+objShift); + } + } + tcaVector[iarray]->AbsorbObjects(arrayToAdd); + // LOG(info) << "FOUND ONE!, TCA has now " << tcaVector[iarray]->GetEntries() << " entries."; + } + } + fObjectMap.erase(fRet.first,fRet.second); + + FairMQParts partsOut; + + fMCSplitEventHeader->SetNofChunks(1); + fMCSplitEventHeader->SetChunkStart(0); + + FairMQMessagePtr messEH(NewMessage()); + Serialize(*messEH,fMCSplitEventHeader); + partsOut.AddPart(std::move(messEH)); + + for ( int iarray = 0 ; iarray < tcaVector.size() ; iarray++ ) { + FairMQMessagePtr mess(NewMessage()); + Serialize(*mess,tcaVector[iarray]); + partsOut.AddPart(std::move(mess)); + } + // LOG(info) << "created output message with " << partsOut.Size() << " parts."; + Send(partsOut, fOutputChannelName); + fNofSentMessages++; + if ( printInfo ) + LOG(info) << ">> [" << fMCSplitEventHeader->GetRunID() << "][" << fMCSplitEventHeader->GetEventID() << "][" << fMCSplitEventHeader->GetChunkStart() << "] Received: " << fNofReceivedMessages << " // Buffered: " << fObjectMap.size() << " // Sent: " << fNofSentMessages << " <<"; + } + + return true; +} + +FairMQChunkMerger::~FairMQChunkMerger() +{ +} diff --git a/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.h b/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.h new file mode 100644 index 0000000000..25928a4e85 --- /dev/null +++ b/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.h @@ -0,0 +1,62 @@ +/******************************************************************************** + * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * + * * + * This software is distributed under the terms of the * + * GNU Lesser General Public Licence (LGPL) version 3, * + * copied verbatim in the file "LICENSE" * + ********************************************************************************/ +/** + * FairMQChunkMerger.h + * + * @since 2018-09-28 + * @author R. Karabowicz + */ + +#ifndef FAIRMQCHUNKMERGER_H_ +#define FAIRMQCHUNKMERGER_H_ + +#include "TClonesArray.h" +#include "TFile.h" +#include "TFolder.h" +#include "TTree.h" +#include "FairMCSplitEventHeader.h" + +#include "FairMQDevice.h" + +typedef std::multimap,std::pair> MultiMapDef; + +class FairMQChunkMerger : public FairMQDevice +{ + public: + FairMQChunkMerger(); + virtual ~FairMQChunkMerger(); + + void SetNofParts(int iparts) { fNofParts = iparts; } + + protected: + bool MergeData(FairMQParts&, int); + virtual void Init(); + + private: + + std::string fInputChannelName; + std::string fOutputChannelName; + + std::map ,int> fNofPartsPerEventMap; // number of parts for pair + MultiMapDef fObjectMap; // TObjects for given pairpart> + + std::pair fEvRIPair; + std::pair fEvCOPair; + std::pair fRet; + + int fNofReceivedMessages; + int fNofSentMessages; + + int fNofParts; + FairMCSplitEventHeader* fMCSplitEventHeader; + + FairMQChunkMerger(const FairMQChunkMerger&); + FairMQChunkMerger& operator=(const FairMQChunkMerger&); +}; + +#endif /* FAIRMQCHUNKMERGER_H_ */ diff --git a/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.cxx b/examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.cxx similarity index 57% rename from examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.cxx rename to examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.cxx index c2bdc77311..15d2285bac 100644 --- a/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.cxx +++ b/examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.cxx @@ -18,12 +18,12 @@ #include "FairMQMessage.h" #include "FairMQProgOptions.h" -#include "FairMCEventHeader.h" +#include "FairMCSplitEventHeader.h" + #include "FairRootManager.h" #include "FairRunSim.h" #include "FairRuntimeDb.h" -#include "FairEventHeader.h" #include "FairModule.h" #include "FairPrimaryGenerator.h" #include "FairParRootFileIo.h" @@ -51,6 +51,8 @@ FairMQPrimaryGeneratorDevice::FairMQPrimaryGeneratorDevice() , fPrimaryGenerator(NULL) , fMCEventHeader(NULL) , fStack(NULL) + , fChunkSize(-1) + , fChunkPointer(0) { } @@ -81,24 +83,58 @@ bool FairMQPrimaryGeneratorDevice::Reply(FairMQMessagePtr& mPtr, int /*index*/) } bool FairMQPrimaryGeneratorDevice::GenerateAndSendData() { - fStack->Reset(); - fPrimaryGenerator->GenerateEvent(fStack); + if ( fChunkPointer == 0 ) { // only change fChunkPointer if fChunkSize is different from -1 + LOG(INFO) << "Reseting fStack and generating new event!!!"; + fStack->Reset(); + fPrimaryGenerator->GenerateEvent(fStack); + ++fEventCounter; + } + if ( fEventCounter > fNofEvents ) + return false; + + if ( fChunkSize > 0 ) { // should send events in chunks with maximum size of fChunkSize + // shouldn't do much before, just sent from fChunkPointer to fChunkPointer+fChunkSize + } + + FairMQParts parts; + // even if sending in chunks is set, send all of the primaries anyway, the transporter takes care of transporting needed primaries + // create FairMCEventHeader, misuse not-yet-set fRunID to store begin TClonesArray* prims = fStack->GetListOfParticles(); + FairMCSplitEventHeader* meh = new FairMCSplitEventHeader(123456,fEventCounter,1,0); + meh->SetNPrim(prims->GetEntries()); + if ( fChunkSize > 0 ) { + meh->SetNPrim(fChunkPointer+fChunkSize); + meh->SetNofChunks ((UInt_t)(prims->GetEntries()/fChunkSize)); + meh->SetChunkStart(fChunkPointer); + if ( fChunkPointer+fChunkSize > prims->GetEntries() ) + meh->SetNPrim(prims->GetEntries()-fChunkPointer); + } + + FairMQMessagePtr messEH(NewMessage()); + Serialize(*messEH,meh); + parts.AddPart(std::move(messEH)); + FairMQMessagePtr mess(NewMessage()); Serialize(*mess,prims); + parts.AddPart(std::move(mess)); - if (Send(mess, fGeneratorChannelName) > 0) + LOG(INFO) << "sending event " << fEventCounter << ", chunk starts at " << fChunkPointer; + if (Send(parts, fGeneratorChannelName) > 0) { } int numberofparts = (int)prims->GetEntries(); - fEventCounter++; + if ( fChunkSize > 0 ) { // should send events in chunks with maximum size of fChunkSize + // the whole work should be done after + fChunkPointer += fChunkSize; + if ( fChunkPointer >= numberofparts ) { // it means that already sent all primaries from this event + fChunkPointer = 0; // this will cause the reset of the stack and generating new event + } + } - if ( fEventCounter >= fNofEvents ) - return false; return true; } diff --git a/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.h b/examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.h similarity index 90% rename from examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.h rename to examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.h index 2886c1e3f0..245c1c372c 100644 --- a/examples/MQ/simulation_split/devices/FairMQPrimaryGeneratorDevice.h +++ b/examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.h @@ -42,6 +42,8 @@ class FairMQPrimaryGeneratorDevice : public FairMQDevice void SetNofEvents (int64_t nofev) { fNofEvents = nofev;}; void SetGenerator (FairPrimaryGenerator* primGen) { fPrimaryGenerator = primGen;}; + void SetChunkSize(int64_t ti) { fChunkSize = ti;}; + void RunInPushMode(bool tb=true) { fRunConditional = tb; }; void RunInRepMode (bool tb=true) { fRunConditional = !tb; }; @@ -63,6 +65,9 @@ class FairMQPrimaryGeneratorDevice : public FairMQDevice int64_t fNofEvents; int64_t fEventCounter; + int64_t fChunkSize; // to set the maximal number of primaries sent in one bunch + int64_t fChunkPointer; // to set the first primary to be sent + bool GenerateAndSendData(); void SendObject(TObject* obj, std::string chan); diff --git a/examples/MQ/simulation_split/devices/FairMQTransportDevice.cxx b/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.cxx similarity index 73% rename from examples/MQ/simulation_split/devices/FairMQTransportDevice.cxx rename to examples/MQ/simulation_split/src/devices/FairMQTransportDevice.cxx index cfb3eace09..9c799e87a5 100644 --- a/examples/MQ/simulation_split/devices/FairMQTransportDevice.cxx +++ b/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.cxx @@ -20,7 +20,7 @@ #include "FairOnlineSink.h" -#include "FairMCEventHeader.h" +#include "FairMCSplitEventHeader.h" #include "FairRootManager.h" #include "FairRunSim.h" #include "FairRuntimeDb.h" @@ -65,6 +65,7 @@ FairMQTransportDevice::FairMQTransportDevice() , fVMC(NULL) , fStack(NULL) , fMCApplication(NULL) + , fMCSplitEventHeader(NULL) { } @@ -78,6 +79,14 @@ void FairMQTransportDevice::InitTask() { fRunSim = new FairRunSim(); + LOG(INFO) << "SETTING EventHeader TO FairMCSplitEventHeader!"; + fMCSplitEventHeader = new FairMCSplitEventHeader(777777,0,0,0); + fRunSim->SetMCEventHeader(fMCSplitEventHeader); + fRunSim->SetRunId(fRunSim->GetMCEventHeader()->GetRunID()); + LOG(INFO) << "AFTER SETTING run id = " << fRunSim->GetRunId(); + LOG(INFO) << "or maybe via meh = " << fRunSim->GetMCEventHeader()->GetRunID(); + LOG(INFO) << " name/title/classname = " << fRunSim->GetMCEventHeader()->GetName() << "/" << fRunSim->GetMCEventHeader()->GetTitle() << "/" << fRunSim->GetMCEventHeader()->ClassName(); + fRunSim->SetSink(fSink); if ( fFirstParameter || fSecondParameter ) { @@ -122,7 +131,7 @@ void FairMQTransportDevice::InitTask() askForRunNumber)); std::unique_ptr rep(NewMessage()); - unsigned int runId = 0; + /* unsigned int runId = 0; if (Send(req, fUpdateChannelName) > 0) { if (Receive(rep, fUpdateChannelName) > 0) @@ -136,7 +145,8 @@ void FairMQTransportDevice::InitTask() } } // ------------------------------------------------------------------------ - + */ + fRunSim->SetStoreTraj(fStoreTrajFlag); // ----- Set tasks ---------------------------------------------------- @@ -146,18 +156,24 @@ void FairMQTransportDevice::InitTask() } } // ------------------------------------------------------------------------ + LOG(INFO) << "before frun->init() run id = " << fRunSim->GetMCEventHeader()->GetRunID(); // ----- Initialize simulation run ------------------------------------ - fRunSim->SetRunId(runId); // run n simulations with same run id - offset the event number + // fRunSim->SetRunId(runId); // run n simulations with same run id - offset the event number fRunSim->Init(); // ------------------------------------------------------------------------ + LOG(INFO) << "after frun->init() run id = " << fRunSim->GetMCEventHeader()->GetRunID(); + fVMC = TVirtualMC::GetMC(); fMCApplication = FairMCApplication::Instance(); fStack = fMCApplication->GetStack(); fStack->Register(); // fRunSim->Run(0); UpdateParameterServer(); + LOG(INFO) << "end of FairMQTransportDevice::InitTask() run id = " << fRunSim->GetMCEventHeader()->GetRunID(); + LOG(INFO) << " name/title/classname = " << fRunSim->GetMCEventHeader()->GetName() << "/" << fRunSim->GetMCEventHeader()->GetTitle() << "/" << fRunSim->GetMCEventHeader()->ClassName(); + } void FairMQTransportDevice::PreRun() @@ -173,24 +189,46 @@ bool FairMQTransportDevice::ConditionalRun() requestString->length(), [](void* /*data*/, void* object) { delete static_cast(object); }, requestString)); - FairMQMessagePtr rep(NewMessage()); + FairMQParts parts; + // FairMQMessagePtr rep(NewMessage()); if (Send(req, fGeneratorChannelName) > 0) { - if (Receive(rep, fGeneratorChannelName) > 0) + if (Receive(parts, fGeneratorChannelName) > 0) { - return TransportData(rep,0); + return TransportData(parts,0); } } return false; } -bool FairMQTransportDevice::TransportData(FairMQMessagePtr& mPtr, int /*index*/) +// bool FairMQTransportDevice::TransportData(FairMQMessagePtr& mPtr, int /*index*/) +// { +// TClonesArray* chunk = nullptr; +// Deserialize(*mPtr, chunk); +// fStack->SetParticleArray(chunk); +// fVMC->ProcessRun(1); + +// return true; +// } + +bool FairMQTransportDevice::TransportData(FairMQParts& mParts, int /*index*/) { - TClonesArray* chunk = nullptr; - Deserialize(*mPtr, chunk); - fStack->SetParticleArray(chunk); - fVMC->ProcessRun(1); + TClonesArray* chunk = nullptr; + FairMCSplitEventHeader* meh = nullptr; + for ( int ipart = 0 ; ipart < mParts.Size() ; ipart++ ) { + TObject* obj = nullptr; + Deserialize(*mParts.At(ipart),obj); + if (strcmp(obj->GetName(),"MCEvent") == 0) + meh = (FairMCSplitEventHeader*)obj; + else if (strcmp(obj->GetName(),"TParticles") == 0) + chunk = (TClonesArray*)obj; + } + if ( chunk != nullptr ) { + fStack->SetParticleArray(chunk,meh->GetChunkStart(),meh->GetNPrim()); + fMCSplitEventHeader->SetRECC(meh->GetRunID(),meh->GetEventID(),meh->GetNofChunks(),meh->GetChunkStart()); + fVMC->ProcessRun(1); + } return true; } diff --git a/examples/MQ/simulation_split/devices/FairMQTransportDevice.h b/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.h similarity index 95% rename from examples/MQ/simulation_split/devices/FairMQTransportDevice.h rename to examples/MQ/simulation_split/src/devices/FairMQTransportDevice.h index 163bc9ed59..f5943d2e70 100644 --- a/examples/MQ/simulation_split/devices/FairMQTransportDevice.h +++ b/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.h @@ -21,7 +21,7 @@ #include "FairMQRunDevice.h" -class FairEventHeader; +class FairMCSplitEventHeader; class FairRunSim; class FairField; class FairParIo; @@ -60,8 +60,8 @@ class FairMQTransportDevice : public FairMQRunDevice void RunInReqMode (bool tb=true) { fRunConditional = tb; }; protected: - // bool TransportData(FairMQParts&, int); - bool TransportData(FairMQMessagePtr&, int); + bool TransportData(FairMQParts&, int); + // bool TransportData(FairMQMessagePtr&, int); virtual void Init(); virtual void InitTask(); virtual void PreRun(); @@ -94,6 +94,8 @@ class FairMQTransportDevice : public FairMQRunDevice FairSink* fSink; // ------ ---------- -------- ------ + FairMCSplitEventHeader* fMCSplitEventHeader; + void UpdateParameterServer(); FairMQTransportDevice(const FairMQTransportDevice&); diff --git a/examples/common/mcstack/FairStack.cxx b/examples/common/mcstack/FairStack.cxx index 4e3e2b8386..40520a5715 100644 --- a/examples/common/mcstack/FairStack.cxx +++ b/examples/common/mcstack/FairStack.cxx @@ -230,7 +230,7 @@ void FairStack::FillTrackArray() // --> Loop over fParticles array and copy selected tracks for (Int_t iPart=0; iPartAt(ipart)))->SetUniqueID(fNPrimaries); + ((TParticle*)(partArray->At(ipart)))->SetStatusCode(fNPrimaries); + fStack.push((TParticle*)partArray->At(ipart)); + AddParticle((TParticle*)partArray->At(ipart)); + fNParticles++; + fNPrimaries++; + } + } + /** Clone this object (used in MT mode only) */ virtual FairGenericStack* CloneStack() const { return new FairStack(); } From 48fc05cb585740955ee8a51e59620281000c8d02 Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Tue, 2 Oct 2018 15:00:18 +0200 Subject: [PATCH 05/27] examples/MQ/pixelDetector Moving from TMessage to RootSerializer. --- .../MQ/pixelDetector/src/devices/FairMQPixelFileSink.cxx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/examples/MQ/pixelDetector/src/devices/FairMQPixelFileSink.cxx b/examples/MQ/pixelDetector/src/devices/FairMQPixelFileSink.cxx index f4336e2352..325ecf758b 100644 --- a/examples/MQ/pixelDetector/src/devices/FairMQPixelFileSink.cxx +++ b/examples/MQ/pixelDetector/src/devices/FairMQPixelFileSink.cxx @@ -75,11 +75,10 @@ bool FairMQPixelFileSink::StoreData(FairMQParts& parts, int /*index*/) } - // LOG(INFO) << "Got message with " << parts.Size() << " parts:"; for ( int ipart = 0 ; ipart < parts.Size() ; ipart++ ) { - PixelTMessage tm(parts.At(ipart)->GetData(), parts.At(ipart)->GetSize()); - tempObjects.push_back((TObject*)tm.ReadObject(tm.GetClass())); - fOutputObjects[ipart] = tempObjects.back(); + fOutputObjects[ipart] = nullptr; + Deserialize (*parts.At(ipart),fOutputObjects[ipart]); + tempObjects.push_back(fOutputObjects[ipart]); if ( creatingTree ) fTree->Branch(tempObjects.back()->GetName(),tempObjects.back()->ClassName(),&fOutputObjects[ipart]); fTree->SetBranchAddress(tempObjects.back()->GetName(),&fOutputObjects[ipart]); From d9591137143c31270b79bc56abeca7c14cf4cdda Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Tue, 2 Oct 2018 17:15:27 +0200 Subject: [PATCH 06/27] examples/MQ pixelDetector - further replacement of TMessage with RootSerializer. simulation_split - reducing verbosity. --- .../src/devices/FairMQPixelSampler.cxx | 1 - .../src/devices/FairMQRunDevice.cxx | 19 ++++++------------- examples/MQ/simulation_split/run/runMQGen.cxx | 2 +- .../src/devices/FairMQChunkMerger.cxx | 8 ++++++-- .../devices/FairMQPrimaryGeneratorDevice.cxx | 4 ++-- 5 files changed, 15 insertions(+), 19 deletions(-) diff --git a/examples/MQ/pixelDetector/src/devices/FairMQPixelSampler.cxx b/examples/MQ/pixelDetector/src/devices/FairMQPixelSampler.cxx index 02bb633d33..e998d7610f 100644 --- a/examples/MQ/pixelDetector/src/devices/FairMQPixelSampler.cxx +++ b/examples/MQ/pixelDetector/src/devices/FairMQPixelSampler.cxx @@ -94,7 +94,6 @@ bool FairMQPixelSampler::ConditionalRun() if ( readEventReturn != 0 ) return false; - TMessage* message[1000]; FairMQParts parts; for ( int iobj = 0 ; iobj < fNObjects ; iobj++ ) { diff --git a/examples/MQ/pixelDetector/src/devices/FairMQRunDevice.cxx b/examples/MQ/pixelDetector/src/devices/FairMQRunDevice.cxx index 6e3885a6d8..7adea3cedd 100644 --- a/examples/MQ/pixelDetector/src/devices/FairMQRunDevice.cxx +++ b/examples/MQ/pixelDetector/src/devices/FairMQRunDevice.cxx @@ -38,7 +38,7 @@ #include "TList.h" #include "TObjString.h" #include "TObjArray.h" -#include "TMessage.h" +#include "RootSerializer.h" using namespace std; @@ -48,13 +48,9 @@ FairMQRunDevice::FairMQRunDevice() } void FairMQRunDevice::SendObject(TObject* obj, std::string chan) { - TMessage* tmsg = new TMessage(kMESS_OBJECT); - tmsg->WriteObject(obj); + FairMQMessagePtr mess(NewMessage()); + Serialize(*mess,obj); - FairMQMessagePtr mess(NewMessage(tmsg->Buffer(), - tmsg->BufferSize(), - [](void* /*data*/, void* object){ delete static_cast(object); }, - tmsg)); std::unique_ptr rep(NewMessage()); printf ("sending %s",obj->GetName()); @@ -94,12 +90,9 @@ void FairMQRunDevice::SendBranches() if ( mi.first.find(modifiedBranchName) != std::string::npos || mi.first.find("#all#") != std::string::npos ) { TObject* object = (FairRootManager::Instance()->GetObject(ObjStr->GetString()))->Clone(); - TMessage* message = new TMessage(kMESS_OBJECT); - message->WriteObject(object); - parts.AddPart(NewMessage(message->Buffer(), - message->BufferSize(), - [](void* /*data*/, void* hint) { delete (TMessage*)hint;}, - message)); + FairMQMessagePtr mess(NewMessage()); + Serialize(*mess,object); + parts.AddPart(std::move(mess)); LOG(DEBUG) << "channel >" << mi.first.data() << "< --> >" << ObjStr->GetString().Data() << "<"; } } diff --git a/examples/MQ/simulation_split/run/runMQGen.cxx b/examples/MQ/simulation_split/run/runMQGen.cxx index 5208deecd6..ef48c1cabc 100644 --- a/examples/MQ/simulation_split/run/runMQGen.cxx +++ b/examples/MQ/simulation_split/run/runMQGen.cxx @@ -43,7 +43,7 @@ FairMQDevicePtr getDevice(const FairMQProgOptions& config) FairPrimaryGenerator* primGen = new FairPrimaryGenerator(); FairBoxGenerator* boxGen = new FairBoxGenerator(partPdgC[chosenPart], 100); boxGen->SetPRange(1,2); - boxGen->SetThetaRange(0,180); + boxGen->SetThetaRange(0,40); boxGen->SetPhiRange(0,360); primGen->AddGenerator(boxGen); diff --git a/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.cxx b/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.cxx index 452aedbe40..8ce35e796d 100644 --- a/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.cxx +++ b/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.cxx @@ -98,7 +98,7 @@ bool FairMQChunkMerger::MergeData(FairMQParts& parts, int /*index*/) // LOG(info) << "not all parts are yet here (got " << nofReceivedParts << " out of " << nofExpectedParts << ")... adding to (size = " << fObjectMap.size() << ")"; // LOG(info) << "+" << fMCSplitEventHeader->GetName() << "[" << fEvRIPair.second << "][" << fEvRIPair.first << "][" << fEvCOPair.first << "]"; for ( int iarray = 0 ; iarray < tcaVector.size() ; iarray++ ) { - // LOG(info) << "+" << tcaVector[iarray]->GetName() << "[" << fEvRIPair.second << "][" << fEvRIPair.first << "][" << fEvCOPair.first << "]"; + LOG(debug) << "+ [" << fEvRIPair.second << "][" << fEvRIPair.first << "][" << fEvCOPair.first << "] " << tcaVector[iarray]->GetName(); fEvCOPair.second = ((TObject*)tcaVector[iarray]); fObjectMap.insert(std::pair,std::pair>(fEvRIPair,fEvCOPair)); } @@ -111,6 +111,7 @@ bool FairMQChunkMerger::MergeData(FairMQParts& parts, int /*index*/) int currentEventPart = fMCSplitEventHeader->GetChunkStart(); fRet = fObjectMap.equal_range(fEvRIPair); std::vector trackShift; + LOG(debug) << "- [" << fEvRIPair.second << "][" << fEvRIPair.first << "][ALL]"; for ( int iarray = 0 ; iarray < tcaVector.size() ; iarray++ ) { if ( strcmp(tcaVector[iarray]->GetName(),"MCTrack") != 0 ) continue; // want only MCTrack array to renumber tracks and get track shifts... // LOG(info) << "BEFORE ADDING, TCA \"" << tcaVector[iarray]->GetName() << "\" has " << tcaVector[iarray]->GetEntries() << " entries."; @@ -175,7 +176,10 @@ bool FairMQChunkMerger::MergeData(FairMQParts& parts, int /*index*/) if ( printInfo ) LOG(info) << ">> [" << fMCSplitEventHeader->GetRunID() << "][" << fMCSplitEventHeader->GetEventID() << "][" << fMCSplitEventHeader->GetChunkStart() << "] Received: " << fNofReceivedMessages << " // Buffered: " << fObjectMap.size() << " // Sent: " << fNofSentMessages << " <<"; } - + + for( MultiMapDef::iterator it = fObjectMap.begin() ; it != fObjectMap.end() ; it++ ) { + LOG(debug) << "= [" << it->first.second << "][" << it->first.first << "][" << it->second.first << "] " << it->second.second->GetName(); + } return true; } diff --git a/examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.cxx b/examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.cxx index 15d2285bac..f9d41f923a 100644 --- a/examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.cxx +++ b/examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.cxx @@ -84,7 +84,7 @@ bool FairMQPrimaryGeneratorDevice::Reply(FairMQMessagePtr& mPtr, int /*index*/) bool FairMQPrimaryGeneratorDevice::GenerateAndSendData() { if ( fChunkPointer == 0 ) { // only change fChunkPointer if fChunkSize is different from -1 - LOG(INFO) << "Reseting fStack and generating new event!!!"; + // LOG(INFO) << "Reseting fStack and generating new event!!!"; fStack->Reset(); fPrimaryGenerator->GenerateEvent(fStack); ++fEventCounter; @@ -120,7 +120,7 @@ bool FairMQPrimaryGeneratorDevice::GenerateAndSendData() { Serialize(*mess,prims); parts.AddPart(std::move(mess)); - LOG(INFO) << "sending event " << fEventCounter << ", chunk starts at " << fChunkPointer; + // LOG(INFO) << "sending event " << fEventCounter << ", chunk starts at " << fChunkPointer; if (Send(parts, fGeneratorChannelName) > 0) { } From 037698acbcdbec8b1500174e71058f3c92a0dbc3 Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Thu, 4 Oct 2018 16:00:21 +0200 Subject: [PATCH 07/27] examples/MQ/simulation_split TransportDevice gets the RunId from the parameter server. --- .../devices/FairMQPrimaryGeneratorDevice.cxx | 2 +- .../src/devices/FairMQTransportDevice.cxx | 22 ++++++------------- .../src/devices/FairMQTransportDevice.h | 1 + 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.cxx b/examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.cxx index f9d41f923a..a2af0abb12 100644 --- a/examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.cxx +++ b/examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.cxx @@ -102,7 +102,7 @@ bool FairMQPrimaryGeneratorDevice::GenerateAndSendData() { // create FairMCEventHeader, misuse not-yet-set fRunID to store begin TClonesArray* prims = fStack->GetListOfParticles(); - FairMCSplitEventHeader* meh = new FairMCSplitEventHeader(123456,fEventCounter,1,0); + FairMCSplitEventHeader* meh = new FairMCSplitEventHeader(0,fEventCounter,1,0); // RunId will be provided in the Transport from ParameterServer meh->SetNPrim(prims->GetEntries()); if ( fChunkSize > 0 ) { meh->SetNPrim(fChunkPointer+fChunkSize); diff --git a/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.cxx b/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.cxx index 9c799e87a5..416ce72850 100644 --- a/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.cxx +++ b/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.cxx @@ -49,6 +49,7 @@ using namespace std; FairMQTransportDevice::FairMQTransportDevice() : FairMQRunDevice() , fRunConditional(false) + , fRunId(0) , fTransportDeviceId(0) , fGeneratorChannelName("primariesChannel") , fRunSim(NULL) @@ -79,13 +80,9 @@ void FairMQTransportDevice::InitTask() { fRunSim = new FairRunSim(); - LOG(INFO) << "SETTING EventHeader TO FairMCSplitEventHeader!"; - fMCSplitEventHeader = new FairMCSplitEventHeader(777777,0,0,0); + fMCSplitEventHeader = new FairMCSplitEventHeader(fRunId,0,0,0); fRunSim->SetMCEventHeader(fMCSplitEventHeader); fRunSim->SetRunId(fRunSim->GetMCEventHeader()->GetRunID()); - LOG(INFO) << "AFTER SETTING run id = " << fRunSim->GetRunId(); - LOG(INFO) << "or maybe via meh = " << fRunSim->GetMCEventHeader()->GetRunID(); - LOG(INFO) << " name/title/classname = " << fRunSim->GetMCEventHeader()->GetName() << "/" << fRunSim->GetMCEventHeader()->GetTitle() << "/" << fRunSim->GetMCEventHeader()->ClassName(); fRunSim->SetSink(fSink); @@ -131,21 +128,20 @@ void FairMQTransportDevice::InitTask() askForRunNumber)); std::unique_ptr rep(NewMessage()); - /* unsigned int runId = 0; if (Send(req, fUpdateChannelName) > 0) { if (Receive(rep, fUpdateChannelName) > 0) { std::string repString = string(static_cast(rep->GetData()), rep->GetSize()); LOG(INFO) << " -> " << repString.data(); - runId = stoi(repString); + fRunId = stoi(repString); + fMCSplitEventHeader->SetRunID(fRunId); repString = repString.substr(repString.find_first_of('_')+1,repString.length()); fTransportDeviceId = stoi(repString); - LOG(INFO) << "runId = " << runId << " /// fTransportDeviceId = " << fTransportDeviceId; + LOG(INFO) << "runId = " << fRunId << " /// fTransportDeviceId = " << fTransportDeviceId; } } // ------------------------------------------------------------------------ - */ fRunSim->SetStoreTraj(fStoreTrajFlag); @@ -156,15 +152,11 @@ void FairMQTransportDevice::InitTask() } } // ------------------------------------------------------------------------ - LOG(INFO) << "before frun->init() run id = " << fRunSim->GetMCEventHeader()->GetRunID(); - // ----- Initialize simulation run ------------------------------------ - // fRunSim->SetRunId(runId); // run n simulations with same run id - offset the event number + // fRunSim->SetRunId(fRunId); // run n simulations with same run id - offset the event number fRunSim->Init(); // ------------------------------------------------------------------------ - LOG(INFO) << "after frun->init() run id = " << fRunSim->GetMCEventHeader()->GetRunID(); - fVMC = TVirtualMC::GetMC(); fMCApplication = FairMCApplication::Instance(); fStack = fMCApplication->GetStack(); @@ -226,7 +218,7 @@ bool FairMQTransportDevice::TransportData(FairMQParts& mParts, int /*index*/) } if ( chunk != nullptr ) { fStack->SetParticleArray(chunk,meh->GetChunkStart(),meh->GetNPrim()); - fMCSplitEventHeader->SetRECC(meh->GetRunID(),meh->GetEventID(),meh->GetNofChunks(),meh->GetChunkStart()); + fMCSplitEventHeader->SetRECC(fRunId,meh->GetEventID(),meh->GetNofChunks(),meh->GetChunkStart()); fVMC->ProcessRun(1); } diff --git a/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.h b/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.h index f5943d2e70..19d8f3b582 100644 --- a/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.h +++ b/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.h @@ -69,6 +69,7 @@ class FairMQTransportDevice : public FairMQRunDevice virtual bool ConditionalRun(); private: + UInt_t fRunId; UInt_t fTransportDeviceId; std::string fGeneratorChannelName; std::string fUpdateChannelName; From afa965c2ee103e1f75eb4972c8c0a62775d2d9dd Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Tue, 9 Oct 2018 13:11:33 +0200 Subject: [PATCH 08/27] examples/ MQ/simulation_split/runMQTrans.cxx lets user specify detector libraries; MQ/simulation_split/FairMQTransportDevice loads libraries requested by user and executes extern C ExternCreateDetector() function, which adds specific detector to FairRunSim; MQ/pixelDetector/Pixel.cxx simulation/Tutoria1/FairTutorialDet1.cxx - introduced the extern C ExternCreateDetector() function; --- examples/MQ/pixelDetector/src/Pixel.cxx | 14 +++++++ .../MQ/simulation_split/run/runMQTrans.cxx | 7 ++-- .../src/devices/FairMQTransportDevice.cxx | 37 +++++++++++++++++++ .../Tutorial1/src/FairTutorialDet1.cxx | 14 +++++++ 4 files changed, 69 insertions(+), 3 deletions(-) diff --git a/examples/MQ/pixelDetector/src/Pixel.cxx b/examples/MQ/pixelDetector/src/Pixel.cxx index 7137afcfd3..17193de250 100644 --- a/examples/MQ/pixelDetector/src/Pixel.cxx +++ b/examples/MQ/pixelDetector/src/Pixel.cxx @@ -20,6 +20,7 @@ #include "FairGeoVolume.h" // for FairGeoVolume #include "FairRootManager.h" // for FairRootManager #include "FairRun.h" // for FairRun +#include "FairRunSim.h" // for FairRunSim #include "FairRuntimeDb.h" // for FairRuntimeDb #include "FairStack.h" // for FairStack #include "FairVolume.h" // for FairVolume @@ -260,4 +261,17 @@ PixelPoint* Pixel::AddHit(Int_t trackID, Int_t detID, time, length, eLoss); } +extern "C" void ExternCreateDetector() { + using std::cout; + using std::endl; + + cout << "-- ExternCreateDetector() START --" << endl; + FairRunSim* run = FairRunSim::Instance(); + + Pixel* det = new Pixel("PixelDetector", kTRUE); + det->SetGeometryFileName("pixel.geo"); + run->AddModule(det); + cout << "-- ExternCreateDetector(" << det->GetName() << ") DONE --" << endl; +} + ClassImp(Pixel) diff --git a/examples/MQ/simulation_split/run/runMQTrans.cxx b/examples/MQ/simulation_split/run/runMQTrans.cxx index 6777d01abb..75a135be1e 100644 --- a/examples/MQ/simulation_split/run/runMQTrans.cxx +++ b/examples/MQ/simulation_split/run/runMQTrans.cxx @@ -31,6 +31,7 @@ void addCustomOptions(bpo::options_description& options) ("fairroot-config-dir", bpo::value()->default_value("") , "FairRoot config dir") ("param-channel-name", bpo::value()->default_value("updateChannel"), "Parameter update channel name") ("running-mode", bpo::value()->default_value("pp") , "pp to pull, rr to request") + ("detector-library", bpo::value>() , "detector library") ; } @@ -73,9 +74,9 @@ FairMQDevicePtr getDevice(const FairMQProgOptions& config) FairModule* cave= new FairCave("CAVE"); cave->SetGeometryFileName("cave_vacuum.geo"); detArray->Add(cave); - Pixel* det = new Pixel("PixelDetector", kTRUE); - det->SetGeometryFileName("pixel.geo"); - detArray->Add(det); + // Pixel* det = new Pixel("PixelDetector", kTRUE); + // det->SetGeometryFileName("pixel.geo"); + // detArray->Add(det); run->SetDetectorArray (detArray); run->SetStoreTraj (false); diff --git a/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.cxx b/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.cxx index 416ce72850..de2b04b0a7 100644 --- a/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.cxx +++ b/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.cxx @@ -44,6 +44,8 @@ #include "TObjString.h" #include "TObjArray.h" +#include + using namespace std; FairMQTransportDevice::FairMQTransportDevice() @@ -115,6 +117,41 @@ void FairMQTransportDevice::InitTask() for ( int idet = 0 ; idet < fDetectorArray->GetEntries() ; idet++ ) { fRunSim->AddModule((FairModule*)(fDetectorArray->At(idet))); } + + std::vector detectorLibraries = fConfig->GetValue>("detector-library"); + + for ( unsigned int ilib = 0 ; ilib < detectorLibraries.size() ; ilib++ ) { + LOG(info) << " -----> library \"" << detectorLibraries.at(ilib) << "\""; + + void* handle = dlopen(detectorLibraries.at(ilib).c_str(), RTLD_LAZY); + + if (!handle) { + LOG(fatal) << "Cannot open library: " << dlerror(); + return; + } + + // load the symbol + LOG(info) << "Loading symbol ..."; + typedef void (*det_t)(); + + // reset errors + dlerror(); + det_t ExternCreateDetector = (det_t) dlsym(handle, "ExternCreateDetector"); + const char *dlsym_error = dlerror(); + if (dlsym_error) { + LOG(fatal) << "Cannot load symbol 'ExternCreateDetector': " << dlsym_error; + dlclose(handle); + return; + } + + // run the function, where detector should be added to FairRunSim + ExternCreateDetector(); + + // close the library + cout << "NOT closing library...\n"; + // dlclose(handle); + } + // ------------------------------------------------------------------------ // ----- Negotiate the run number ------------------------------------- diff --git a/examples/simulation/Tutorial1/src/FairTutorialDet1.cxx b/examples/simulation/Tutorial1/src/FairTutorialDet1.cxx index 6e725bc94f..c93034103a 100644 --- a/examples/simulation/Tutorial1/src/FairTutorialDet1.cxx +++ b/examples/simulation/Tutorial1/src/FairTutorialDet1.cxx @@ -14,6 +14,7 @@ #include "FairGeoVolume.h" // for FairGeoVolume #include "FairRootManager.h" // for FairRootManager #include "FairRun.h" // for FairRun +#include "FairRunSim.h" // for FairRunSim #include "FairRuntimeDb.h" // for FairRuntimeDb #include "FairStack.h" // for FairStack #include "FairTutorialDet1Geo.h" // for FairTutorialDet1Geo @@ -228,5 +229,18 @@ void FairTutorialDet1::SetSensitiveVolumes() ProcessNodes ( volList ); } +extern "C" void ExternCreateDetector() { + using std::cout; + using std::endl; + + cout << "-- ExternCreateDetector() START --" << endl; + FairRunSim* run = FairRunSim::Instance(); + + FairTutorialDet1* tutdet = new FairTutorialDet1("TUTDET", kTRUE); + tutdet->SetGeometryFileName("double_sector.geo"); + run->AddModule(tutdet); + cout << "-- ExternCreateDetector(" << tutdet->GetName() << ") DONE --" << endl; +} + ClassImp(FairTutorialDet1) From ffdbc9f126503896201bbb71fda4fc9cc45d8658 Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Thu, 1 Nov 2018 12:51:04 +0100 Subject: [PATCH 09/27] examples/MQ/simulation_split Added DDS topology. Added options to change channel names of the FairMQChunkMerger. Polishing of FairMQPrimaryGeneratorDevice. --- .../MQ/simulation_split/run/CMakeLists.txt | 8 +++ .../simulation_split/run/runMQChunkMerger.cxx | 4 ++ .../run/scripts/splitMC-topology.xml | 56 +++++++++++++++++++ .../src/devices/FairMQChunkMerger.cxx | 5 +- .../devices/FairMQPrimaryGeneratorDevice.cxx | 8 +-- 5 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 examples/MQ/simulation_split/run/scripts/splitMC-topology.xml diff --git a/examples/MQ/simulation_split/run/CMakeLists.txt b/examples/MQ/simulation_split/run/CMakeLists.txt index 8238882433..7e557ce0b8 100644 --- a/examples/MQ/simulation_split/run/CMakeLists.txt +++ b/examples/MQ/simulation_split/run/CMakeLists.txt @@ -72,3 +72,11 @@ ForEach(_file RANGE 0 ${_length}) Set(DEPENDENCIES Pixel SimMQ) GENERATE_EXECUTABLE() EndForEach(_file RANGE 0 ${_length}) + +set(SPLITMC_BIN_LOCATION ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split) +set(SPLITMC_FILE_LOCATION ${CMAKE_SOURCE_DIR}) +set(PIXEL_BIN_LOCATION ${CMAKE_BINARY_DIR}/bin/examples/MQ/pixelDetector) +set(FAIRROOT_BIN_LOCATION ${CMAKE_BINARY_DIR}/bin) + +configure_file( ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml + ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split/splitMC-topology.xml ) diff --git a/examples/MQ/simulation_split/run/runMQChunkMerger.cxx b/examples/MQ/simulation_split/run/runMQChunkMerger.cxx index ef5d870bc8..cb7b68e159 100644 --- a/examples/MQ/simulation_split/run/runMQChunkMerger.cxx +++ b/examples/MQ/simulation_split/run/runMQChunkMerger.cxx @@ -16,6 +16,10 @@ namespace bpo = boost::program_options; void addCustomOptions(bpo::options_description& options) { + options.add_options() + ("in-channel", bpo::value()->default_value("data-in") , "input channel name") + ("out-channel", bpo::value()->default_value("data-out") , "output channel name") + ; } FairMQDevicePtr getDevice(const FairMQProgOptions& config) diff --git a/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml b/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml new file mode 100644 index 0000000000..42244fed85 --- /dev/null +++ b/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml @@ -0,0 +1,56 @@ + + + + + + + + + @SPLITMC_BIN_LOCATION@/runMQGen --id splitMC-gen --channel-config name=primariesChannel,type=push,method=bind --running-mode pp --severity INFO --nof-events 1000 --chunk-size 10 -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false + + primariesChannel + + + + + @SPLITMC_BIN_LOCATION@/runMQTrans --config-key splitMC-trans --id splitMC-trans_%taskIndex% --channel-config name=updateChannel,type=req,method=connect --channel-config name=primariesChannel,type=pull,method=connect --channel-config name=data#all#,type=push,method=connect --transport-name TGeant3 --running-mode pp --severity INFO --detector-library @CMAKE_BINARY_DIR@/lib/libPixel.dylib -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false + + primariesChannel + data#all# + updateChannel + + + + + @SPLITMC_BIN_LOCATION@/runMQChMer --id splitMC-merger --in-channel data#all# --channel-config name=data#all#,type=pull,method=bind --out-channel dataOut --channel-config name=dataOut,type=push,method=bind --transport zeromq --severity INFO -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false + + data#all# + dataOut + + + + + @PIXEL_BIN_LOCATION@/pixel-sink --id splitMC-sink --in-channel dataOut --severity INFO --channel-config name=dataOut,type=pull,method=connect --file-name @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.data.root -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false + + dataOut + + + + + @FAIRROOT_BIN_LOCATION@/parmq-server zeromq --id splitMC-parmq-server --channel-config name=updateChannel,type=rep,method=bind --severity INFO --update-channel-name updateChannel --output-name @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.pars.root -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false + + updateChannel + + + +
+ Generator + Merger + Sink + ParamServer + + Transporter + +
+ +
diff --git a/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.cxx b/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.cxx index 8ce35e796d..de8b7204df 100644 --- a/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.cxx +++ b/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.cxx @@ -43,7 +43,10 @@ FairMQChunkMerger::FairMQChunkMerger() void FairMQChunkMerger::Init() { - OnData(fInputChannelName, &FairMQChunkMerger::MergeData); + fInputChannelName = fConfig->GetValue("in-channel"); + fOutputChannelName = fConfig->GetValue("out-channel"); + + OnData(fInputChannelName, &FairMQChunkMerger::MergeData); } bool FairMQChunkMerger::MergeData(FairMQParts& parts, int /*index*/) diff --git a/examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.cxx b/examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.cxx index a2af0abb12..ec2943e332 100644 --- a/examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.cxx +++ b/examples/MQ/simulation_split/src/devices/FairMQPrimaryGeneratorDevice.cxx @@ -51,7 +51,7 @@ FairMQPrimaryGeneratorDevice::FairMQPrimaryGeneratorDevice() , fPrimaryGenerator(NULL) , fMCEventHeader(NULL) , fStack(NULL) - , fChunkSize(-1) + , fChunkSize(0) , fChunkPointer(0) { } @@ -92,7 +92,7 @@ bool FairMQPrimaryGeneratorDevice::GenerateAndSendData() { if ( fEventCounter > fNofEvents ) return false; - if ( fChunkSize > 0 ) { // should send events in chunks with maximum size of fChunkSize + if ( fChunkSize != 0 ) { // should send events in chunks with maximum size of fChunkSize // shouldn't do much before, just sent from fChunkPointer to fChunkPointer+fChunkSize } @@ -104,7 +104,7 @@ bool FairMQPrimaryGeneratorDevice::GenerateAndSendData() { FairMCSplitEventHeader* meh = new FairMCSplitEventHeader(0,fEventCounter,1,0); // RunId will be provided in the Transport from ParameterServer meh->SetNPrim(prims->GetEntries()); - if ( fChunkSize > 0 ) { + if ( fChunkSize != 0 ) { meh->SetNPrim(fChunkPointer+fChunkSize); meh->SetNofChunks ((UInt_t)(prims->GetEntries()/fChunkSize)); meh->SetChunkStart(fChunkPointer); @@ -127,7 +127,7 @@ bool FairMQPrimaryGeneratorDevice::GenerateAndSendData() { int numberofparts = (int)prims->GetEntries(); - if ( fChunkSize > 0 ) { // should send events in chunks with maximum size of fChunkSize + if ( fChunkSize != 0 ) { // should send events in chunks with maximum size of fChunkSize // the whole work should be done after fChunkPointer += fChunkSize; if ( fChunkPointer >= numberofparts ) { // it means that already sent all primaries from this event From dfc873516664cb6561ae6f69d6d130682b71a991 Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Mon, 12 Nov 2018 16:20:27 +0100 Subject: [PATCH 10/27] examples/MQ/simulation_split Added test that runs in DDS. --- .../MQ/simulation_split/run/CMakeLists.txt | 14 +++++++ .../run/scripts/test-splitMC.sh.in | 39 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in diff --git a/examples/MQ/simulation_split/run/CMakeLists.txt b/examples/MQ/simulation_split/run/CMakeLists.txt index 7e557ce0b8..0843299dd4 100644 --- a/examples/MQ/simulation_split/run/CMakeLists.txt +++ b/examples/MQ/simulation_split/run/CMakeLists.txt @@ -8,6 +8,13 @@ Set(MaxTestTime 60) +GENERATE_TEST_SCRIPT(${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split/test-splitMC.sh ${CMAKE_CURRENT_BINARY_DIR}) + +Add_Test(splitMC + ${CMAKE_CURRENT_BINARY_DIR}/test-splitMC.sh) +Set_Tests_Properties(splitMC PROPERTIES TIMEOUT ${MaxTestTime}) +Set_Tests_Properties(splitMC PROPERTIES PASS_REGULAR_EXPRESSION "Shell script finished successfully") + set(INCLUDE_DIRECTORIES ${BASE_INCLUDE_DIRECTORIES} ${CMAKE_SOURCE_DIR}/base/MQ/policies/Sampler @@ -80,3 +87,10 @@ set(FAIRROOT_BIN_LOCATION ${CMAKE_BINARY_DIR}/bin) configure_file( ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split/splitMC-topology.xml ) + +set(SPLITMC_FILE_LOCATION ${CMAKE_SOURCE_DIR}) + +configure_file( ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml + ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split/test-splitMC.xml ) +configure_file( ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in + ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split/test-splitMC.sh) diff --git a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in new file mode 100644 index 0000000000..304dc51c37 --- /dev/null +++ b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in @@ -0,0 +1,39 @@ +#!/bin/bash + +source $ROOTSYS/DDS_env.sh + +echo "***** Start dds server" +dds-server start -s &> dds-server.dat + +cat dds-server.dat +DDS_ID=$(cat dds-server.dat | grep "Set default" | awk '{print $NF}' ) + +echo "***** Create local cluster with 10 agents" +dds-submit -r localhost -n 10 + +#wait 5 seconds to start agents +sleep 5 + +echo "***** Print number of agents available" +dds-info -n + +echo "***** Activate topology" +dds-topology --activate @SPLITMC_BIN_LOCATION@/test-splitMC.xml + +#wait 20 seconds to finish jobs +sleep 20 + +echo "***** Stop DDS" +dds-server stop + +echo "***** Check the output file" +ls -ltrh @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.data.$DDS_ID.root +OUTPUT_EVENTS="$(echo "cout<GetEntries()< Date: Tue, 13 Nov 2018 16:28:45 +0100 Subject: [PATCH 11/27] examples/MQ/simulation_split Modified tests to be more general: - checking if enough agents started; - checking for output file size before stopping; - using dds session id to connect to correct one. --- .../run/scripts/test-splitMC.sh.in | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in index 304dc51c37..d7ce8f6221 100644 --- a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in +++ b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in @@ -9,22 +9,50 @@ cat dds-server.dat DDS_ID=$(cat dds-server.dat | grep "Set default" | awk '{print $NF}' ) echo "***** Create local cluster with 10 agents" -dds-submit -r localhost -n 10 +dds-submit -s $DDS_ID -r localhost -n 10 #wait 5 seconds to start agents -sleep 5 +COUNTER=0 +LOOPING=1 +until [ $LOOPING -eq 0 ]; do + sleep 1; + echo "waiting $COUNTER seconds to start 10 agents "; + ((COUNTER++)); + if [ $COUNTER -ge 5 ]; then LOOPING=0; fi + if dds-info -s $DDS_ID -n | grep -m 1 "10"; then LOOPING=0; fi + : ; +done echo "***** Print number of agents available" -dds-info -n +NOFAGENTS=$(dds-info -s $DDS_ID -n) +echo $NOFAGENTS +if [ $NOFAGENTS -lt 10 ]; then + echo "Not enough agents. Exiting" + dds-server stop $DDS_ID + exit +fi echo "***** Activate topology" -dds-topology --activate @SPLITMC_BIN_LOCATION@/test-splitMC.xml +dds-topology -s $DDS_ID --activate @SPLITMC_BIN_LOCATION@/test-splitMC.xml #wait 20 seconds to finish jobs -sleep 20 +COUNTER=0 +LOOPING=1 +until [ $LOOPING -eq 0 ]; do + echo "waiting $COUNTER seconds for the output file to grow"; + ((COUNTER++)); + if [ $COUNTER -ge 20 ]; then LOOPING=0; fi + FILESIZE=0 + if [ -f @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.data.$DDS_ID.root ]; then + FILESIZE=$(ls -l @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.data.$DDS_ID.root | awk '{print $5}') + fi + if [ $FILESIZE -ge 3000000 ]; then LOOPING=0; fi + sleep 1; + : ; +done echo "***** Stop DDS" -dds-server stop +dds-server stop $DDS_ID echo "***** Check the output file" ls -ltrh @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.data.$DDS_ID.root From 701baa79af5faa676e3c218bfab11a63aa9742b2 Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Wed, 14 Nov 2018 21:32:39 +0100 Subject: [PATCH 12/27] examples/MQ/simulation_split Fixed some codacy issues. Fixed running the test. --- examples/MQ/pixelDetector/run/runMQSim.cxx | 140 +++++++++--------- .../MQ/simulation_split/run/CMakeLists.txt | 6 +- examples/MQ/simulation_split/run/runMQGen.cxx | 5 +- .../MQ/simulation_split/run/runMQTrans.cxx | 28 ++-- .../run/scripts/splitMC-topology.xml | 10 +- .../src/devices/FairMQChunkMerger.cxx | 28 ++-- .../src/devices/FairMQTransportDevice.cxx | 9 +- 7 files changed, 111 insertions(+), 115 deletions(-) diff --git a/examples/MQ/pixelDetector/run/runMQSim.cxx b/examples/MQ/pixelDetector/run/runMQSim.cxx index 84a04a0dd1..f9eee2898a 100644 --- a/examples/MQ/pixelDetector/run/runMQSim.cxx +++ b/examples/MQ/pixelDetector/run/runMQSim.cxx @@ -27,82 +27,80 @@ namespace bpo = boost::program_options; void addCustomOptions(bpo::options_description& options) { - options.add_options() - ("random-seed", bpo::value ()->default_value(0) , "Random seed number") - ("transport-name", bpo::value()->default_value("TGeant3") , "Transport name") - ("nof-events", bpo::value ()->required() , "Number of events to simulate") - ("fairroot-config-dir", bpo::value()->default_value("") , "FairRoot config dir") - ("param-channel-name", bpo::value()->default_value("updateChannel"), "Parameter update channel name") + options.add_options() + ("random-seed", bpo::value ()->default_value(0) , "Random seed number") + ("transport-name", bpo::value()->default_value("TGeant3") , "Transport name") + ("nof-events", bpo::value ()->required() , "Number of events to simulate") + ("fairroot-config-dir", bpo::value()->default_value("") , "FairRoot config dir") + ("param-channel-name", bpo::value()->default_value("updateChannel"), "Parameter update channel name") + ("run-digi-tasks", bpo::value ()->default_value(false) , "Run digi tasks") ; } FairMQDevicePtr getDevice(const FairMQProgOptions& config) { - gRandom->SetSeed(config.GetValue ("random-seed")); - - TString dir = getenv("VMCWORKDIR"); - TString tutdir = dir + "/MQ/pixelDetector"; - - TString tut_geomdir = dir + "/common/geometry"; - gSystem->Setenv("GEOMPATH",tut_geomdir.Data()); - - TString tut_configdir = config.GetValue("fairroot-config-dir"); - if ( tut_configdir.Length() < 1 ) - tut_configdir = dir + "/common/gconfig"; - gSystem->Setenv("CONFIG_DIR",tut_configdir.Data()); - - FairMQSimDevice* run = new FairMQSimDevice(); - - // TString outputfilename = Form("outputfile_%d.root",(int)(getpid())); - // FairRootFileSink* sink = new FairRootFileSink(outputfilename); - FairOnlineSink* sink = new FairOnlineSink(); - sink->SetMQRunDevice(run); - run->SetSink(sink); - - run->SetParamUpdateChannelName(config.GetValue("param-channel-name")); - - run->SetNofEvents (config.GetValue ("nof-events")); - run->SetTransportName (config.GetValue("transport-name")); - run->SetMaterials ("media.geo"); - - TObjArray* detArray = new TObjArray(); - FairModule* cave= new FairCave("CAVE"); - cave->SetGeometryFileName("cave_vacuum.geo"); - detArray->Add(cave); - Pixel* det = new Pixel("PixelDetector", kTRUE); - det->SetGeometryFileName("pixel.geo"); - detArray->Add(det); - run->SetDetectorArray (detArray); - - TString partName[] = {"pions","eplus","proton"}; - Int_t partPdgC[] = { 211, 11, 2212}; - Int_t chosenPart = 0; - - FairPrimaryGenerator* primGen = new FairPrimaryGenerator(); - FairBoxGenerator* boxGen = new FairBoxGenerator(partPdgC[chosenPart], 5); - boxGen->SetPRange(1,2); - boxGen->SetThetaRange(0,40); - boxGen->SetPhiRange(0,360); - primGen->AddGenerator(boxGen); - run->SetGenerator (primGen); - - run->SetStoreTraj (false); - - // --------------------------------------------------- - if ( 1==0 ) - { - // try to run digi task in the simulation device - TString digParFile = tutdir + "/param/pixel_digi.par"; - FairParAsciiFileIo* parIo1 = new FairParAsciiFileIo(); - parIo1->open(digParFile.Data(),"in"); - run->SetFirstParameter(parIo1); - - TObjArray* taskArray = new TObjArray(); - PixelDigitize* digiTask = new PixelDigitize(); - taskArray->Add(digiTask); - run->SetTaskArray(taskArray); + gRandom->SetSeed(config.GetValue ("random-seed")); + + TString dir = getenv("VMCWORKDIR"); + TString tutdir = dir + "/MQ/pixelDetector"; + + TString tut_geomdir = dir + "/common/geometry"; + gSystem->Setenv("GEOMPATH",tut_geomdir.Data()); + + TString tut_configdir = config.GetValue("fairroot-config-dir"); + if ( tut_configdir.Length() < 1 ) + tut_configdir = dir + "/common/gconfig"; + gSystem->Setenv("CONFIG_DIR",tut_configdir.Data()); + + FairMQSimDevice* run = new FairMQSimDevice(); + + // TString outputfilename = Form("outputfile_%d.root",(int)(getpid())); + // FairRootFileSink* sink = new FairRootFileSink(outputfilename); + FairOnlineSink* sink = new FairOnlineSink(); + sink->SetMQRunDevice(run); + run->SetSink(sink); + + run->SetParamUpdateChannelName(config.GetValue("param-channel-name")); + + run->SetNofEvents (config.GetValue ("nof-events")); + run->SetTransportName (config.GetValue("transport-name")); + run->SetMaterials ("media.geo"); + + TObjArray* detArray = new TObjArray(); + FairModule* cave= new FairCave("CAVE"); + cave->SetGeometryFileName("cave_vacuum.geo"); + detArray->Add(cave); + Pixel* det = new Pixel("PixelDetector", kTRUE); + det->SetGeometryFileName("pixel.geo"); + detArray->Add(det); + run->SetDetectorArray (detArray); + + TString partName[] = {"pions","eplus","proton"}; + Int_t partPdgC[] = { 211, 11, 2212}; + Int_t chosenPart = 0; + + FairPrimaryGenerator* primGen = new FairPrimaryGenerator(); + FairBoxGenerator* boxGen = new FairBoxGenerator(partPdgC[chosenPart], 100); + boxGen->SetPRange(1,2); + boxGen->SetThetaRange(0,180); + boxGen->SetPhiRange(0,360); + primGen->AddGenerator(boxGen); + run->SetGenerator (primGen); + + run->SetStoreTraj (false); + + if ( (config.GetValue("run-digi-tasks")) == true ) { + // Attach tasks if needed + TString digParFile = tutdir + "/param/pixel_digi.par"; + FairParAsciiFileIo* parIo1 = new FairParAsciiFileIo(); + parIo1->open(digParFile.Data(),"in"); + run->SetFirstParameter(parIo1); + + TObjArray* taskArray = new TObjArray(); + PixelDigitize* digiTask = new PixelDigitize(); + taskArray->Add(digiTask); + run->SetTaskArray(taskArray); } - // --------------------------------------------------- - return run; + return run; } diff --git a/examples/MQ/simulation_split/run/CMakeLists.txt b/examples/MQ/simulation_split/run/CMakeLists.txt index 0843299dd4..981720779c 100644 --- a/examples/MQ/simulation_split/run/CMakeLists.txt +++ b/examples/MQ/simulation_split/run/CMakeLists.txt @@ -6,7 +6,7 @@ # copied verbatim in the file "LICENSE" # ################################################################################ -Set(MaxTestTime 60) +Set(MaxTestTime 90) GENERATE_TEST_SCRIPT(${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split/test-splitMC.sh ${CMAKE_CURRENT_BINARY_DIR}) @@ -38,9 +38,9 @@ Set(SYSTEM_INCLUDE_DIRECTORIES include_directories(${INCLUDE_DIRECTORIES}) include_directories(SYSTEM ${SYSTEM_INCLUDE_DIRECTORIES}) -set(NETWORK_INTERFACE eth0) +set(EXAMPLE_LIBRARY_EXTENSION so) If(APPLE) - set(NETWORK_INTERFACE lo0) + set(EXAMPLE_LIBRARY_EXTENSION dylib) EndIf(APPLE) set(LINK_DIRECTORIES diff --git a/examples/MQ/simulation_split/run/runMQGen.cxx b/examples/MQ/simulation_split/run/runMQGen.cxx index ef48c1cabc..d18e5ad429 100644 --- a/examples/MQ/simulation_split/run/runMQGen.cxx +++ b/examples/MQ/simulation_split/run/runMQGen.cxx @@ -36,14 +36,13 @@ FairMQDevicePtr getDevice(const FairMQProgOptions& config) tut_configdir = dir + "/common/gconfig"; gSystem->Setenv("CONFIG_DIR",tut_configdir.Data()); - TString partName[] = {"pions","eplus","proton"}; - Int_t partPdgC[] = { 211, 11, 2212}; + Int_t partPdgC[] = { 211, 11, 2212}; //{"pions","eplus","proton"} Int_t chosenPart = 0; FairPrimaryGenerator* primGen = new FairPrimaryGenerator(); FairBoxGenerator* boxGen = new FairBoxGenerator(partPdgC[chosenPart], 100); boxGen->SetPRange(1,2); - boxGen->SetThetaRange(0,40); + boxGen->SetThetaRange(0,180); boxGen->SetPhiRange(0,360); primGen->AddGenerator(boxGen); diff --git a/examples/MQ/simulation_split/run/runMQTrans.cxx b/examples/MQ/simulation_split/run/runMQTrans.cxx index 75a135be1e..1bc8cc3c36 100644 --- a/examples/MQ/simulation_split/run/runMQTrans.cxx +++ b/examples/MQ/simulation_split/run/runMQTrans.cxx @@ -32,6 +32,7 @@ void addCustomOptions(bpo::options_description& options) ("param-channel-name", bpo::value()->default_value("updateChannel"), "Parameter update channel name") ("running-mode", bpo::value()->default_value("pp") , "pp to pull, rr to request") ("detector-library", bpo::value>() , "detector library") + ("run-digi-tasks", bpo::value ()->default_value(false) , "Run digi tasks") ; } @@ -81,21 +82,18 @@ FairMQDevicePtr getDevice(const FairMQProgOptions& config) run->SetStoreTraj (false); - // --------------------------------------------------- - if ( 1==0 ) - { - // try to run digi task in the simulation device - TString digParFile = tutdir + "/param/pixel_digi.par"; - FairParAsciiFileIo* parIo1 = new FairParAsciiFileIo(); - parIo1->open(digParFile.Data(),"in"); - run->SetFirstParameter(parIo1); - - TObjArray* taskArray = new TObjArray(); - PixelDigitize* digiTask = new PixelDigitize(); - taskArray->Add(digiTask); - run->SetTaskArray(taskArray); - } - // --------------------------------------------------- + if ( (config.GetValue("run-digi-tasks")) == true ) { + // Attach tasks if needed + TString digParFile = tutdir + "/param/pixel_digi.par"; + FairParAsciiFileIo* parIo1 = new FairParAsciiFileIo(); + parIo1->open(digParFile.Data(),"in"); + run->SetFirstParameter(parIo1); + + TObjArray* taskArray = new TObjArray(); + PixelDigitize* digiTask = new PixelDigitize(); + taskArray->Add(digiTask); + run->SetTaskArray(taskArray); + } return run; } diff --git a/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml b/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml index 42244fed85..7323893ece 100644 --- a/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml +++ b/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml @@ -6,14 +6,14 @@ - @SPLITMC_BIN_LOCATION@/runMQGen --id splitMC-gen --channel-config name=primariesChannel,type=push,method=bind --running-mode pp --severity INFO --nof-events 1000 --chunk-size 10 -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false + @SPLITMC_BIN_LOCATION@/runMQGen --id splitMC-gen --channel-config name=primariesChannel,type=push,method=bind --running-mode pp --severity INFO --nof-events 1000 --chunk-size 10 -S "<@FairMQ_LIBDIR@" -P dds --color false primariesChannel - @SPLITMC_BIN_LOCATION@/runMQTrans --config-key splitMC-trans --id splitMC-trans_%taskIndex% --channel-config name=updateChannel,type=req,method=connect --channel-config name=primariesChannel,type=pull,method=connect --channel-config name=data#all#,type=push,method=connect --transport-name TGeant3 --running-mode pp --severity INFO --detector-library @CMAKE_BINARY_DIR@/lib/libPixel.dylib -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false + @SPLITMC_BIN_LOCATION@/runMQTrans --config-key splitMC-trans --id splitMC-trans_%taskIndex% --channel-config name=updateChannel,type=req,method=connect --channel-config name=primariesChannel,type=pull,method=connect --channel-config name=data#all#,type=push,method=connect --transport-name TGeant3 --running-mode pp --severity INFO --detector-library @CMAKE_BINARY_DIR@/lib/libPixel.@EXAMPLE_LIBRARY_EXTENSION@ -S "<@FairMQ_LIBDIR@" -P dds --color false primariesChannel data#all# @@ -22,7 +22,7 @@ - @SPLITMC_BIN_LOCATION@/runMQChMer --id splitMC-merger --in-channel data#all# --channel-config name=data#all#,type=pull,method=bind --out-channel dataOut --channel-config name=dataOut,type=push,method=bind --transport zeromq --severity INFO -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false + @SPLITMC_BIN_LOCATION@/runMQChMer --id splitMC-merger --in-channel data#all# --channel-config name=data#all#,type=pull,method=bind --out-channel dataOut --channel-config name=dataOut,type=push,method=bind --transport zeromq --severity INFO -S "<@FairMQ_LIBDIR@" -P dds --color false data#all# dataOut @@ -30,14 +30,14 @@ - @PIXEL_BIN_LOCATION@/pixel-sink --id splitMC-sink --in-channel dataOut --severity INFO --channel-config name=dataOut,type=pull,method=connect --file-name @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.data.root -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false + @PIXEL_BIN_LOCATION@/pixel-sink --id splitMC-sink --in-channel dataOut --severity INFO --channel-config name=dataOut,type=pull,method=connect --file-name @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.data.root -S "<@FairMQ_LIBDIR@" -P dds --color false dataOut - @FAIRROOT_BIN_LOCATION@/parmq-server zeromq --id splitMC-parmq-server --channel-config name=updateChannel,type=rep,method=bind --severity INFO --update-channel-name updateChannel --output-name @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.pars.root -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false + @FAIRROOT_BIN_LOCATION@/parmq-server zeromq --id splitMC-parmq-server --channel-config name=updateChannel,type=rep,method=bind --severity INFO --update-channel-name updateChannel --output-name @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.pars.root -S "<@FairMQ_LIBDIR@" -P dds --color false updateChannel diff --git a/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.cxx b/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.cxx index de8b7204df..fb1a02e742 100644 --- a/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.cxx +++ b/examples/MQ/simulation_split/src/devices/FairMQChunkMerger.cxx @@ -22,6 +22,7 @@ #include "FairMCTrack.h" #include "FairMCPoint.h" +#include "FairTask.h" using namespace std; @@ -59,14 +60,13 @@ bool FairMQChunkMerger::MergeData(FairMQParts& parts, int /*index*/) // dataDuplicationFlag = false; std::vector tcaVector; - TObject* tempObject; for ( int ipart = 0 ; ipart < parts.Size() ; ++ipart ) { - tempObject = nullptr; + TObject* tempObject = nullptr; Deserialize(*parts.At(ipart),tempObject); // LOG(INFO) << "Got object " << tempObject->ClassName() << " named " << tempObject->GetName(); if ( strcmp(tempObject->GetName(),"MCEventHeader.") == 0 ) { - fMCSplitEventHeader = (FairMCSplitEventHeader*)tempObject; + fMCSplitEventHeader = dynamic_cast(tempObject); // LOG(info) << "GOT PART [" << fMCSplitEventHeader->GetRunID() << "][" << fMCSplitEventHeader->GetEventID() << "][" << fMCSplitEventHeader->GetChunkStart() << "]"; fEvRIPair.first = fMCSplitEventHeader->GetEventID(); fEvRIPair.second = fMCSplitEventHeader->GetRunID(); @@ -92,7 +92,7 @@ bool FairMQChunkMerger::MergeData(FairMQParts& parts, int /*index*/) } } else { - tcaVector.push_back((TClonesArray*)tempObject); + tcaVector.push_back(dynamic_cast(tempObject)); } } @@ -100,9 +100,9 @@ bool FairMQChunkMerger::MergeData(FairMQParts& parts, int /*index*/) if ( nofReceivedParts != nofExpectedParts ) { // LOG(info) << "not all parts are yet here (got " << nofReceivedParts << " out of " << nofExpectedParts << ")... adding to (size = " << fObjectMap.size() << ")"; // LOG(info) << "+" << fMCSplitEventHeader->GetName() << "[" << fEvRIPair.second << "][" << fEvRIPair.first << "][" << fEvCOPair.first << "]"; - for ( int iarray = 0 ; iarray < tcaVector.size() ; iarray++ ) { + for ( int iarray = 0 ; iarray < tcaVector.size() ; ++iarray ) { LOG(debug) << "+ [" << fEvRIPair.second << "][" << fEvRIPair.first << "][" << fEvCOPair.first << "] " << tcaVector[iarray]->GetName(); - fEvCOPair.second = ((TObject*)tcaVector[iarray]); + fEvCOPair.second = (dynamic_cast(tcaVector[iarray])); fObjectMap.insert(std::pair,std::pair>(fEvRIPair,fEvCOPair)); } // LOG(info) << " now we have fObjectMap (size = " << fObjectMap.size() << ")"; @@ -115,7 +115,7 @@ bool FairMQChunkMerger::MergeData(FairMQParts& parts, int /*index*/) fRet = fObjectMap.equal_range(fEvRIPair); std::vector trackShift; LOG(debug) << "- [" << fEvRIPair.second << "][" << fEvRIPair.first << "][ALL]"; - for ( int iarray = 0 ; iarray < tcaVector.size() ; iarray++ ) { + for ( int iarray = 0 ; iarray < tcaVector.size() ; ++iarray ) { if ( strcmp(tcaVector[iarray]->GetName(),"MCTrack") != 0 ) continue; // want only MCTrack array to renumber tracks and get track shifts... // LOG(info) << "BEFORE ADDING, TCA \"" << tcaVector[iarray]->GetName() << "\" has " << tcaVector[iarray]->GetEntries() << " entries."; TClonesArray* arrayToAdd; @@ -123,9 +123,9 @@ bool FairMQChunkMerger::MergeData(FairMQParts& parts, int /*index*/) if ( it->second.first == fMCSplitEventHeader->GetChunkStart() ) continue; if ( strcmp(tcaVector[iarray]->GetName(),it->second.second->GetName()) == 0 ) { trackShift.push_back(tcaVector[iarray]->GetEntries()); - arrayToAdd = (TClonesArray*)it->second.second; + arrayToAdd = dynamic_cast(it->second.second); for ( int iobj = 0 ; iobj < arrayToAdd->GetEntries() ; ++iobj ) { - FairMCTrack* temp = (FairMCTrack*)arrayToAdd->At(iobj); + FairMCTrack* temp = dynamic_cast(arrayToAdd->At(iobj)); if ( temp->GetMotherId() >= 0 ) { temp->SetMotherId(temp->GetMotherId()+trackShift.back()); } @@ -136,7 +136,7 @@ bool FairMQChunkMerger::MergeData(FairMQParts& parts, int /*index*/) } } - for ( int iarray = 0 ; iarray < tcaVector.size() ; iarray++ ) { + for ( int iarray = 0 ; iarray < tcaVector.size() ; ++iarray ) { if ( strcmp(tcaVector[iarray]->GetName(),"MCTrack") == 0 ) continue; // MCTrack already done, renumber all _other_ arrays... // LOG(info) << "BEFORE ADDING, TCA \"" << tcaVector[iarray]->GetName() << "\" has " << tcaVector[iarray]->GetEntries() << " entries."; int addedArray = 0; @@ -147,9 +147,9 @@ bool FairMQChunkMerger::MergeData(FairMQParts& parts, int /*index*/) if ( strcmp(tcaVector[iarray]->GetName(),it->second.second->GetName()) == 0 ) { int objShift = trackShift[addedArray++]; // LOG(INFO) << "trying to add " << tcaVector[iarray]->GetName() << " and " << it->second.second->GetName() << "(shift = " << objShift << ")"; - arrayToAdd = (TClonesArray*)it->second.second; + arrayToAdd = dynamic_cast(it->second.second); for ( int iobj = 0 ; iobj < arrayToAdd->GetEntries() ; ++iobj ) { - FairMCPoint* temp = (FairMCPoint*)arrayToAdd->At(iobj); + FairMCPoint* temp = dynamic_cast(arrayToAdd->At(iobj)); temp->SetTrackID(temp->GetTrackID()+objShift); } } @@ -168,7 +168,7 @@ bool FairMQChunkMerger::MergeData(FairMQParts& parts, int /*index*/) Serialize(*messEH,fMCSplitEventHeader); partsOut.AddPart(std::move(messEH)); - for ( int iarray = 0 ; iarray < tcaVector.size() ; iarray++ ) { + for ( int iarray = 0 ; iarray < tcaVector.size() ; ++iarray ) { FairMQMessagePtr mess(NewMessage()); Serialize(*mess,tcaVector[iarray]); partsOut.AddPart(std::move(mess)); @@ -180,7 +180,7 @@ bool FairMQChunkMerger::MergeData(FairMQParts& parts, int /*index*/) LOG(info) << ">> [" << fMCSplitEventHeader->GetRunID() << "][" << fMCSplitEventHeader->GetEventID() << "][" << fMCSplitEventHeader->GetChunkStart() << "] Received: " << fNofReceivedMessages << " // Buffered: " << fObjectMap.size() << " // Sent: " << fNofSentMessages << " <<"; } - for( MultiMapDef::iterator it = fObjectMap.begin() ; it != fObjectMap.end() ; it++ ) { + for( MultiMapDef::iterator it = fObjectMap.begin() ; it != fObjectMap.end() ; ++it ) { LOG(debug) << "= [" << it->first.second << "][" << it->first.first << "][" << it->second.first << "] " << it->second.second->GetName(); } return true; diff --git a/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.cxx b/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.cxx index de2b04b0a7..e66cf6d559 100644 --- a/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.cxx +++ b/examples/MQ/simulation_split/src/devices/FairMQTransportDevice.cxx @@ -32,6 +32,7 @@ #include "FairModule.h" #include "FairParRootFileIo.h" #include "FairParSet.h" +#include "FairTask.h" #include "RootSerializer.h" @@ -115,7 +116,7 @@ void FairMQTransportDevice::InitTask() // ----- Create geometry ---------------------------------------------- for ( int idet = 0 ; idet < fDetectorArray->GetEntries() ; idet++ ) { - fRunSim->AddModule((FairModule*)(fDetectorArray->At(idet))); + fRunSim->AddModule(dynamic_cast(fDetectorArray->At(idet))); } std::vector detectorLibraries = fConfig->GetValue>("detector-library"); @@ -185,7 +186,7 @@ void FairMQTransportDevice::InitTask() // ----- Set tasks ---------------------------------------------------- if ( fTaskArray ) { for ( int itask = 0 ; itask < fTaskArray->GetEntries() ; itask++ ) { - fRunSim->AddTask((FairTask*)(fTaskArray->At(itask))); + fRunSim->AddTask(dynamic_cast(fTaskArray->At(itask))); } } // ------------------------------------------------------------------------ @@ -249,9 +250,9 @@ bool FairMQTransportDevice::TransportData(FairMQParts& mParts, int /*index*/) TObject* obj = nullptr; Deserialize(*mParts.At(ipart),obj); if (strcmp(obj->GetName(),"MCEvent") == 0) - meh = (FairMCSplitEventHeader*)obj; + meh = dynamic_cast(obj); else if (strcmp(obj->GetName(),"TParticles") == 0) - chunk = (TClonesArray*)obj; + chunk = dynamic_cast(obj); } if ( chunk != nullptr ) { fStack->SetParticleArray(chunk,meh->GetChunkStart(),meh->GetNPrim()); From 9f747edce1c2709c924f1445f0df9bf6cc05a748 Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Wed, 14 Nov 2018 22:44:00 +0100 Subject: [PATCH 13/27] examles/MQ/simulation_split Disabled validation for the xml config file for DDS. --- examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in index d7ce8f6221..dd7faf2809 100644 --- a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in +++ b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in @@ -33,7 +33,7 @@ if [ $NOFAGENTS -lt 10 ]; then fi echo "***** Activate topology" -dds-topology -s $DDS_ID --activate @SPLITMC_BIN_LOCATION@/test-splitMC.xml +dds-topology -s $DDS_ID --activate @SPLITMC_BIN_LOCATION@/test-splitMC.xml --disable-validation #wait 20 seconds to finish jobs COUNTER=0 From 0c1dcb367a60652d2a37d60eac5320d468ac22e7 Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Tue, 20 Nov 2018 11:22:54 +0100 Subject: [PATCH 14/27] test g3Config.C --- .../run/scripts/splitMC-topology.xml | 4 ++-- .../run/scripts/test-splitMC.sh.in | 15 ++++++++++++--- examples/common/gconfig/g3Config.C | 7 +++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml b/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml index 7323893ece..51dae75667 100644 --- a/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml +++ b/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml @@ -6,7 +6,7 @@ - @SPLITMC_BIN_LOCATION@/runMQGen --id splitMC-gen --channel-config name=primariesChannel,type=push,method=bind --running-mode pp --severity INFO --nof-events 1000 --chunk-size 10 -S "<@FairMQ_LIBDIR@" -P dds --color false + @SPLITMC_BIN_LOCATION@/runMQGen --id splitMC-gen --channel-config name=primariesChannel,type=push,method=bind --running-mode pp --severity INFO --nof-events 1 --chunk-size 0 -S "<@FairMQ_LIBDIR@" -P dds --color false primariesChannel @@ -48,7 +48,7 @@ Merger Sink ParamServer - + Transporter diff --git a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in index dd7faf2809..7132e3f636 100644 --- a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in +++ b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in @@ -9,7 +9,8 @@ cat dds-server.dat DDS_ID=$(cat dds-server.dat | grep "Set default" | awk '{print $NF}' ) echo "***** Create local cluster with 10 agents" -dds-submit -s $DDS_ID -r localhost -n 10 +dds-submit -s $DDS_ID -r localhost -n 10 &> dds-agents.dat +cat dds-agents.dat #wait 5 seconds to start agents COUNTER=0 @@ -46,11 +47,19 @@ until [ $LOOPING -eq 0 ]; do if [ -f @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.data.$DDS_ID.root ]; then FILESIZE=$(ls -l @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.data.$DDS_ID.root | awk '{print $5}') fi - if [ $FILESIZE -ge 3000000 ]; then LOOPING=0; fi + fairmq-dds-command-ui -s $DDS_ID -c c + if [ $FILESIZE -ge 100 ]; then LOOPING=0; fi sleep 1; : ; done +echo "print Transporter logs" +#cat dds-agents.dat | grep "Starting DDSScout" | sed -e "s#\'##g" | awk '{print $8}' +AGENTS_WORK_DIR=$(cat dds-agents.dat | grep "Starting DDSScout" | sed -e "s#\'##g" | awk '{print $8}') +echo "want to get logs from $AGENTS_WORK_DIR" +find $AGENTS_WORK_DIR* -name "Trans*log" | xargs -I {} cat {} +echo "print Transporter logs" + echo "***** Stop DDS" dds-server stop $DDS_ID @@ -59,7 +68,7 @@ ls -ltrh @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.si OUTPUT_EVENTS="$(echo "cout<GetEntries()<GetGeoModel(); + std::cout << "model is " << gModel->Data() << std::endl; TGeant3* geant3 = NULL; + std::cout << "geant3 is now " << geant3 << std::endl; + std::cout << "gMC is " << gMC << std::endl; if ( strncmp(gModel->Data(),"TGeo",4) == 0 ) { geant3 = new TGeant3TGeo("C++ Interface to Geant3"); @@ -25,6 +30,8 @@ void Config() // cout << "-I- G3Config: Geant3 native has been created." // << endl; } + std::cout << "after creating geant3 is now " << geant3 << std::endl; + std::cout << "gMC is " << gMC << std::endl; // create Fair Specific Stack FairStack *st = new FairStack(); st->SetMinPoints(0); From 3c843232bd96009fd00e1425dd3f0f17d3a95e4e Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Tue, 20 Nov 2018 11:40:25 +0100 Subject: [PATCH 15/27] test runsim --- base/steer/FairRunSim.cxx | 4 ++++ examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/base/steer/FairRunSim.cxx b/base/steer/FairRunSim.cxx index 6b88d221c6..87715b8b51 100644 --- a/base/steer/FairRunSim.cxx +++ b/base/steer/FairRunSim.cxx @@ -415,14 +415,18 @@ void FairRunSim::SetMCConfig() cuts =work_config+ fUserCuts; } //--------------------------------------Now load the Config and Cuts------------------------------------ + LOG(info) << "Now load the Config and Cuts"; if (!LibMacro.IsNull()) { + LOG(info) << "LibMacro"; gROOT->LoadMacro(LibMacro.Data()); gROOT->ProcessLine(LibFunction.Data()); } + LOG(info) << "ConfigMacro"; gROOT->LoadMacro(ConfigMacro.Data()); gROOT->ProcessLine("Config()"); + LOG(info) << "CutsMacro"; gROOT->LoadMacro(cuts); gROOT->ProcessLine("SetCuts()"); } diff --git a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in index 7132e3f636..03ba1d2b92 100644 --- a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in +++ b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in @@ -55,7 +55,7 @@ done echo "print Transporter logs" #cat dds-agents.dat | grep "Starting DDSScout" | sed -e "s#\'##g" | awk '{print $8}' -AGENTS_WORK_DIR=$(cat dds-agents.dat | grep "Starting DDSScout" | sed -e "s#\'##g" | awk '{print $8}') +AGENTS_WORK_DIR=$(cat dds-agents.dat | grep "Starting DDSScout" | sed "s#\'##g" | awk '{print $8}') echo "want to get logs from $AGENTS_WORK_DIR" find $AGENTS_WORK_DIR* -name "Trans*log" | xargs -I {} cat {} echo "print Transporter logs" @@ -64,7 +64,7 @@ echo "***** Stop DDS" dds-server stop $DDS_ID echo "***** Check the output file" -ls -ltrh @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.data.$DDS_ID.root +ls -ltr @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.data.$DDS_ID.root OUTPUT_EVENTS="$(echo "cout<GetEntries()< Date: Tue, 20 Nov 2018 16:28:09 +0100 Subject: [PATCH 16/27] another tests --- base/steer/FairRunSim.cxx | 6 +-- .../MQ/simulation_split/run/CMakeLists.txt | 7 ++- .../run/scripts/test-splitMC.sh.in | 44 ++++++++++++++++--- 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/base/steer/FairRunSim.cxx b/base/steer/FairRunSim.cxx index 87715b8b51..7f2f3b71ab 100644 --- a/base/steer/FairRunSim.cxx +++ b/base/steer/FairRunSim.cxx @@ -417,16 +417,16 @@ void FairRunSim::SetMCConfig() //--------------------------------------Now load the Config and Cuts------------------------------------ LOG(info) << "Now load the Config and Cuts"; if (!LibMacro.IsNull()) { - LOG(info) << "LibMacro"; + LOG(info) << "LibMacro " << LibMacro.Data(); gROOT->LoadMacro(LibMacro.Data()); gROOT->ProcessLine(LibFunction.Data()); } - LOG(info) << "ConfigMacro"; + LOG(info) << "ConfigMacro " << ConfigMacro.Data(); gROOT->LoadMacro(ConfigMacro.Data()); gROOT->ProcessLine("Config()"); - LOG(info) << "CutsMacro"; + LOG(info) << "CutsMacro " << cuts; gROOT->LoadMacro(cuts); gROOT->ProcessLine("SetCuts()"); } diff --git a/examples/MQ/simulation_split/run/CMakeLists.txt b/examples/MQ/simulation_split/run/CMakeLists.txt index 981720779c..a9b804dae2 100644 --- a/examples/MQ/simulation_split/run/CMakeLists.txt +++ b/examples/MQ/simulation_split/run/CMakeLists.txt @@ -50,7 +50,6 @@ set(LINK_DIRECTORIES link_directories(${LINK_DIRECTORIES}) - Set(Exe_Names runMQGen runMQTrans @@ -85,6 +84,12 @@ set(SPLITMC_FILE_LOCATION ${CMAKE_SOURCE_DIR}) set(PIXEL_BIN_LOCATION ${CMAKE_BINARY_DIR}/bin/examples/MQ/pixelDetector) set(FAIRROOT_BIN_LOCATION ${CMAKE_BINARY_DIR}/bin) + +Message(STATUS "Looking for DDS!!!") +find_package(DDS) +set(DDS_LOCATION ${DDS_INCLUDE_DIR}/../) +MESSAGE(STATUS "Set ${DDS_LOCATION} as place to look for DDS_env.sh") + configure_file( ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split/splitMC-topology.xml ) diff --git a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in index 03ba1d2b92..c369a2c7d1 100644 --- a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in +++ b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in @@ -1,6 +1,8 @@ #!/bin/bash -source $ROOTSYS/DDS_env.sh +NOFNEEDEDAGENTS=5 + +source @DDS_LOCATION@/DDS_env.sh echo "***** Start dds server" dds-server start -s &> dds-server.dat @@ -8,8 +10,8 @@ dds-server start -s &> dds-server.dat cat dds-server.dat DDS_ID=$(cat dds-server.dat | grep "Set default" | awk '{print $NF}' ) -echo "***** Create local cluster with 10 agents" -dds-submit -s $DDS_ID -r localhost -n 10 &> dds-agents.dat +echo "***** Create local cluster with $NOFNEEDEDAGENTS agents" +dds-submit -s $DDS_ID -r localhost -n $NOFNEEDEDAGENTS &> dds-agents.dat cat dds-agents.dat #wait 5 seconds to start agents @@ -17,17 +19,17 @@ COUNTER=0 LOOPING=1 until [ $LOOPING -eq 0 ]; do sleep 1; - echo "waiting $COUNTER seconds to start 10 agents "; + echo "waiting $COUNTER seconds to start $NOFNEEDEDAGENTS agents "; ((COUNTER++)); if [ $COUNTER -ge 5 ]; then LOOPING=0; fi - if dds-info -s $DDS_ID -n | grep -m 1 "10"; then LOOPING=0; fi + if dds-info -s $DDS_ID -n | grep -m 1 "$NOFNEEDEDAGENTS"; then LOOPING=0; fi : ; done echo "***** Print number of agents available" NOFAGENTS=$(dds-info -s $DDS_ID -n) echo $NOFAGENTS -if [ $NOFAGENTS -lt 10 ]; then +if [ $NOFAGENTS -lt $NOFNEEDEDAGENTS ]; then echo "Not enough agents. Exiting" dds-server stop $DDS_ID exit @@ -52,14 +54,38 @@ until [ $LOOPING -eq 0 ]; do sleep 1; : ; done +sleep 10 echo "print Transporter logs" #cat dds-agents.dat | grep "Starting DDSScout" | sed -e "s#\'##g" | awk '{print $8}' -AGENTS_WORK_DIR=$(cat dds-agents.dat | grep "Starting DDSScout" | sed "s#\'##g" | awk '{print $8}') +AGENTS_WORK_DIR=$(cat dds-agents.dat | grep "Starting DDSScout" | sed "s#'##g" | awk '{print $8}') echo "want to get logs from $AGENTS_WORK_DIR" +echo "==============================================================================================================================" find $AGENTS_WORK_DIR* -name "Trans*log" | xargs -I {} cat {} +echo "==============================================================================================================================" +find $AGENTS_WORK_DIR* -name "Merge*log" | xargs -I {} cat {} +echo "==============================================================================================================================" +find $AGENTS_WORK_DIR* -name "Gener*log" | xargs -I {} cat {} +echo "==============================================================================================================================" +find $AGENTS_WORK_DIR* -name "Param*log" | xargs -I {} cat {} +echo "==============================================================================================================================" +find $AGENTS_WORK_DIR* -name "Sink_*log" | xargs -I {} cat {} +echo "==============================================================================================================================" echo "print Transporter logs" +echo "check dds states again" +fairmq-dds-command-ui -s $DDS_ID -c c +echo "^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^" + +fairmq-dds-command-ui -s $DDS_ID -c s +sleep 1 +fairmq-dds-command-ui -s $DDS_ID -c t +sleep 1 +fairmq-dds-command-ui -s $DDS_ID -c d +sleep 1 +fairmq-dds-command-ui -s $DDS_ID -c q +sleep 1 + echo "***** Stop DDS" dds-server stop $DDS_ID @@ -68,6 +94,10 @@ ls -ltr @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.sim OUTPUT_EVENTS="$(echo "cout<GetEntries()< Date: Wed, 21 Nov 2018 09:16:49 +0100 Subject: [PATCH 17/27] hardcode detector geometry in transporter, remove reading library --- examples/MQ/simulation_split/run/runMQTrans.cxx | 6 +++--- .../MQ/simulation_split/run/scripts/splitMC-topology.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/MQ/simulation_split/run/runMQTrans.cxx b/examples/MQ/simulation_split/run/runMQTrans.cxx index 1bc8cc3c36..c6a9fcb4d7 100644 --- a/examples/MQ/simulation_split/run/runMQTrans.cxx +++ b/examples/MQ/simulation_split/run/runMQTrans.cxx @@ -75,9 +75,9 @@ FairMQDevicePtr getDevice(const FairMQProgOptions& config) FairModule* cave= new FairCave("CAVE"); cave->SetGeometryFileName("cave_vacuum.geo"); detArray->Add(cave); - // Pixel* det = new Pixel("PixelDetector", kTRUE); - // det->SetGeometryFileName("pixel.geo"); - // detArray->Add(det); + Pixel* det = new Pixel("PixelDetector", kTRUE); + det->SetGeometryFileName("pixel.geo"); + detArray->Add(det); run->SetDetectorArray (detArray); run->SetStoreTraj (false); diff --git a/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml b/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml index 51dae75667..42a4bd8167 100644 --- a/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml +++ b/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml @@ -13,7 +13,7 @@ - @SPLITMC_BIN_LOCATION@/runMQTrans --config-key splitMC-trans --id splitMC-trans_%taskIndex% --channel-config name=updateChannel,type=req,method=connect --channel-config name=primariesChannel,type=pull,method=connect --channel-config name=data#all#,type=push,method=connect --transport-name TGeant3 --running-mode pp --severity INFO --detector-library @CMAKE_BINARY_DIR@/lib/libPixel.@EXAMPLE_LIBRARY_EXTENSION@ -S "<@FairMQ_LIBDIR@" -P dds --color false + @SPLITMC_BIN_LOCATION@/runMQTrans --config-key splitMC-trans --id splitMC-trans_%taskIndex% --channel-config name=updateChannel,type=req,method=connect --channel-config name=primariesChannel,type=pull,method=connect --channel-config name=data#all#,type=push,method=connect --transport-name TGeant3 --running-mode pp --severity INFO -S "<@FairMQ_LIBDIR@" -P dds --color false primariesChannel data#all# From 640ba4ee7c82c37d6c87a7ee8b03725263bb4caa Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Wed, 21 Nov 2018 09:26:21 +0100 Subject: [PATCH 18/27] check paths --- .../MQ/simulation_split/run/scripts/test-splitMC.sh.in | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in index c369a2c7d1..f5f08ad2b7 100644 --- a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in +++ b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in @@ -2,8 +2,15 @@ NOFNEEDEDAGENTS=5 +echo "*************** check paths" +env + +echo "*************** load dds" source @DDS_LOCATION@/DDS_env.sh +echo "*************** double check paths" +env + echo "***** Start dds server" dds-server start -s &> dds-server.dat From 089e9d7dc95980f9321c78d87fd0a05a60526c97 Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Wed, 21 Nov 2018 10:11:05 +0100 Subject: [PATCH 19/27] source fairroot's config.sh --- examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in index f5f08ad2b7..f7e9a698ac 100644 --- a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in +++ b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in @@ -6,6 +6,7 @@ echo "*************** check paths" env echo "*************** load dds" +source ${CMAKE_BINARY_DIR}/config.sh source @DDS_LOCATION@/DDS_env.sh echo "*************** double check paths" From 9b6885a67061ef95f4fa9c5ec8652da696ead12d Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Fri, 30 Nov 2018 14:34:24 +0100 Subject: [PATCH 20/27] examples/MQ/simulation_split Removed obsolete directory. --- .../simulation_split/scripts/CMakeLists.txt | 33 -------------- .../scripts/dds-simulation-split.xml | 45 ------------------- 2 files changed, 78 deletions(-) delete mode 100644 examples/MQ/simulation_split/scripts/CMakeLists.txt delete mode 100644 examples/MQ/simulation_split/scripts/dds-simulation-split.xml diff --git a/examples/MQ/simulation_split/scripts/CMakeLists.txt b/examples/MQ/simulation_split/scripts/CMakeLists.txt deleted file mode 100644 index 27eab6d0da..0000000000 --- a/examples/MQ/simulation_split/scripts/CMakeLists.txt +++ /dev/null @@ -1,33 +0,0 @@ - ################################################################################ - # Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # - # # - # This software is distributed under the terms of the # - # GNU Lesser General Public Licence (LGPL) version 3, # - # copied verbatim in the file "LICENSE" # - ################################################################################ - -set(NETWORK_INTERFACE eth0) -If(APPLE) - set(NETWORK_INTERFACE lo0) -EndIf(APPLE) - -set(SIM_FILE_LOCATION ${CMAKE_SOURCE_DIR}) -set(SIM_BIN_LOCATION ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split) -set(PIXEL_BIN_LOCATION ${CMAKE_BINARY_DIR}/bin/examples/MQ/pixelDetector) -set(FAIRROOT_BIN_LOCATION ${CMAKE_BINARY_DIR}/bin) - -configure_file( ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/scripts/dds-simulation-split.xml - ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split/dds-simulation-split.xml ) - -set(SIM_FILE_LOCATION ${CMAKE_INSTALL_PREFIX}/share/fairbase) -set(SIM_BIN_LOCATION ${CMAKE_INSTALL_PREFIX}/share/fairbase/examples/MQ/simulation_split/bin) -set(PIXEL_BIN_LOCATION ${CMAKE_INSTALL_PREFIX}/share/fairbase/examples/MQ/pixelDetector/bin) -set(FAIRROOT_BIN_LOCATION ${CMAKE_INSTALL_PREFIX}/bin) -configure_file( ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/scripts/dds-simulation-split.xml - ${CMAKE_BINARY_DIR}/examples/MQ/simulation_split/scripts/dds-simulation-split.xml_install ) - -set(SIM_INSTALL_BIN share/fairbase/examples/MQ/simulation_split/bin) - -Install(FILES ${CMAKE_BINARY_DIR}/examples/MQ/simulation_split/scripts/dds-simulation-split.xml_install - DESTINATION ${SIM_INSTALL_BIN} - RENAME dds-simulation-split.xml PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ WORLD_READ) diff --git a/examples/MQ/simulation_split/scripts/dds-simulation-split.xml b/examples/MQ/simulation_split/scripts/dds-simulation-split.xml deleted file mode 100644 index cd8ff510fe..0000000000 --- a/examples/MQ/simulation_split/scripts/dds-simulation-split.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - @SIM_BIN_LOCATION@/runMQGen --config-key generator --channel-config name=primariesChannel,type=push,method=bind --running-mode pp --severity INFO --nof-events 100000 --id sampler --random-seed 0 -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false - - primariesChannel - - - - - @SIM_BIN_LOCATION@/runMQTrans --config-key transporter --channel-config name=primariesChannel,type=pull,method=connect --running-mode pp --channel-config name=data#all#,type=push,method=connect --channel-config name=updateChannel,type=req,method=connect --severity DEBUG --transport-name TGeant3 --id transporter_%taskIndex% --random-seed 0 -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false - - primariesChannel - data#all# - updateChannel - - - - - @PIXEL_BIN_LOCATION@/pixel-sink --in-channel data#all# --severity DEBUG --id sink1 --channel-config name=data#all#,type=pull,method=bind --class-name FairMCEventHeader --branch-name MCEventHeader. --class-name "TClonesArray(PixelPoint)" --branch-name PixelPoint --class-name "TClonesArray(FairMCTrack)" --branch-name MCTrack --file-name @SIM_FILE_LOCATION@/examples/MQ/simulation_split/run/DDS.simulation_TGeant3.data.root -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false - - data#all# - - - - - @FAIRROOT_BIN_LOCATION@/parmq-server zeromq --id parmq-server --channel-config name=updateChannel,type=rep,method=bind --severity DEBUG --update-channel-name updateChannel --output-name @SIM_FILE_LOCATION@/examples/MQ/simulation_split/run/DDS.simulation_TGeant3.pars.root -S "<@CMAKE_BINARY_DIR@/lib" -P dds --color false - - updateChannel - - - -
- Sink - ParamServer - Generator - - Transporter - -
- -
From 9d47fa9abb3ac53ea536cf3f1aba330ecd08a1b6 Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Fri, 30 Nov 2018 14:34:56 +0100 Subject: [PATCH 21/27] examples/MQ/simulation_split Fixed test output directory. It should not write to source, only to build. --- examples/MQ/simulation_split/CMakeLists.txt | 1 - examples/MQ/simulation_split/run/CMakeLists.txt | 5 ++--- .../MQ/simulation_split/run/scripts/splitMC-topology.xml | 4 ++-- .../MQ/simulation_split/run/scripts/test-splitMC.sh.in | 8 ++++---- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/examples/MQ/simulation_split/CMakeLists.txt b/examples/MQ/simulation_split/CMakeLists.txt index 3c7ccd09b1..c0d1ab72ce 100644 --- a/examples/MQ/simulation_split/CMakeLists.txt +++ b/examples/MQ/simulation_split/CMakeLists.txt @@ -7,4 +7,3 @@ ################################################################################ Add_Subdirectory(src) Add_Subdirectory(run) -Add_Subdirectory(scripts) diff --git a/examples/MQ/simulation_split/run/CMakeLists.txt b/examples/MQ/simulation_split/run/CMakeLists.txt index a9b804dae2..b164d5a96e 100644 --- a/examples/MQ/simulation_split/run/CMakeLists.txt +++ b/examples/MQ/simulation_split/run/CMakeLists.txt @@ -80,11 +80,10 @@ ForEach(_file RANGE 0 ${_length}) EndForEach(_file RANGE 0 ${_length}) set(SPLITMC_BIN_LOCATION ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split) -set(SPLITMC_FILE_LOCATION ${CMAKE_SOURCE_DIR}) +set(SPLITMC_FILE_LOCATION ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/run/scripts/) set(PIXEL_BIN_LOCATION ${CMAKE_BINARY_DIR}/bin/examples/MQ/pixelDetector) set(FAIRROOT_BIN_LOCATION ${CMAKE_BINARY_DIR}/bin) - Message(STATUS "Looking for DDS!!!") find_package(DDS) set(DDS_LOCATION ${DDS_INCLUDE_DIR}/../) @@ -93,7 +92,7 @@ MESSAGE(STATUS "Set ${DDS_LOCATION} as place to look for DDS_env.sh") configure_file( ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split/splitMC-topology.xml ) -set(SPLITMC_FILE_LOCATION ${CMAKE_SOURCE_DIR}) +set(SPLITMC_FILE_LOCATION ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split) configure_file( ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split/test-splitMC.xml ) diff --git a/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml b/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml index 42a4bd8167..f0743f7aa8 100644 --- a/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml +++ b/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml @@ -30,14 +30,14 @@
- @PIXEL_BIN_LOCATION@/pixel-sink --id splitMC-sink --in-channel dataOut --severity INFO --channel-config name=dataOut,type=pull,method=connect --file-name @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.data.root -S "<@FairMQ_LIBDIR@" -P dds --color false + @PIXEL_BIN_LOCATION@/pixel-sink --id splitMC-sink --in-channel dataOut --severity INFO --channel-config name=dataOut,type=pull,method=connect --file-name @SPLITMC_FILE_LOCATION@/DDS.simulation_TGeant3.data.root -S "<@FairMQ_LIBDIR@" -P dds --color false dataOut - @FAIRROOT_BIN_LOCATION@/parmq-server zeromq --id splitMC-parmq-server --channel-config name=updateChannel,type=rep,method=bind --severity INFO --update-channel-name updateChannel --output-name @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.pars.root -S "<@FairMQ_LIBDIR@" -P dds --color false + @FAIRROOT_BIN_LOCATION@/parmq-server zeromq --id splitMC-parmq-server --channel-config name=updateChannel,type=rep,method=bind --severity INFO --update-channel-name updateChannel --output-name @SPLITMC_FILE_LOCATION@/DDS.simulation_TGeant3.pars.root -S "<@FairMQ_LIBDIR@" -P dds --color false updateChannel diff --git a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in index f7e9a698ac..2df2e048e7 100644 --- a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in +++ b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in @@ -54,8 +54,8 @@ until [ $LOOPING -eq 0 ]; do ((COUNTER++)); if [ $COUNTER -ge 20 ]; then LOOPING=0; fi FILESIZE=0 - if [ -f @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.data.$DDS_ID.root ]; then - FILESIZE=$(ls -l @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.data.$DDS_ID.root | awk '{print $5}') + if [ -f @SPLITMC_FILE_LOCATION@/DDS.simulation_TGeant3.data.$DDS_ID.root ]; then + FILESIZE=$(ls -l @SPLITMC_FILE_LOCATION@/DDS.simulation_TGeant3.data.$DDS_ID.root | awk '{print $5}') fi fairmq-dds-command-ui -s $DDS_ID -c c if [ $FILESIZE -ge 100 ]; then LOOPING=0; fi @@ -98,8 +98,8 @@ echo "***** Stop DDS" dds-server stop $DDS_ID echo "***** Check the output file" -ls -ltr @SPLITMC_FILE_LOCATION@/examples/MQ/simulation_split/run/scripts/DDS.simulation_TGeant3.data.$DDS_ID.root -OUTPUT_EVENTS="$(echo "cout<GetEntries()<GetEntries()< Date: Fri, 30 Nov 2018 15:19:00 +0100 Subject: [PATCH 22/27] test location of config.sh --- examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in index 2df2e048e7..96e4f78b69 100644 --- a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in +++ b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in @@ -5,8 +5,9 @@ NOFNEEDEDAGENTS=5 echo "*************** check paths" env -echo "*************** load dds" +echo "*************** run config.sh in ${CMAKE_BINARY_DIR}" source ${CMAKE_BINARY_DIR}/config.sh +echo "*************** load dds from @DDS_LOCATION@" source @DDS_LOCATION@/DDS_env.sh echo "*************** double check paths" From 2bc45caf8db3553bb2cf23a1f3f8a78435ddd2f0 Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Fri, 30 Nov 2018 15:33:04 +0100 Subject: [PATCH 23/27] see what's in config.sh and DDS_env.sh --- .../MQ/simulation_split/run/scripts/test-splitMC.sh.in | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in index 96e4f78b69..8ed1539c71 100644 --- a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in +++ b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in @@ -6,10 +6,15 @@ echo "*************** check paths" env echo "*************** run config.sh in ${CMAKE_BINARY_DIR}" +cat ${CMAKE_BINARY_DIR}/config.sh +echo "****************************************************" source ${CMAKE_BINARY_DIR}/config.sh +echo "****************************************************" +env echo "*************** load dds from @DDS_LOCATION@" +cat @DDS_LOCATION@/DDS_env.sh +echo "****************************************************" source @DDS_LOCATION@/DDS_env.sh - echo "*************** double check paths" env From 5d294da2e9f37d38832166ac1ea9a199f347c6ad Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Fri, 30 Nov 2018 15:49:53 +0100 Subject: [PATCH 24/27] print DYLD_LIBRARY_PATH --- examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in index 8ed1539c71..3b7c1db881 100644 --- a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in +++ b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in @@ -13,10 +13,12 @@ echo "****************************************************" env echo "*************** load dds from @DDS_LOCATION@" cat @DDS_LOCATION@/DDS_env.sh -echo "****************************************************" source @DDS_LOCATION@/DDS_env.sh echo "*************** double check paths" env +echo "****************************************************" +echo "DYLD_LIBRARIES_PATH=$DYLD_LIBRARY_PATH" +echo "****************************************************" echo "***** Start dds server" dds-server start -s &> dds-server.dat From fc6d9a5c426b09a60fe1a0ee499963566d80bb09 Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Fri, 7 Dec 2018 17:10:52 +0100 Subject: [PATCH 25/27] examples/MQ/simulation_split/ Moved the test from dds-server to dds-session. Checking devices status before finishing. --- .../run/scripts/test-splitMC.sh.in | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in index 3b7c1db881..f3b5c7fb61 100644 --- a/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in +++ b/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in @@ -21,10 +21,10 @@ echo "DYLD_LIBRARIES_PATH=$DYLD_LIBRARY_PATH" echo "****************************************************" echo "***** Start dds server" -dds-server start -s &> dds-server.dat +dds-session start &> dds-server.dat cat dds-server.dat -DDS_ID=$(cat dds-server.dat | grep "Set default" | awk '{print $NF}' ) +DDS_ID=$(cat dds-server.dat | grep "Default DDS session is set to" | awk '{print $NF}' ) echo "***** Create local cluster with $NOFNEEDEDAGENTS agents" dds-submit -s $DDS_ID -r localhost -n $NOFNEEDEDAGENTS &> dds-agents.dat @@ -60,13 +60,21 @@ LOOPING=1 until [ $LOOPING -eq 0 ]; do echo "waiting $COUNTER seconds for the output file to grow"; ((COUNTER++)); - if [ $COUNTER -ge 20 ]; then LOOPING=0; fi + if [ $COUNTER -ge 50 ]; then LOOPING=0; fi FILESIZE=0 if [ -f @SPLITMC_FILE_LOCATION@/DDS.simulation_TGeant3.data.$DDS_ID.root ]; then FILESIZE=$(ls -l @SPLITMC_FILE_LOCATION@/DDS.simulation_TGeant3.data.$DDS_ID.root | awk '{print $5}') fi - fairmq-dds-command-ui -s $DDS_ID -c c - if [ $FILESIZE -ge 100 ]; then LOOPING=0; fi + fairmq-dds-command-ui -s $DDS_ID -c c &> dds_check.log + NOF_RUNNG=$(grep RUNNING dds_check.log | wc -l) + NOF_READY=$(grep READY dds_check.log | wc -l) + NOF_AGENT=$(dds-info -s $DDS_ID -n | grep -m 1 "$NOFNEEDEDAGENTS") + echo "GOT $NOF_RUNNG RUNNING, $NOF_READY READY ($NOF_AGENT AGENTS)" + if [ $NOF_RUNNG -eq $((NOFNEEDEDAGENTS - 1)) ] && [ $NOF_READY -eq 1 ] + then + LOOPING=0; + fi +# if [ $FILESIZE -ge 100 ]; then LOOPING=0; fi sleep 1; : ; done @@ -103,7 +111,7 @@ fairmq-dds-command-ui -s $DDS_ID -c q sleep 1 echo "***** Stop DDS" -dds-server stop $DDS_ID +dds-session stop $DDS_ID -f echo "***** Check the output file" ls -ltr @SPLITMC_FILE_LOCATION@/DDS.simulation_TGeant3.data.$DDS_ID.root From d366bb5bbdeb0793a4fe29621d8c6de755b60b3d Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Tue, 11 Dec 2018 11:08:52 +0100 Subject: [PATCH 26/27] examples/MQ/simulation_split Load FairRoot's config.sh environment for the Transporter task. --- examples/MQ/simulation_split/run/scripts/splitMC-topology.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml b/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml index f0743f7aa8..b30ab85249 100644 --- a/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml +++ b/examples/MQ/simulation_split/run/scripts/splitMC-topology.xml @@ -14,7 +14,8 @@ @SPLITMC_BIN_LOCATION@/runMQTrans --config-key splitMC-trans --id splitMC-trans_%taskIndex% --channel-config name=updateChannel,type=req,method=connect --channel-config name=primariesChannel,type=pull,method=connect --channel-config name=data#all#,type=push,method=connect --transport-name TGeant3 --running-mode pp --severity INFO -S "<@FairMQ_LIBDIR@" -P dds --color false - + @CMAKE_BINARY_DIR@/config.sh + primariesChannel data#all# updateChannel From d3742fe070a35a1093dc98cd9f72de84eccab884 Mon Sep 17 00:00:00 2001 From: Radoslaw Karabowicz Date: Tue, 11 Dec 2018 16:02:18 +0100 Subject: [PATCH 27/27] examples/MQ/simulation_split Added test in pure MQ. --- .../MQ/simulation_split/run/CMakeLists.txt | 8 +++ .../run/scripts/test-splitMQ.sh.in | 59 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 examples/MQ/simulation_split/run/scripts/test-splitMQ.sh.in diff --git a/examples/MQ/simulation_split/run/CMakeLists.txt b/examples/MQ/simulation_split/run/CMakeLists.txt index b164d5a96e..34ad7dc5a5 100644 --- a/examples/MQ/simulation_split/run/CMakeLists.txt +++ b/examples/MQ/simulation_split/run/CMakeLists.txt @@ -9,12 +9,18 @@ Set(MaxTestTime 90) GENERATE_TEST_SCRIPT(${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split/test-splitMC.sh ${CMAKE_CURRENT_BINARY_DIR}) +GENERATE_TEST_SCRIPT(${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split/test-splitMQ.sh ${CMAKE_CURRENT_BINARY_DIR}) Add_Test(splitMC ${CMAKE_CURRENT_BINARY_DIR}/test-splitMC.sh) Set_Tests_Properties(splitMC PROPERTIES TIMEOUT ${MaxTestTime}) Set_Tests_Properties(splitMC PROPERTIES PASS_REGULAR_EXPRESSION "Shell script finished successfully") +Add_Test(splitMQ + ${CMAKE_CURRENT_BINARY_DIR}/test-splitMQ.sh) +Set_Tests_Properties(splitMQ PROPERTIES TIMEOUT ${MaxTestTime}) +Set_Tests_Properties(splitMQ PROPERTIES PASS_REGULAR_EXPRESSION "Shell script finished successfully") + set(INCLUDE_DIRECTORIES ${BASE_INCLUDE_DIRECTORIES} ${CMAKE_SOURCE_DIR}/base/MQ/policies/Sampler @@ -98,3 +104,5 @@ configure_file( ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/run/scripts/spl ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split/test-splitMC.xml ) configure_file( ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/run/scripts/test-splitMC.sh.in ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split/test-splitMC.sh) +configure_file( ${CMAKE_SOURCE_DIR}/examples/MQ/simulation_split/run/scripts/test-splitMQ.sh.in + ${CMAKE_BINARY_DIR}/bin/examples/MQ/simulation_split/test-splitMQ.sh) diff --git a/examples/MQ/simulation_split/run/scripts/test-splitMQ.sh.in b/examples/MQ/simulation_split/run/scripts/test-splitMQ.sh.in new file mode 100644 index 0000000000..45f73134f7 --- /dev/null +++ b/examples/MQ/simulation_split/run/scripts/test-splitMQ.sh.in @@ -0,0 +1,59 @@ +#!/bin/bash + +if [ -f @SPLITMC_FILE_LOCATION@/MQ.simulation_TGeant3.data.root ]; then + echo "File @SPLITMC_FILE_LOCATION@/MQ.simulation_TGeant3.data.root exists. Deleting" + rm -rf @SPLITMC_FILE_LOCATION@/MQ.simulation_TGeant3.data.root +fi + +GENERATOR="@SPLITMC_BIN_LOCATION@/runMQGen --id splitMC-gen --channel-config name=primariesChannel,type=push,method=bind,rateLogging=1,address=tcp://*:5901 --running-mode pp --severity INFO --nof-events 1 --chunk-size 0 --control static --color false" + +TRANSPORTER="@SPLITMC_BIN_LOCATION@/runMQTrans --config-key splitMC-trans --id splitMC-trans_%taskIndex% --channel-config name=updateChannel,type=req,method=connect,rateLogging=1,address=tcp://localhost:5904 --channel-config name=primariesChannel,type=pull,method=connect,rateLogging=1,address=tcp://localhost:5901 --channel-config name=data#all#,type=push,method=connect,rateLogging=1,address=tcp://localhost:5902 --transport-name TGeant3 --running-mode pp --severity INFO --control static --color false" + +MERGER="@SPLITMC_BIN_LOCATION@/runMQChMer --id splitMC-merger --in-channel data#all# --channel-config name=data#all#,type=pull,method=bind,rateLogging=1,address=tcp://*:5902 --out-channel dataOut --channel-config name=dataOut,type=push,method=bind,rateLogging=1,address=tcp://*:5903 --transport zeromq --severity INFO --control static --color false" + +FILESINK="@PIXEL_BIN_LOCATION@/pixel-sink --id splitMC-sink --in-channel dataOut --severity INFO --channel-config name=dataOut,type=pull,method=connect,rateLogging=1,address=tcp://localhost:5903 --file-name @SPLITMC_FILE_LOCATION@/MQ.simulation_TGeant3.data.root --control static --color false" + +PARMQSERVER="@FAIRROOT_BIN_LOCATION@/parmq-server zeromq --id splitMC-parmq-server --channel-config name=updateChannel,type=rep,method=bind,rateLogging=1,address=tcp://*:5904 --severity INFO --update-channel-name updateChannel --output-name @SPLITMC_FILE_LOCATION@/DDS.simulation_TGeant3.pars.root --control static --color false" + +#xterm +aw -geometry 100x25+0+0 -hold -e $GENERATOR & +#xterm +aw -geometry 100x25+0+350 -hold -e $TRANSPORTER & +#xterm +aw -geometry 100x25+500+0 -hold -e $MERGER & +#xterm +aw -geometry 100x25+500+350 -hold -e $FILESINK & +#xterm +aw -geometry 100x25+500+700 -hold -e $PARMQSERVER & + +echo "Start devices" +$GENERATOR &> gen_log.dat & +GENERATOR_PID=$! +$TRANSPORTER &> tra_log.dat & +TRANSPORTER_PID=$! +$MERGER &> mer_log.dat & +MERGER_PID=$! +$FILESINK &> sin_log.dat & +FILESINK_PID=$! +$PARMQSERVER &> par_log.dat & +PARMQSERVER_PID=$! + +echo "Wait for generator to finish" +wait $GENERATOR_PID + +echo "Sleep 5 seconds" +sleep 5 + +echo "Kill other devices" +kill $TRANSPORTER_PID +kill $MERGER_PID +kill $PARMQSERVER_PID +kill $FILESINK_PID + +INPUT_EVENTS="1" +OUTPUT_EVENTS="$(echo "cout<GetEntries()<