Skip to content

Commit

Permalink
Merge pull request #695 from Oudihat-Radia/coincidenceBuffer
Browse files Browse the repository at this point in the history
Coincidence buffer
  • Loading branch information
kochebina authored Sep 3, 2024
2 parents 9a6d3bb + eaf143e commit f95a49b
Show file tree
Hide file tree
Showing 6 changed files with 157 additions and 65 deletions.
32 changes: 22 additions & 10 deletions source/digits_hits/include/GateCoincidenceBuffer.hh
Original file line number Diff line number Diff line change
Expand Up @@ -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;}
Expand All @@ -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;
};


Expand Down
10 changes: 7 additions & 3 deletions source/digits_hits/include/GateCoincidenceBufferMessenger.hh
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand Down
119 changes: 89 additions & 30 deletions source/digits_hits/src/GateCoincidenceBuffer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -21,21 +19,38 @@ See LICENSE.md for further details
#include "GateMaps.hh"
#include "GateApplicationMgr.hh"
#include <math.h>
#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);
}

Expand All @@ -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_oldClock<clock)? clock - m_oldClock : 0;
switch (m_mode){
case 0 : m_bufferPos = m_bufferPos>deltaClocks ? 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<GateCoincidenceDigi*>::iterator iter;

if (IDC)
{
G4int n_digi = IDC->entries();

//loop over input digits
for (G4int i=0;i<n_digi;i++)
{
inputDigi=(*IDC)[i];


buffer_t clock = (buffer_t) ((inputDigi->GetEndTime()-GateApplicationMgr::GetInstance()->GetTimeStart())* m_readFrequency);

buffer_t deltaClocks = (m_oldClock<clock)? clock - m_oldClock : 0;


switch (m_mode)
{
case 0 : m_bufferPos = m_bufferPos>deltaClocks ? 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)
{
Expand Down
27 changes: 18 additions & 9 deletions source/digits_hits/src/GateCoincidenceBufferMessenger.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}

22 changes: 15 additions & 7 deletions source/digits_hits/src/GateCoincidenceDigitizerMessenger.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,18 @@ 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"

#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

Expand Down Expand Up @@ -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
Expand Down

0 comments on commit f95a49b

Please sign in to comment.