CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
FP420SD.cc
Go to the documentation of this file.
1 // File: FP420SD.cc
3 // Date: 02.2006
4 // Description: Sensitive Detector class for FP420
5 // Modifications:
7 
12 
16 
21 
25 
28 
29 #include "G4Track.hh"
30 #include "G4SDManager.hh"
31 #include "G4VProcess.hh"
32 #include "G4EventManager.hh"
33 #include "G4Step.hh"
34 #include "G4ParticleTable.hh"
35 
36 #include "G4SystemOfUnits.hh"
37 
38 #include <string>
39 #include <vector>
40 #include <iostream>
41 
43 
44 //#define debug
45 //-------------------------------------------------------------------
47  const SensitiveDetectorCatalog& clg,
48  edm::ParameterSet const& p,
49  const SimTrackManager* manager)
50  : SensitiveTkDetector(name, clg),
51  numberingScheme(nullptr),
52  hcID(-1),
53  theHC(nullptr),
54  theManager(manager),
55  currentHit(nullptr),
56  theTrack(nullptr),
57  currentPV(nullptr),
58  unitID(0),
59  previousUnitID(0),
60  preStepPoint(nullptr),
61  postStepPoint(nullptr),
62  eventno(0) {
63  //Parameters
65  int verbn = m_p.getUntrackedParameter<int>("Verbosity");
66  //int verbn = 1;
67 
68  SetVerboseLevel(verbn);
69 
70  slave = new TrackingSlaveSD(name);
71 
72  if (name == "FP420SI") {
73  if (verbn > 0) {
74  edm::LogInfo("FP420Sim") << "name = FP420SI and new FP420NumberingSchem";
75  }
77  } else {
78  edm::LogWarning("FP420Sim") << "FP420SD: ReadoutName not supported\n";
79  }
80 }
81 
83  delete slave;
84  delete numberingScheme;
85 }
86 
87 double FP420SD::getEnergyDeposit(G4Step* aStep) { return aStep->GetTotalEnergyDeposit(); }
88 
89 void FP420SD::Initialize(G4HCofThisEvent* HCE) {
90 #ifdef debug
91  LogDebug("FP420Sim") << "FP420SD : Initialize called for " << name << std::endl;
92 #endif
93 
94  theHC = new FP420G4HitCollection(GetName(), collectionName[0]);
95  if (hcID < 0)
96  hcID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]);
97  HCE->AddHitsCollection(hcID, theHC);
98 
99  tsID = -2;
100  // primID = -2;
101  primID = 0;
102 
104 }
105 
106 bool FP420SD::ProcessHits(G4Step* aStep, G4TouchableHistory*) {
107  if (aStep == nullptr) {
108  return true;
109  } else {
110  GetStepInfo(aStep);
111  // LogDebug("FP420Sim") << edeposit <<std::endl;
112 
113  //AZ
114 #ifdef debug
115  LogDebug("FP420Sim") << "FP420SD : number of hits = " << theHC->entries() << std::endl;
116 #endif
117 
118  if (HitExists() == false && edeposit > 0. && theHC->entries() < 200) {
119  CreateNewHit();
120  return true;
121  }
122  }
123  return true;
124 }
125 
126 void FP420SD::GetStepInfo(G4Step* aStep) {
127  preStepPoint = aStep->GetPreStepPoint();
128  postStepPoint = aStep->GetPostStepPoint();
129  theTrack = aStep->GetTrack();
130  hitPoint = preStepPoint->GetPosition();
131  currentPV = preStepPoint->GetPhysicalVolume();
132  hitPointExit = postStepPoint->GetPosition();
133 
134  hitPointLocal = preStepPoint->GetTouchable()->GetHistory()->GetTopTransform().TransformPoint(hitPoint);
135  hitPointLocalExit = preStepPoint->GetTouchable()->GetHistory()->GetTopTransform().TransformPoint(hitPointExit);
136 
137  G4int particleCode = theTrack->GetDefinition()->GetPDGEncoding();
138  if (particleCode == emPDG || particleCode == epPDG || particleCode == gammaPDG) {
139  edepositEM = getEnergyDeposit(aStep);
140  edepositHAD = 0.;
141  } else {
142  edepositEM = 0.;
143  edepositHAD = getEnergyDeposit(aStep);
144  }
145  edeposit = aStep->GetTotalEnergyDeposit();
146  tSlice = (postStepPoint->GetGlobalTime()) / nanosecond;
147  tSliceID = (int)tSlice;
148  unitID = setDetUnitId(aStep);
149 #ifdef debug
150  LogDebug("FP420Sim") << "unitID=" << unitID << std::endl;
151 #endif
152  primaryID = theTrack->GetTrackID();
153  // Position = hitPoint;
154  Pabs = aStep->GetPreStepPoint()->GetMomentum().mag() / GeV;
155  //Tof = 1400. + aStep->GetPostStepPoint()->GetGlobalTime()/nanosecond;
156  Tof = aStep->GetPostStepPoint()->GetGlobalTime() / nanosecond;
157  Eloss = aStep->GetTotalEnergyDeposit() / GeV;
158  ParticleType = theTrack->GetDefinition()->GetPDGEncoding();
159  ThetaAtEntry = aStep->GetPreStepPoint()->GetPosition().theta() / deg;
160  PhiAtEntry = aStep->GetPreStepPoint()->GetPosition().phi() / deg;
161 
162  ParentId = theTrack->GetParentID();
163  Vx = theTrack->GetVertexPosition().x();
164  Vy = theTrack->GetVertexPosition().y();
165  Vz = theTrack->GetVertexPosition().z();
166  X = hitPoint.x();
167  Y = hitPoint.y();
168  Z = hitPoint.z();
169 }
170 
171 uint32_t FP420SD::setDetUnitId(const G4Step* aStep) {
172  return (numberingScheme == nullptr ? 0 : numberingScheme->getUnitID(aStep));
173 }
174 
176  if (primaryID < 1) {
177  edm::LogWarning("FP420Sim") << "***** FP420SD error: primaryID = " << primaryID << " maybe detector name changed";
178  }
179 
180  // Update if in the same detector, time-slice and for same track
181  // if (primaryID == primID && tSliceID == tsID && unitID==previousUnitID) {
182  if (tSliceID == tsID && unitID == previousUnitID) {
183  //AZ:
184  UpdateHit();
185  return true;
186  }
187  // Reset entry point for new primary
188  if (primaryID != primID)
190 
191  //look in the HitContainer whether a hit with the same primID, unitID,
192  //tSliceID already exists:
193 
194  G4bool found = false;
195 
196  // LogDebug("FP420Sim") << "FP420SD: HCollection= " << theHC->entries() <<std::endl;
197  int nhits = theHC->entries();
198  for (int j = 0; j < nhits && !found; j++) {
199  FP420G4Hit* aPreviousHit = (*theHC)[j];
200  if (aPreviousHit->getTrackID() == primaryID && aPreviousHit->getTimeSliceID() == tSliceID &&
201  aPreviousHit->getUnitID() == unitID) {
202  //AZ:
203  currentHit = aPreviousHit;
204  found = true;
205  }
206  }
207 
208  if (found) {
209  //AZ:
210  UpdateHit();
211  return true;
212  } else {
213  return false;
214  }
215 }
216 
220  incidentEnergy = preStepPoint->GetKineticEnergy();
221 }
222 
224  // if (primID<0) return;
225  if (hit == nullptr) {
226  edm::LogWarning("FP420Sim") << "FP420SD: hit to be stored is NULL !!";
227  return;
228  }
229 
230  theHC->insert(hit);
231 }
232 
234 #ifdef debug
235  // << " MVid = " << currentPV->GetMother()->GetCopyNo()
236  LogDebug("FP420Sim") << "FP420SD CreateNewHit for"
237  << " PV " << currentPV->GetName() << " PVid = " << currentPV->GetCopyNo() << " Unit " << unitID
238  << std::endl;
239  LogDebug("FP420Sim") << " primary " << primaryID << " time slice " << tSliceID << " For Track "
240  << theTrack->GetTrackID() << " which is a " << theTrack->GetDefinition()->GetParticleName();
241 
242  if (theTrack->GetTrackID() == 1) {
243  LogDebug("FP420Sim") << " of energy " << theTrack->GetTotalEnergy();
244  } else {
245  LogDebug("FP420Sim") << " daughter of part. " << theTrack->GetParentID();
246  }
247 
248  LogDebug("FP420Sim") << " and created by ";
249  if (theTrack->GetCreatorProcess() != NULL)
250  LogDebug("FP420Sim") << theTrack->GetCreatorProcess()->GetProcessName();
251  else
252  LogDebug("FP420Sim") << "NO process";
253  LogDebug("FP420Sim") << std::endl;
254 #endif
255 
256  currentHit = new FP420G4Hit;
261 
268 
269  // currentHit->setEntry(entrancePoint);
271 
274 
276  currentHit->setVx(Vx);
277  currentHit->setVy(Vy);
278  currentHit->setVz(Vz);
279 
280  currentHit->setX(X);
281  currentHit->setY(Y);
282  currentHit->setZ(Z);
283  //AZ:12.10.2007
284  // UpdateHit();
285  // buffer for next steps:
286  tsID = tSliceID;
287  primID = primaryID;
289 
291 }
292 
294  //
295  if (Eloss > 0.) {
297 
298 #ifdef debug
299  LogDebug("FP420Sim") << "updateHit: add eloss " << Eloss << std::endl;
300  LogDebug("FP420Sim") << "CurrentHit=" << currentHit << ", PostStepPoint=" << postStepPoint->GetPosition()
301  << std::endl;
302 #endif
303  //AZ
304  // currentHit->setEnergyLoss(Eloss);
306  }
307 
308  // buffer for next steps:
309  tsID = tSliceID;
310  primID = primaryID;
312 }
313 
314 G4ThreeVector FP420SD::SetToLocal(const G4ThreeVector& global) {
315  const G4VTouchable* touch = preStepPoint->GetTouchable();
316  theEntryPoint = touch->GetHistory()->GetTopTransform().TransformPoint(global);
317  return theEntryPoint;
318 }
319 
320 G4ThreeVector FP420SD::SetToLocalExit(const G4ThreeVector& globalPoint) {
321  const G4VTouchable* touch = postStepPoint->GetTouchable();
322  theExitPoint = touch->GetHistory()->GetTopTransform().TransformPoint(globalPoint);
323  return theExitPoint;
324 }
325 
326 void FP420SD::EndOfEvent(G4HCofThisEvent*) {
327  // here we loop over transient hits and make them persistent
328 
329  // if(theHC->entries() > 100){
330  // LogDebug("FP420Sim") << "FP420SD: warning!!! Number of hits exceed 100 and =" << theHC->entries() << "\n";
331  // }
332  // for (int j=0; j<theHC->entries() && j<100; j++) {
333  int nhitsHPS240 = 0;
334  int nhitsFP420 = 0;
335  int nhits = theHC->entries();
336  for (int j = 0; j < nhits; j++) {
337  FP420G4Hit* aHit = (*theHC)[j];
338  if ((fabs(aHit->getTof()) > 780. && fabs(aHit->getTof()) < 840.))
339  ++nhitsHPS240;
340  if ((fabs(aHit->getTof()) > 1380. && fabs(aHit->getTof()) < 1450.))
341  ++nhitsFP420;
342  // if(fabs(aHit->getTof()) < 1700.) {
343  if ((fabs(aHit->getTof()) > 780. && fabs(aHit->getTof()) < 840. && nhitsHPS240 < 200.) ||
344  (fabs(aHit->getTof()) > 1380. && fabs(aHit->getTof()) < 1450. && nhitsFP420 < 200.)) {
345 #ifdef ddebug
346  // LogDebug("FP420SD") << " FP420Hit " << j << " " << *aHit << std::endl;
347  LogDebug("FP420Sim") << "hit number" << j << "unit ID = " << aHit->getUnitID() << "\n";
348  LogDebug("FP420Sim") << "entry z " << aHit->getEntry().z() << "\n";
349  LogDebug("FP420Sim") << "entr theta " << aHit->getThetaAtEntry() << "\n";
350 #endif
351 
352  // Local3DPoint locExitPoint(0,0,0);
353  // Local3DPoint locEntryPoint(aHit->getEntry().x(),
354  // aHit->getEntry().y(),
355  // aHit->getEntry().z());
356  Local3DPoint locExitPoint(aHit->getExitLocalP().x(), aHit->getExitLocalP().y(), aHit->getExitLocalP().z());
357  Local3DPoint locEntryPoint(aHit->getEntryLocalP().x(), aHit->getEntryLocalP().y(), aHit->getEntryLocalP().z());
358  // implicit conversion (slicing) to PSimHit!!!
359  slave->processHits(PSimHit(locEntryPoint,
360  locExitPoint, //entryPoint(), exitPoint() Local3DPoint
361  aHit->getPabs(), // pabs() float
362  aHit->getTof(), // tof() float
363  aHit->getEnergyLoss(), // energyLoss() float
364  aHit->getParticleType(), // particleType() int
365  aHit->getUnitID(), // detUnitId() unsigned int
366  aHit->getTrackID(), // trackId() unsigned int
367  aHit->getThetaAtEntry(), // thetaAtEntry() float
368  aHit->getPhiAtEntry())); // phiAtEntry() float
369 
370  //PSimHit( const Local3DPoint& entry, const Local3DPoint& exit,
371  // float pabs, float tof, float eloss, int particleType,
372  // unsigned int detId, unsigned int trackId,
373  // float theta, float phi, unsigned short processType=0) :
374 
375  // LocalVector direction = hit.exitPoint() - hit.entryPoint();
376  //hit.energyLoss
377 
378  /*
379  aHit->getEM(), -
380  aHit->getHadr(), -
381  aHit->getIncidentEnergy(), -
382  aHit->getTimeSlice(), -
383  aHit->getEntry(), -
384  aHit->getParentId(),
385  aHit->getEntryLocalP(), -
386  aHit->getExitLocalP(), -
387  aHit->getX(), -
388  aHit->getY(), -
389  aHit->getZ(), -
390  aHit->getVx(), -
391  aHit->getVy(), -
392  aHit->getVz())); -
393  */
394  } //if Tof<1600. if nhits<100
395  } // for loop on hits
396 
397  Summarize();
398 }
399 
401 
402 void FP420SD::clear() {}
403 
405 
407  LogDebug("FP420Sim") << "FP420SD: Collection " << theHC->GetName() << "\n";
408  theHC->PrintAllHits();
409 }
410 
411 //void FP420SD::SetNumberingScheme(FP420NumberingScheme* scheme){
412 //
413 // if (numberingScheme)
414 // delete numberingScheme;
415 // numberingScheme = scheme;
416 //
417 //}
418 
420  if (slave->name() == hname) {
421  cc = slave->hits();
422  }
423 }
424 
426  LogDebug("ForwardSim") << " Dispatched BeginOfEvent for " << GetName() << " !";
427  clearHits();
428  eventno = (*i)()->GetEventID();
429 }
430 
432  G4ParticleTable* theParticleTable = G4ParticleTable::GetParticleTable();
433  G4String particleName;
434  emPDG = theParticleTable->FindParticle(particleName = "e-")->GetPDGEncoding();
435  epPDG = theParticleTable->FindParticle(particleName = "e+")->GetPDGEncoding();
436  gammaPDG = theParticleTable->FindParticle(particleName = "gamma")->GetPDGEncoding();
437 }
438 
439 void FP420SD::update(const ::EndOfEvent*) {}
440 
442  //AZ:
443  slave->Initialize();
444 }
int eventno
Definition: FP420SD.h:130
T getUntrackedParameter(std::string const &, T const &) const
G4ThreeVector theExitPoint
Definition: FP420SD.h:88
G4int emPDG
Definition: FP420SD.h:134
void setY(float t)
Definition: FP420G4Hit.cc:159
G4ThreeVector SetToLocalExit(const G4ThreeVector &globalPoint)
Definition: FP420SD.cc:320
void setPhiAtEntry(float f)
Definition: FP420G4Hit.cc:153
float getTof() const
Definition: FP420G4Hit.cc:139
void DrawAll() override
Definition: FP420SD.cc:404
float ThetaAtEntry
Definition: FP420SD.h:120
void setVz(float p)
Definition: FP420G4Hit.cc:174
void setEntry(const G4ThreeVector &xyz)
Definition: FP420G4Hit.cc:104
virtual double getEnergyDeposit(G4Step *step)
Definition: FP420SD.cc:87
G4ThreeVector hitPointExit
Definition: FP420SD.h:112
std::string name() const
G4ThreeVector getExitLocalP() const
Definition: FP420G4Hit.cc:109
void setZ(float t)
Definition: FP420G4Hit.cc:162
float Pabs
Definition: FP420SD.h:115
void setPabs(float e)
Definition: FP420G4Hit.cc:143
TrackingSlaveSD * slave
Definition: FP420SD.h:83
#define NULL
Definition: scimark2.h:8
G4StepPoint * preStepPoint
Definition: FP420SD.h:107
void ResetForNewPrimary()
Definition: FP420SD.cc:217
float getPabs() const
Definition: FP420G4Hit.cc:138
void setVx(float p)
Definition: FP420G4Hit.cc:168
G4int hcID
Definition: FP420SD.h:92
void setTrackID(int i)
Definition: FP420G4Hit.cc:122
unsigned int getTrackID() const
Definition: FP420G4Hit.cc:121
void addEnergyDeposit(double em, double hd)
Definition: FP420G4Hit.cc:131
G4int tsID
Definition: FP420SD.h:96
unsigned int primaryID
Definition: FP420SD.h:103
float Eloss
Definition: FP420SD.h:117
unsigned int primID
Definition: FP420SD.h:103
float getPhiAtEntry() const
Definition: FP420G4Hit.cc:150
G4ThreeVector exitPoint
Definition: FP420SD.h:86
float edeposit
Definition: FP420SD.h:109
unsigned int getUnitID() const
Definition: FP420G4Hit.cc:124
void setEnergyLoss(float e)
Definition: FP420G4Hit.cc:146
std::vector< PSimHit > & hits()
void clearHits() override
Definition: FP420SD.cc:441
std::string const collectionName[nCollections]
Definition: Collections.h:59
G4ThreeVector theEntryPoint
Definition: FP420SD.h:87
void setTof(float e)
Definition: FP420G4Hit.cc:144
virtual void Initialize()
float edepositHAD
Definition: FP420SD.h:133
float Vz
Definition: FP420SD.h:124
void GetStepInfo(G4Step *aStep)
Definition: FP420SD.cc:126
void fillHits(edm::PSimHitContainer &, const std::string &) override
Definition: FP420SD.cc:419
G4int gammaPDG
Definition: FP420SD.h:136
FP420G4HitCollection * theHC
Definition: FP420SD.h:93
void CreateNewHit()
Definition: FP420SD.cc:233
G4Track * theTrack
Definition: FP420SD.h:98
void Summarize()
Definition: FP420SD.cc:400
G4int tSliceID
Definition: FP420SD.h:102
G4ThreeVector getEntryLocalP() const
Definition: FP420G4Hit.cc:106
G4bool HitExists()
Definition: FP420SD.cc:175
void update(const BeginOfRun *) override
This routine will be called when the appropriate signal arrives.
Definition: FP420SD.cc:431
void setTimeSlice(double d)
Definition: FP420G4Hit.cc:128
virtual unsigned int getUnitID(const G4Step *aStep) const
float getEnergyLoss() const
Definition: FP420G4Hit.cc:140
void setEntryLocalP(const G4ThreeVector &xyz1)
Definition: FP420G4Hit.cc:107
uint32_t setDetUnitId(const G4Step *) override
Definition: FP420SD.cc:171
G4THitsCollection< FP420G4Hit > FP420G4HitCollection
void setIncidentEnergy(double e)
Definition: FP420G4Hit.cc:119
Log< level::Info, false > LogInfo
uint32_t previousUnitID
Definition: FP420SD.h:101
int getTimeSliceID() const
Definition: FP420G4Hit.cc:129
G4VPhysicalVolume * currentPV
Definition: FP420SD.h:99
void Initialize(G4HCofThisEvent *HCE) override
Definition: FP420SD.cc:89
void setX(float t)
Definition: FP420G4Hit.cc:156
float Tof
Definition: FP420SD.h:116
void setExitLocalP(const G4ThreeVector &xyz1)
Definition: FP420G4Hit.cc:110
void clear() override
Definition: FP420SD.cc:402
int getParticleType() const
Definition: FP420G4Hit.cc:141
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
uint32_t unitID
Definition: FP420SD.h:101
float PhiAtEntry
Definition: FP420SD.h:121
float edepositEM
Definition: FP420SD.h:133
short ParticleType
Definition: FP420SD.h:118
void setParticleType(short i)
Definition: FP420G4Hit.cc:147
void setThetaAtEntry(float t)
Definition: FP420G4Hit.cc:152
G4ThreeVector hitPointLocalExit
Definition: FP420SD.h:114
FP420NumberingScheme * numberingScheme
Definition: FP420SD.h:84
G4double tSlice
Definition: FP420SD.h:105
bool ProcessHits(G4Step *, G4TouchableHistory *) override
Definition: FP420SD.cc:106
void PrintAll() override
Definition: FP420SD.cc:406
FP420SD(const std::string &, const SensitiveDetectorCatalog &, edm::ParameterSet const &, const SimTrackManager *)
Definition: FP420SD.cc:46
G4ThreeVector SetToLocal(const G4ThreeVector &global)
Definition: FP420SD.cc:314
float incidentEnergy
Definition: FP420SD.h:90
void setUnitID(unsigned int i)
Definition: FP420G4Hit.cc:125
int ParentId
Definition: FP420SD.h:123
G4ThreeVector entrancePoint
Definition: FP420SD.h:86
static TrackerG4SimHitNumberingScheme & numberingScheme(const GeometricDet &det)
float Z
Definition: FP420SD.h:125
float Vy
Definition: FP420SD.h:124
virtual bool processHits(const PSimHit &)
void UpdateHit()
Definition: FP420SD.cc:293
std::vector< PSimHit > PSimHitContainer
G4ThreeVector getEntry() const
Definition: FP420G4Hit.cc:103
Log< level::Warning, false > LogWarning
~FP420SD() override
Definition: FP420SD.cc:82
G4int epPDG
Definition: FP420SD.h:135
G4StepPoint * postStepPoint
Definition: FP420SD.h:108
void setParentId(int p)
Definition: FP420G4Hit.cc:165
float X
Definition: FP420SD.h:125
FP420G4Hit * currentHit
Definition: FP420SD.h:97
G4ThreeVector hitPointLocal
Definition: FP420SD.h:113
G4ThreeVector hitPoint
Definition: FP420SD.h:111
void addEnergyLoss(float e)
Definition: FP420G4Hit.cc:145
float getThetaAtEntry() const
Definition: FP420G4Hit.cc:149
float Y
Definition: FP420SD.h:125
void StoreHit(FP420G4Hit *)
Definition: FP420SD.cc:223
void setVy(float p)
Definition: FP420G4Hit.cc:171
#define LogDebug(id)
float Vx
Definition: FP420SD.h:124
void EndOfEvent(G4HCofThisEvent *eventHC) override
Definition: FP420SD.cc:326