Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Coincidence buffer #695

Merged
merged 3 commits into from
Sep 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading