diff --git a/source/digits_hits/include/GateCoincidenceBuffer.hh b/source/digits_hits/include/GateCoincidenceBuffer.hh index 7892e3053..98adeec2c 100644 --- a/source/digits_hits/include/GateCoincidenceBuffer.hh +++ b/source/digits_hits/include/GateCoincidenceBuffer.hh @@ -16,26 +16,35 @@ See LICENSE.md for further details #include "G4ThreeVector.hh" #include "GateVCoincidencePulseProcessor.hh" +#include "GateVDigitizerModule.hh" +#include "GateCoincidenceDigi.hh" +#include "GateClockDependent.hh" +#include "GateCrystalSD.hh" + +#include "GateDigi.hh" +#include "GateCoincidenceBufferMessenger.hh" +#include "GateCoincidenceDigitizer.hh" class GateCoincidenceBufferMessenger; -class GateCoincidenceBuffer : public GateVCoincidencePulseProcessor +class GateCoincidenceBuffer : public GateVDigitizerModule { public: typedef unsigned long long int buffer_t; - + void Digitize() override; //! Destructor - virtual ~GateCoincidenceBuffer() ; + // virtual ~GateCoincidenceBuffer() ; //! Constructs a new dead time attached to a GateDigitizer - GateCoincidenceBuffer(GateCoincidencePulseProcessorChain* itsChain, - const G4String& itsName); + //GateCoincidenceBuffer(GateCoincidencePulseProcessorChain* itsChain, + ///const G4String& itsName); +GateCoincidenceBuffer(GateCoincidenceDigitizer *digitizer, G4String name); + ~GateCoincidenceBuffer(); -public: void SetBufferSize(buffer_t val) { m_bufferSize = val;} void SetReadFrequency(G4double val) { m_readFrequency = val;} @@ -50,17 +59,20 @@ public: protected: /*! Implementation of the pure virtual method declared by the base class GateVCoincidencePulseProcessor*/ - GateCoincidencePulse* ProcessPulse(GateCoincidencePulse* inputPulse,G4int iPulse); - - -private: + //GateCoincidencePulse* ProcessPulse(GateCoincidencePulse* inputPulse,G4int iPulse); buffer_t m_bufferSize; buffer_t m_bufferPos; buffer_t m_oldClock; G4double m_readFrequency; // G4bool m_doModifyTime; G4int m_mode; + +private: + GateCoincidenceBufferMessenger *m_messenger; //!< Messenger + GateCoincidenceDigi* m_outputDigi; + GateCoincidenceDigiCollection* m_OutputDigiCollection; + GateCoincidenceDigitizer *m_digitizer; }; diff --git a/source/digits_hits/include/GateCoincidenceBufferMessenger.hh b/source/digits_hits/include/GateCoincidenceBufferMessenger.hh index 4323c3bcb..c78c8fc53 100644 --- a/source/digits_hits/include/GateCoincidenceBufferMessenger.hh +++ b/source/digits_hits/include/GateCoincidenceBufferMessenger.hh @@ -9,8 +9,11 @@ See LICENSE.md for further details #ifndef GateCoincidenceBufferMessenger_h #define GateCoincidenceBufferMessenger_h 1 +#include "G4UImessenger.hh" +#include "globals.hh" -#include "GatePulseProcessorMessenger.hh" +#include "GateClockDependentMessenger.hh" +//#include "GatePulseProcessorMessenger.hh" class G4UIdirectory; class G4UIcmdWithADoubleAndUnit; @@ -21,14 +24,15 @@ class GateCoincidenceBuffer; class GateCoincidenceBufferMessenger: public GateClockDependentMessenger { public: - GateCoincidenceBufferMessenger(GateCoincidenceBuffer* itsBuffer); + GateCoincidenceBufferMessenger(GateCoincidenceBuffer*); virtual ~GateCoincidenceBufferMessenger(); inline void SetNewValue(G4UIcommand* aCommand, G4String aString); - inline GateCoincidenceBuffer* GetBuffer(){ return (GateCoincidenceBuffer*) GetClockDependent(); } + //inline GateCoincidenceBuffer* GetBuffer(){ return (GateCoincidenceBuffer*) GetClockDependent(); } private: + GateCoincidenceBuffer* m_CoincidenceBuffer; G4UIcmdWithADoubleAndUnit *m_bufferSizeCmd; //!< set the dead time value G4UIcmdWithADoubleAndUnit *m_readFrequencyCmd; //!< set the dead time mode // G4UIcmdWithABool *m_modifyTimeCmd; //!< does buffer modify the time of pulses diff --git a/source/digits_hits/src/GateCoincidenceBuffer.cc b/source/digits_hits/src/GateCoincidenceBuffer.cc index 4c531a558..be4435a06 100644 --- a/source/digits_hits/src/GateCoincidenceBuffer.cc +++ b/source/digits_hits/src/GateCoincidenceBuffer.cc @@ -7,9 +7,7 @@ See LICENSE.md for further details ----------------------*/ -#include "GateCoincidenceBuffer.hh" #include "G4UnitsTable.hh" -#include "GateCoincidenceBufferMessenger.hh" #include "GateTools.hh" #include "GateVolumeID.hh" #include "GateOutputVolumeID.hh" @@ -21,21 +19,38 @@ See LICENSE.md for further details #include "GateMaps.hh" #include "GateApplicationMgr.hh" #include +#include "GateCoincidenceBuffer.hh" +#include "GateCoincidenceBufferMessenger.hh" +#include "GateDigi.hh" +#include "GateCoincidenceDigi.hh" +#include "GateDigitizerMgr.hh" +#include "G4SystemOfUnits.hh" +#include "G4EventManager.hh" +#include "G4Event.hh" +#include "G4SDManager.hh" +#include "G4DigiManager.hh" +#include "G4ios.hh" -GateCoincidenceBuffer::GateCoincidenceBuffer(GateCoincidencePulseProcessorChain* itsChain, - const G4String& itsName) - : GateVCoincidencePulseProcessor(itsChain,itsName) - , m_bufferSize(1) + + +GateCoincidenceBuffer::GateCoincidenceBuffer(GateCoincidenceDigitizer *digitizer, G4String name) + :GateVDigitizerModule(name,"digitizerMgr/CoincidenceDigitizer/"+digitizer->m_digitizerName+"/"+name, digitizer), + m_bufferSize(1) , m_bufferPos(0) , m_oldClock(0) - , m_readFrequency(1) + , m_readFrequency(1), + m_outputDigi(0), + m_OutputDigiCollection(0), + m_digitizer(digitizer) // , m_doModifyTime(false) , m_mode(0) -{ + +{ G4String colName = digitizer->GetOutputName() ; +collectionName.push_back(colName); m_messenger = new GateCoincidenceBufferMessenger(this); } @@ -48,31 +63,75 @@ GateCoincidenceBuffer::~GateCoincidenceBuffer() } +void GateCoincidenceBuffer::Digitize() +{ + G4String digitizerName = m_digitizer->m_digitizerName; + G4String outputCollName = m_digitizer-> GetOutputName(); -GateCoincidencePulse* GateCoincidenceBuffer::ProcessPulse(GateCoincidencePulse* inputPulse,G4int ) -{ - GateCoincidencePulse* ans=0; - buffer_t clock = (buffer_t)( (inputPulse->GetTime()-GateApplicationMgr::GetInstance()->GetTimeStart())* m_readFrequency); - buffer_t deltaClocks = (m_oldClockdeltaClocks ? m_bufferPos-deltaClocks : 0; break; - case 1 : if (deltaClocks>0) m_bufferPos=0;break; - } - - if (m_bufferPos+1<=m_bufferSize) { - ans = new GateCoincidencePulse(*inputPulse); -// if (m_doModifyTime) { -// G4double tme = GateApplicationMgr::GetInstance()->GetTimeStart()+clock/m_readFrequency; -// if (m_mode==1) tme += 1./m_readFrequency; -// ans->SetTime(tme); -// } - m_bufferPos++; - } - m_oldClock = clock; - return ans; -} + m_OutputDigiCollection = new GateCoincidenceDigiCollection(GetName(),outputCollName); // to create the Digi Collection + +G4DigiManager* DigiMan = G4DigiManager::GetDMpointer(); + + + GateCoincidenceDigiCollection* IDC = 0; + IDC = (GateCoincidenceDigiCollection*) (DigiMan->GetDigiCollection(m_DCID)); + + GateCoincidenceDigi* inputDigi = new GateCoincidenceDigi(); + + std::vector< GateCoincidenceDigi* >* OutputDigiCollectionVector = m_OutputDigiCollection->GetVector (); + std::vector::iterator iter; + + if (IDC) + { + G4int n_digi = IDC->entries(); + + //loop over input digits + for (G4int i=0;iGetEndTime()-GateApplicationMgr::GetInstance()->GetTimeStart())* m_readFrequency); + + buffer_t deltaClocks = (m_oldClockdeltaClocks ? m_bufferPos-deltaClocks : 0; break; + case 1 : if (deltaClocks>0) m_bufferPos=0;break; + } + + + if (m_bufferPos+1<=m_bufferSize) + {m_outputDigi = new GateCoincidenceDigi(*inputDigi); + // if (m_doModifyTime) + //{ + // G4double tme = GateApplicationMgr::GetInstance()->GetTimeStart()+clock/m_readFrequency; + + // if (m_mode==1) tme += 1./m_readFrequency; + // m_outputDigi->SetTime(tme); + //} + m_OutputDigiCollection->insert(m_outputDigi); + + m_bufferPos++; + + } + m_oldClock = clock; + + + } //loop over input digits + } //IDC + else + { + if (nVerboseLevel>1) + G4cout << "[GateCoincidenceBuffer::Digitize]: input digi collection is null -> nothing to do\n\n"; + return; + } + StoreDigiCollection(m_OutputDigiCollection); + } void GateCoincidenceBuffer::DescribeMyself(size_t indent) { diff --git a/source/digits_hits/src/GateCoincidenceBufferMessenger.cc b/source/digits_hits/src/GateCoincidenceBufferMessenger.cc index abf5658ef..303e3f009 100644 --- a/source/digits_hits/src/GateCoincidenceBufferMessenger.cc +++ b/source/digits_hits/src/GateCoincidenceBufferMessenger.cc @@ -7,16 +7,24 @@ See LICENSE.md for further details ----------------------*/ -#include "GateCoincidenceBufferMessenger.hh" - -#include "GateCoincidenceBuffer.hh" - +#include "../include/GateCoincidenceBuffer.hh" +#include "../include/GateCoincidenceBufferMessenger.hh" #include "G4UIcmdWithADoubleAndUnit.hh" //#include "G4UIcmdWithABool.hh" +#include "G4UIcmdWithAnInteger.hh" +#include "GateDigitizerMgr.hh" + +#include "G4SystemOfUnits.hh" +#include "G4UIcmdWithAString.hh" +#include "G4UIdirectory.hh" + + #include "G4UIcmdWithAnInteger.hh" -GateCoincidenceBufferMessenger::GateCoincidenceBufferMessenger(GateCoincidenceBuffer* itsBuffer) - : GateClockDependentMessenger(itsBuffer) + +GateCoincidenceBufferMessenger::GateCoincidenceBufferMessenger(GateCoincidenceBuffer* CoincidenceBuffer) +:GateClockDependentMessenger(CoincidenceBuffer), + m_CoincidenceBuffer(CoincidenceBuffer) { G4String guidance; G4String cmdName; @@ -55,13 +63,14 @@ GateCoincidenceBufferMessenger::~GateCoincidenceBufferMessenger() void GateCoincidenceBufferMessenger::SetNewValue(G4UIcommand* command, G4String newValue) { if (command== m_bufferSizeCmd) - { GetBuffer()->SetBufferSize((long long unsigned int) m_bufferSizeCmd->GetNewDoubleValue(newValue)); } + { m_CoincidenceBuffer->SetBufferSize((long long unsigned int) m_bufferSizeCmd->GetNewDoubleValue(newValue)); } else if (command == m_readFrequencyCmd) - GetBuffer()->SetReadFrequency(m_readFrequencyCmd->GetNewDoubleValue(newValue)); + m_CoincidenceBuffer->SetReadFrequency(m_readFrequencyCmd->GetNewDoubleValue(newValue)); // else if (command == m_modifyTimeCmd) // GetBuffer()->SetDoModifyTime(m_modifyTimeCmd->GetNewBoolValue(newValue)); else if (command == m_setModeCmd) - GetBuffer()->SetMode(m_setModeCmd->GetNewIntValue(newValue)); + m_CoincidenceBuffer ->SetMode(m_setModeCmd->GetNewIntValue(newValue)); else GateClockDependentMessenger::SetNewValue(command,newValue); } + diff --git a/source/digits_hits/src/GateCoincidenceDigitizerMessenger.cc b/source/digits_hits/src/GateCoincidenceDigitizerMessenger.cc index 2c8359942..cc090560a 100644 --- a/source/digits_hits/src/GateCoincidenceDigitizerMessenger.cc +++ b/source/digits_hits/src/GateCoincidenceDigitizerMessenger.cc @@ -26,9 +26,8 @@ See LICENSE.md for further details #include "GateDigitizerMgr.hh" #include "GateCoincidenceDeadTime.hh" - #include "GateCoincidenceMultiplesKiller.hh" - +#include "GateCoincidenceBuffer.hh" /*#include "GateAdder.hh" #include "GateReadout.hh" #include "GateEnergyFraming.hh" @@ -124,7 +123,9 @@ void GateCoincidenceDigitizerMessenger::SetNewValue(G4UIcommand* command,G4Strin const G4String& GateCoincidenceDigitizerMessenger::DumpMap() { - static G4String theList = "deadtime multiplesKiller";//readout adder energyFraming timeResolution energyResolution spatialResolution efficiency deadtime pileup adderCompton opticaladder noise merger"; + + static G4String theList = "deadtime multiplesKiller buffer";//readout adder energyFraming timeResolution energyResolution spatialResolution efficiency deadtime pileup adderCompton opticaladder noise merger"; + return theList; } @@ -152,10 +153,17 @@ void GateCoincidenceDigitizerMessenger::DoInsertion(const G4String& childTypeNam } else if (childTypeName=="multiplesKiller") - { - newDM = new GateCoincidenceMultiplesKiller(m_CoinDigitizer, DMname); - m_CoinDigitizer->AddNewModule(newDM); - } + { + newDM = new GateCoincidenceMultiplesKiller(m_CoinDigitizer, DMname); + m_CoinDigitizer->AddNewModule(newDM); + } + + else if (childTypeName=="buffer") + { + newDM = new GateCoincidenceBuffer(m_CoinDigitizer, DMname); + m_CoinDigitizer->AddNewModule(newDM); + } + /*else if (childTypeName=="readout") { newDM = new GateReadout(m_digitizer, DMname); diff --git a/source/physics/src/GateCoincidencePulseProcessorChainMessenger.cc b/source/physics/src/GateCoincidencePulseProcessorChainMessenger.cc index 3e3672a18..0f4be1d83 100644 --- a/source/physics/src/GateCoincidencePulseProcessorChainMessenger.cc +++ b/source/physics/src/GateCoincidencePulseProcessorChainMessenger.cc @@ -9,6 +9,9 @@ See LICENSE.md for further details #include "GateCoincidencePulseProcessorChainMessenger.hh" +//#include "../../digits_hits/include/GateCoincidenceBuffer.hh" +//#include "../../digits_hits/include/GateCoincidenceMultiplesKiller.hh" +#include "../../digits_hits/include/GateCoincidenceTimeDiffSelector.hh" #include "G4UIdirectory.hh" #include "G4UIcmdWithAString.hh" #include "G4UIcmdWithABool.hh" @@ -16,11 +19,8 @@ See LICENSE.md for further details #include "GateVCoincidencePulseProcessor.hh" #include "GateCoincidencePulseProcessorChain.hh" -#include "GateCoincidenceDeadTime.hh" -#include "GateCoincidenceTimeDiffSelector.hh" +//#include "GateCoincidenceDeadTime.hh" #include "GateCoincidenceGeometrySelector.hh" -#include "GateCoincidenceBuffer.hh" -#include "GateCoincidenceMultiplesKiller.hh" #include "GateTriCoincidenceSorter.hh" //mhadi_add #include "GateCCCoincidenceSequenceRecon.hh"//AE @@ -96,8 +96,8 @@ void GateCoincidencePulseProcessorChainMessenger::DoInsertion(const G4String& ch newProcessor = new GateCoincidenceTimeDiffSelector(GetProcessorChain(),newInsertionName); else if (childTypeName=="geometrySelector") newProcessor = new GateCoincidenceGeometrySelector(GetProcessorChain(),newInsertionName); - else if (childTypeName=="buffer") - newProcessor = new GateCoincidenceBuffer(GetProcessorChain(),newInsertionName); + // else if (childTypeName=="buffer") + // newProcessor = new GateCoincidenceBuffer(GetProcessorChain(),newInsertionName); //else if (childTypeName=="multiplesKiller") //newProcessor = new GateCoincidenceMultiplesKiller(GetProcessorChain(),newInsertionName); else if (childTypeName=="triCoincProcessor") //mhadi_add