4 #include "KVDetectionSimulator.h"
5 #include "KVGeoNavigator.h"
17 KVBase(Form("DetectionSimulator_%s", a->GetName()),
18 Form("Simulate detection of particles or events in detector array %s", a->GetTitle())),
19 fArray(a), fCalcTargELoss(kTRUE)
114 auto part_to_detect = (
KVNucleus*)part.GetFrame(detection_frame,
kFALSE);
117 part_to_detect->SetE0();
118 part.SetParameter(
"SIM:Z", part.GetZ());
119 part.SetParameter(
"SIM:A", part.GetA());
120 part.SetParameter(
"SIM:ENERGY", part_to_detect->GetE());
121 part.SetParameter(
"SIM:THETA", part_to_detect->GetTheta());
122 part.SetParameter(
"SIM:PHI", part_to_detect->GetPhi());
127 part.SetParameter(
"UNDETECTED",
"NEUTRON");
131 part.SetParameter(
"UNDETECTED",
"NOT IN RANGE TABLE");
134 part.SetParameter(
"UNDETECTED",
"AT REST");
139 auto ebef = part_to_detect->GetE();
141 auto eLostInTarget = ebef - part_to_detect->GetE();
142 part.SetParameter(
"ENERGY LOSS IN TARGET", eLostInTarget);
144 part.SetParameter(
"UNDETECTED",
"STOPPED IN TARGET");
152 if (part.GetZ() == 0) {
154 part.SetParameter(
"UNDETECTED",
"NEUTRON");
157 if (part.GetParameters()->HasParameter(
"DEADZONE")) {
159 part.SetParameter(
"UNDETECTED",
"DEAD ZONE");
163 part.SetParameter(
"UNDETECTED",
"NO HIT");
174 part.SetParameter(
"RESIDUAL ENERGY", part_to_detect->GetE());
175 if (part.GetParameters()->HasParameter(
"DEADZONE"))
176 part.SetParameter(
"DETECTED",
"DEADZONE");
178 part.SetParameter(
"DETECTED",
"PUNCH THROUGH");
181 part.SetParameter(
"DETECTED",
"OK");
184 if (!nvl.IsEmpty()) {
185 for (
Int_t ii = 0; ii < nvl.GetNpar(); ++ii) {
186 part.SetParameter(nvl.GetNameAt(ii), nvl.GetDoubleValue(ii));
190 if(part.GetParameters()->HasParameter(
"MULTIGROUP"))
191 multi_group_parts.
Add(&part);
196 part_to_detect->SetMomentum(*part_to_detect->GetPInitial());
199 if(!multi_group_parts.
IsEmpty())
203 for(
auto _p : multi_group_parts)
205 auto part =
dynamic_cast<KVNucleus*
>(_p);
207 auto multigroup = part->GetParameters()->GetIntValue(
"MULTIGROUP");
208 for(
int mgrp = 1; mgrp<multigroup; ++mgrp)
211 part->
Copy(*(nuc =
event->AddNucleus()));
220 part->GetParameters()->RemoveParameter(
Form(
"GROUP_%d",mgrp));
221 part->GetParameters()->RemoveParameter(
Form(
"TRAJECTORY_%d",mgrp));
222 part->GetParameters()->RemoveParameter(
Form(
"STOPPING DETECTOR_%d",mgrp));
228 auto ddet = traj.
Next();
231 TIter it_par(part->GetParameters()->GetList());
235 if(
TString(
np->GetName()).Contains(ddet))
240 for(
auto rp : to_remove)
242 part->GetParameters()->RemoveParameter(rp->GetName());
247 traj = part->GetParameters()->GetStringValue(
"TRAJECTORY");
251 auto ddet = traj.
Next();
258 if(
TString(
np->GetName()).Contains(ddet))
263 for(
auto rp : to_remove)
315 std::unordered_map<unsigned int,TString> traj_group_map;
332 last_detector = curDet;
342 traj =
Form(
"%s/", det_name.
Data());
348 auto& traj_string = traj_group_map[group_num];
349 if(traj_string.IsNull())
350 traj_string.Form(
"%s/", det_name.
Data());
352 traj_string.Prepend(
Form(
"%s/", det_name.
Data()));
358 if(traj_group_map.size() > 1)
362 for(
auto& tgp : traj_group_map)
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t np
R__EXTERN TGeoManager * gGeoManager
char * Form(const char *fmt,...)
Class for iterating over nuclei in events accessed through base pointer/reference.
Base class for KaliVeda framework.
Simulate detection of events in a detector array.
KVTarget * GetTarget() const
void DetectEvent(KVEvent *event, const Char_t *detection_frame="")
Double_t GetMinKECutOff() const
KVNameValueList PropagateParticle(KVNucleus *)
TString fDetectionFrame
when true, only consider geometry, not particle energies
KVRangeTableGeoNavigator * get_array_navigator() const
Bool_t IncludeTargetEnergyLoss() const
KVDetectorEvent fHitGroups
array used for detection
Bool_t fGeoFilter
whether to include energy loss in target, if defined
void AddGroup(KVGroup *grp)
Base class for detector geometry description, interface to energy-loss calculations.
KVGroup * GetGroup() const
Abstract base class container for multi-particle events.
Bool_t IsTracking() const
void ResetTrackID(Int_t id=0)
virtual KVDetector * GetDetector(const Char_t *name) const
Return detector in this structure with given name.
Base class for describing the geometry of a detector array.
KVGroup * GetGroup(const Char_t *name) const
Handles lists of named parameters with different types, a list of KVNamedParameter objects.
Int_t GetIntValue(const Char_t *name) const
void SetValue(const Char_t *name, value_type value)
void RemoveParameter(const Char_t *name)
Int_t GetNpar() const
return the number of stored parameters
Bool_t HasStringParameter(const Char_t *name) const
const Char_t * GetStringValue(const Char_t *name) const
Bool_t HasParameter(const Char_t *name) const
KVHashList * GetList() const
A generic named parameter storing values of different types.
Double_t GetDouble() const
Description of properties and kinematics of atomic nuclei.
void Copy(TObject &) const override
Copy this KVNucleus into the KVNucleus object referenced by "obj".
KVNameValueList * GetParameters() const
void SetParameter(const Char_t *name, ValType value) const
void PropagateParticle(KVNucleus *, TVector3 *TheOrigin=0) override
We start a new track to represent the particle's trajectory through the array.
Bool_t CheckIonForRangeTable(Int_t Z, Int_t A)
void Add(TObject *obj) override
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
void Begin(TString delim) const
KVString Next(Bool_t strip_whitespace=kFALSE) const
void DetectParticle(KVNucleus *, TVector3 *norm=0) override
Extended TList class which does not own its objects by default.
virtual Bool_t IsEmpty() const
const char * GetName() const override
const char * Data() const
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
TString & Prepend(char c, Ssiz_t rep=1)