ERND.cxx
| 1 |
// -------------------------------------------------------------------------
|
|---|---|
| 2 |
// ----- ERND source file -----
|
| 3 |
// ----- Created data by developerName -----
|
| 4 |
// -------------------------------------------------------------------------
|
| 5 |
#include "ERND.h" |
| 6 |
|
| 7 |
#include "TClonesArray.h" |
| 8 |
#include "TParticle.h" |
| 9 |
#include "TVirtualMC.h" |
| 10 |
#include "TString.h" |
| 11 |
|
| 12 |
#include "FairRootManager.h" |
| 13 |
#include "FairLogger.h" |
| 14 |
|
| 15 |
// ----- Default constructor -------------------------------------------
|
| 16 |
ERND::ERND() : |
| 17 |
FairDetector("ERND", kTRUE),
|
| 18 |
fNDPoints(NULL),
|
| 19 |
fStep(0)
|
| 20 |
{
|
| 21 |
LOG(INFO) << " ERND::ERND()" << FairLogger::endl;
|
| 22 |
ResetParameters(); |
| 23 |
fNDPoints = new TClonesArray("ERNDPoint"); |
| 24 |
flGeoPar = new TList();
|
| 25 |
flGeoPar->SetName( GetName()); |
| 26 |
fVerboseLevel = 1;
|
| 27 |
fVersion = 1;
|
| 28 |
} |
| 29 |
// -------------------------------------------------------------------------
|
| 30 |
|
| 31 |
// ----- Standard constructor ------------------------------------------
|
| 32 |
ERND::ERND(const char* name, Bool_t active, Int_t verbose) |
| 33 |
: FairDetector(name, active,verbose), |
| 34 |
fNDPoints(NULL)
|
| 35 |
{
|
| 36 |
ResetParameters(); |
| 37 |
fNDPoints = new TClonesArray("ERNDPoint"); |
| 38 |
flGeoPar = new TList();
|
| 39 |
flGeoPar->SetName( GetName()); |
| 40 |
fVersion = 1;
|
| 41 |
} |
| 42 |
|
| 43 |
ERND::~ERND() {
|
| 44 |
if (fNDPoints) {
|
| 45 |
fNDPoints->Delete(); |
| 46 |
delete fNDPoints;
|
| 47 |
} |
| 48 |
} |
| 49 |
|
| 50 |
void ERND::Initialize()
|
| 51 |
{
|
| 52 |
FairDetector::Initialize(); |
| 53 |
} |
| 54 |
|
| 55 |
|
| 56 |
Bool_t ERND::ProcessHits(FairVolume* vol) {
|
| 57 |
// Set constants for Birk's Law implentation
|
| 58 |
/*
|
| 59 |
static const Double_t dP = 1.032 ;
|
| 60 |
static const Double_t BirkC1 = 0.013/dP;
|
| 61 |
static const Double_t BirkC2 = 9.6e-6/(dP * dP);
|
| 62 |
*/
|
| 63 |
//Birks constants from Craun, R. L.; Smith, D. L. NIM 80,2, p. 239, 1970
|
| 64 |
static const Double_t dP = 0.97; |
| 65 |
// static const Double_t BirkC1 = 0.00856/dP;
|
| 66 |
static const Double_t BirkC1 = 0.001/dP; |
| 67 |
static const Double_t BirkC2 = 4.99e-6/(dP * dP); |
| 68 |
|
| 69 |
|
| 70 |
static Int_t eventID; //! event index |
| 71 |
static Int_t trackID; //! track index |
| 72 |
static Int_t mot0TrackID; //! 0th mother track index |
| 73 |
static Int_t pdg; //! pdg |
| 74 |
static TLorentzVector posIn, posOut; //! position |
| 75 |
static TLorentzVector momIn, momOut; //! momentum |
| 76 |
static Double32_t time; //! time |
| 77 |
static Double32_t length; //! length |
| 78 |
static Double32_t eLoss; //! energy loss |
| 79 |
static Int_t stilbenNr;
|
| 80 |
static Double_t lightYield;
|
| 81 |
|
| 82 |
gMC->SetMaxStep(0.01); |
| 83 |
|
| 84 |
if ( gMC->IsTrackEntering() ) { // Return true if this is the first step of the track in the current volume |
| 85 |
eLoss = 0.;
|
| 86 |
lightYield = 0.;
|
| 87 |
eventID = gMC->CurrentEvent(); |
| 88 |
gMC->TrackPosition(posIn); |
| 89 |
gMC->TrackMomentum(momIn); |
| 90 |
trackID = gMC->GetStack()->GetCurrentTrackNumber(); |
| 91 |
time = gMC->TrackTime() * 1.0e09; // Return the current time of flight of the track being transported |
| 92 |
length = gMC->TrackLength(); // Return the length of the current track from its origin (in cm)
|
| 93 |
mot0TrackID = gMC->GetStack()->GetCurrentTrack()->GetMother(0);
|
| 94 |
pdg = gMC->TrackPid(); // GeV/c2
|
| 95 |
gMC->CurrentVolOffID(3,stilbenNr);
|
| 96 |
} |
| 97 |
|
| 98 |
eLoss += gMC->Edep(); // GeV //Return the energy lost in the current step
|
| 99 |
Double_t curLightYield = 0.;
|
| 100 |
// Apply Birk's law ( Adapted from G3BIRK/Geant3)
|
| 101 |
// Correction for all charge states
|
| 102 |
if (gMC->TrackCharge()!=0) { // Return the charge of the track currently transported |
| 103 |
Double_t BirkC1Mod = 0;
|
| 104 |
// Apply correction for higher charge states
|
| 105 |
if (TMath::Abs(gMC->TrackCharge())>=2) |
| 106 |
BirkC1Mod=BirkC1*7.2/12.6; |
| 107 |
else
|
| 108 |
BirkC1Mod=BirkC1; |
| 109 |
|
| 110 |
if (gMC->TrackStep()>0) |
| 111 |
{
|
| 112 |
Double_t dedxcm=gMC->Edep()*1000./gMC->TrackStep(); //[MeV/cm] |
| 113 |
curLightYield=gMC->Edep()*1000./(1.+BirkC1Mod*dedxcm+BirkC2*dedxcm*dedxcm); //[MeV] |
| 114 |
curLightYield /= 1000.; //[GeV] |
| 115 |
lightYield+=curLightYield; |
| 116 |
} |
| 117 |
} |
| 118 |
|
| 119 |
if (gMC->IsTrackExiting() || //Return true if this is the last step of the track in the current volume |
| 120 |
gMC->IsTrackStop() || //Return true if the track energy has fallen below the threshold
|
| 121 |
gMC->IsTrackDisappeared()) |
| 122 |
{
|
| 123 |
gMC->TrackPosition(posOut); |
| 124 |
gMC->TrackMomentum(momOut); |
| 125 |
|
| 126 |
if (eLoss > 0. && gMC->TrackCharge()!=0){ |
| 127 |
AddPoint( eventID, trackID, mot0TrackID, pdg, |
| 128 |
TVector3(posIn.X(), posIn.Y(), posIn.Z()), |
| 129 |
TVector3(posOut.X(), posOut.Y(), posOut.Z()), |
| 130 |
TVector3(momIn.Px(), momIn.Py(), momIn.Pz()), |
| 131 |
TVector3(momOut.Px(), momOut.Py(), momOut.Pz()), |
| 132 |
time, length, eLoss, stilbenNr, lightYield); |
| 133 |
} |
| 134 |
} |
| 135 |
return kTRUE;
|
| 136 |
} |
| 137 |
|
| 138 |
// ----- Public method EndOfEvent -----------------------------------------
|
| 139 |
void ERND::BeginEvent() {
|
| 140 |
} |
| 141 |
|
| 142 |
|
| 143 |
void ERND::EndOfEvent() {
|
| 144 |
LOG(DEBUG) << "ND Points Count: " << fNDPoints->GetEntriesFast() << FairLogger::endl;
|
| 145 |
Print(); |
| 146 |
Reset(); |
| 147 |
} |
| 148 |
|
| 149 |
// ----- Public method Register -------------------------------------------
|
| 150 |
void ERND::Register() {
|
| 151 |
FairRootManager* ioman = FairRootManager::Instance(); |
| 152 |
if (!ioman)
|
| 153 |
Fatal("Init", "IO manager is not set"); |
| 154 |
ioman->Register("NDPoint","ND", fNDPoints, kTRUE); |
| 155 |
} |
| 156 |
// ----------------------------------------------------------------------------
|
| 157 |
|
| 158 |
// ----- Public method GetCollection --------------------------------------
|
| 159 |
TClonesArray* ERND::GetCollection(Int_t iColl) const {
|
| 160 |
if (iColl == 0) |
| 161 |
return fNDPoints;
|
| 162 |
else
|
| 163 |
return NULL; |
| 164 |
} |
| 165 |
// ----------------------------------------------------------------------------
|
| 166 |
|
| 167 |
// ----- Public method Print ----------------------------------------------
|
| 168 |
void ERND::Print(Option_t *option) const |
| 169 |
{
|
| 170 |
for (Int_t i_point = 0; i_point < fNDPoints->GetEntriesFast(); i_point++){ |
| 171 |
ERNDPoint* point = (ERNDPoint*)fNDPoints->At(i_point); |
| 172 |
point->Print(); |
| 173 |
} |
| 174 |
} |
| 175 |
// ----------------------------------------------------------------------------
|
| 176 |
|
| 177 |
// ----- Public method Reset ----------------------------------------------
|
| 178 |
void ERND::Reset() {
|
| 179 |
fNDPoints->Clear(); |
| 180 |
ResetParameters(); |
| 181 |
} |
| 182 |
// ----------------------------------------------------------------------------
|
| 183 |
|
| 184 |
// ----- Public method CopyClones -----------------------------------------
|
| 185 |
void ERND::CopyClones(TClonesArray* cl1, TClonesArray* cl2, Int_t offset) {
|
| 186 |
LOG(DEBUG) << " ERND::CopyClones(TClonesArray* cl1, TClonesArray* cl2, Int_t offset)"
|
| 187 |
<< FairLogger::endl; |
| 188 |
Int_t nEntries = cl1->GetEntriesFast(); |
| 189 |
LOG(DEBUG) << "decector: " << nEntries << " entries to add" << FairLogger::endl; |
| 190 |
TClonesArray& clref = *cl2; |
| 191 |
ERNDPoint* oldpoint = NULL;
|
| 192 |
for (Int_t i=0; i<nEntries; i++) { |
| 193 |
oldpoint = (ERNDPoint*) cl1->At(i); |
| 194 |
Int_t index = oldpoint->GetTrackID() + offset; |
| 195 |
oldpoint->SetTrackID(index); |
| 196 |
new (clref[cl2->GetEntriesFast()]) ERNDPoint(*oldpoint);
|
| 197 |
} |
| 198 |
LOG(DEBUG) << "decector: " << cl2->GetEntriesFast() << " merged entries" << FairLogger::endl; |
| 199 |
} |
| 200 |
// ----------------------------------------------------------------------------
|
| 201 |
|
| 202 |
// ----- Private method AddPoint --------------------------------------------
|
| 203 |
ERNDPoint* ERND::AddPoint(Int_t eventID, Int_t trackID, |
| 204 |
Int_t mot0trackID, |
| 205 |
Int_t pdg, |
| 206 |
TVector3 posIn, |
| 207 |
TVector3 posOut, TVector3 momIn, |
| 208 |
TVector3 momOut, Double_t time, |
| 209 |
Double_t length, Double_t eLoss, Int_t stilbenNr, Float_t lightYield) {
|
| 210 |
TClonesArray& clref = *fNDPoints; |
| 211 |
Int_t size = clref.GetEntriesFast(); |
| 212 |
return new(clref[size]) ERNDPoint(eventID, trackID, mot0trackID, pdg, |
| 213 |
posIn, posOut, momIn, momOut, time, length, eLoss,stilbenNr,lightYield); |
| 214 |
|
| 215 |
} |
| 216 |
// ----------------------------------------------------------------------------
|
| 217 |
|
| 218 |
// ----- Public method ConstructGeometry ----------------------------------
|
| 219 |
void ERND::ConstructGeometry() {
|
| 220 |
TString fileName = GetGeometryFileName(); |
| 221 |
if(fileName.EndsWith(".root")) { |
| 222 |
LOG(DEBUG) << "Constructing ERND geometry from ROOT file " << fileName.Data() << FairLogger::endl;
|
| 223 |
ConstructRootGeometry(); |
| 224 |
} else {
|
| 225 |
LOG(DEBUG) << "Geometry file name is not set" << FairLogger::endl;
|
| 226 |
} |
| 227 |
|
| 228 |
} |
| 229 |
// ----------------------------------------------------------------------------
|
| 230 |
|
| 231 |
// ----------------------------------------------------------------------------
|
| 232 |
Bool_t ERND::CheckIfSensitive(std::string name)
|
| 233 |
{
|
| 234 |
TString volName = name; |
| 235 |
if(volName.Contains("crystal")) { |
| 236 |
return kTRUE;
|
| 237 |
} |
| 238 |
|
| 239 |
return kFALSE;
|
| 240 |
} |
| 241 |
// ----------------------------------------------------------------------------
|
| 242 |
|
| 243 |
// ----------------------------------------------------------------------------
|
| 244 |
void ERND::ResetParameters() {
|
| 245 |
}; |
| 246 |
// ----------------------------------------------------------------------------
|
| 247 |
ClassImp(ERND) |