9 #include "ERTelescopePID.h" 13 #include "G4IonTable.hh" 14 #include "G4ParticleDefinition.hh" 15 #include "G4EmCalculator.hh" 16 #include "G4NistManager.hh" 21 #include "TGeoManager.h" 23 #include "FairRootManager.h" 24 #include "FairRuntimeDb.h" 25 #include "FairLogger.h" 26 #include "FairEventHeader.h" 28 #include "ERBeamDetTrack.h" 30 #include "ERSupport.h" 34 :
ERTask(
"ER qtelescope particle identification scheme") {
39 :
ERTask(
"ER qtelescope particle identification scheme", verbose) {
46 FairRootManager* ioman = FairRootManager::Instance();
48 Fatal(
"Init",
"No FairRootManager");
49 TList* allbrNames = ioman->GetBranchNameList();
50 TIter nextBranch(allbrNames);
52 while (bName = (TObjString*)nextBranch()) {
53 TString bFullName = bName->GetString();
54 if (bFullName.Contains(
"Digi") && bFullName.Contains(
"Telescope")) {
55 fQTelescopeDigi[bFullName] = (TClonesArray*) ioman->GetObject(bFullName);
56 LOG(DEBUG) <<
"Digi branch " << bFullName << FairLogger::endl;
58 if (bFullName.Contains(
"Track") && bFullName.Contains(
"Telescope")) {
59 Int_t bPrefixNameLength = bFullName.First(
'_');
60 TString brName(bFullName(bPrefixNameLength + 1, bFullName.Length()));
61 if (fParticleDescriptions.find(brName) == fParticleDescriptions.end())
63 fQTelescopeTrack[brName] = (TClonesArray*) ioman->GetObject(bFullName);
65 for (
auto particleDescription : fParticleDescriptions[brName]){
66 TString brParticleName;
67 const auto pdg = particleDescription.fPDG;
68 brParticleName.Form(
"%s_%d",brName.Data(), pdg);
69 fQTelescopeParticle[brName][pdg] =
new TClonesArray(
"ERTelescopeParticle",
70 consts::approx_telescope_particle_number);
71 ioman->Register(
"TelescopeParticle_" + brParticleName,
"Telescope",
72 fQTelescopeParticle[brName][pdg], kTRUE);
81 void ERTelescopePID::SetParticle(
82 const TString& trackBranchName,
const PDG pdg,
83 const TString& deStation ,
const TString& eStation ,
84 const Double_t deNormalizedThickness ,
85 const std::vector<TString>& stations_to_use_em_calculator_for_de_e ,
86 const std::vector<TString>& stations_to_use_em_calculator_for_kinetic_energy) {
87 if ((deStation ==
"" && eStation !=
"") || (deStation !=
"" && eStation ==
""))
88 LOG(FATAL) <<
"If one of dE or E station is defined, another should be defined." 90 std::list<TString> eStations;
92 eStations.push_back(eStation);
93 fParticleDescriptions[trackBranchName].emplace_back(pdg, deStation, eStations,
94 deNormalizedThickness,
95 stations_to_use_em_calculator_for_de_e,
96 stations_to_use_em_calculator_for_kinetic_energy);
99 void ERTelescopePID::SetParticle(
100 const TString& trackBranchName,
const PDG pdg,
101 const TString& deStation ,
const std::list<TString>& eStations ,
102 const Double_t deNormalizedThickness ,
103 const std::vector<TString>& stations_to_use_em_calculator_for_de_e ,
104 const std::vector<TString>& stations_to_use_em_calculator_for_kinetic_energy) {
105 fParticleDescriptions[trackBranchName].emplace_back(pdg, deStation, eStations,
106 deNormalizedThickness,
107 stations_to_use_em_calculator_for_de_e,
108 stations_to_use_em_calculator_for_kinetic_energy);
112 LOG(DEBUG) <<
"[ERTelescopePID]------------Started-----------------------------------------------" 115 for (
const auto& itTrackBranches : fQTelescopeTrack) {
116 const auto& trackBranch = itTrackBranches.first;
117 const auto& tracks = itTrackBranches.second;
118 if (tracks->GetEntriesFast() == 0)
120 LOG(DEBUG) <<
"[ERTelescopePID] Work with traŃks in " << trackBranch << FairLogger::endl;
121 for (Int_t iTrack(0); iTrack < tracks->GetEntriesFast(); iTrack++) {
123 for (
const auto particleDescription : fParticleDescriptions[trackBranch]) {
125 const auto pdg = particleDescription.fPDG;
126 const auto* particle = G4ParticleTable::GetParticleTable()->FindParticle(pdg);
128 LOG(FATAL) <<
"Particle with code " << pdg <<
" not found in Geant database "<< FairLogger::endl;
129 const auto mass = particle->GetPDGMass();
131 const auto back_propagation_start_point = FindBackPropagationStartPoint(*track);
136 std::list<DigiOnTrack> digisOnTrack;
137 const auto energyDeposites = CalcEnergyDeposites(
138 *track, back_propagation_start_point, *particle, digisOnTrack,
139 particleDescription.stations_to_use_em_calculator_for_de_e_,
140 particleDescription.stations_to_use_em_calculator_for_kinetic_energy_);
141 Double_t edepInThickStation = -1., edepInThinStation = -1.,
142 edepInThickStationCorrected = -1., edepInThinStationCorrected = -1.;
143 ERChannel channelOfThinStation = consts::undefined_channel;
144 ERChannel channelOfThickStation = consts::undefined_channel;
145 FindEnergiesForDeEAnalysis(trackBranch, digisOnTrack,
146 particleDescription.fEStations, particleDescription.fDeStation,
147 particleDescription.fNormalizedThickness, edepInThickStation, edepInThinStation,
148 edepInThickStationCorrected, edepInThinStationCorrected,
149 channelOfThinStation, channelOfThickStation);
150 const auto digisDeposite = energyDeposites.first;
151 const auto deadDeposite = energyDeposites.second;
152 const auto kinetic_energy = digisDeposite + deadDeposite;
153 const Double_t fullEnergy = mass + kinetic_energy;
155 const Double_t momentumMag = sqrt(pow(fullEnergy, 2) - pow(mass, 2) );
156 TVector3 direction = track->GetDirection();
157 const auto momentum = momentumMag * direction;
158 const TLorentzVector lvTarget (momentum, fullEnergy);
160 auto& particleCollection = *fQTelescopeParticle[trackBranch][pdg];
161 AddParticle(lvTarget, kinetic_energy, deadDeposite, edepInThickStation, edepInThinStation,
162 edepInThickStationCorrected, edepInThinStationCorrected,
163 channelOfThinStation, channelOfThickStation, particleCollection);
167 LOG(DEBUG) <<
"[ERTelescopePID]------------Finished----------------------------------------------" 172 for (
const auto itTrackBranches : fQTelescopeParticle) {
173 for (
const auto itParticleBranches : itTrackBranches.second)
174 if (itParticleBranches.second) {
175 itParticleBranches.second->Delete();
181 AddParticle(
const TLorentzVector& lvInteraction,
const Double_t kinetic_energy,
const Double_t deadEloss,
182 Double_t edepInThickStation, Double_t edepInThinStation,
183 Double_t edepInThickStationCorrected, Double_t edepInThinStationCorrected,
184 const ERChannel channelOfThinStation,
const ERChannel channelOfThickStation,
186 return new(col[col.GetEntriesFast()])
ERTelescopeParticle(lvInteraction, kinetic_energy, deadEloss,
187 edepInThickStation, edepInThinStation,
188 edepInThickStationCorrected, edepInThinStationCorrected,
189 channelOfThinStation, channelOfThickStation);
192 TVector3 ERTelescopePID::FindBackPropagationStartPoint(
const ERTelescopeTrack& track) {
196 const TVector3 telescopeVertex = track.GetXStationVertex();
197 TVector3 back_propagation_start_point = telescopeVertex;
198 const auto direction = track.GetDirection();
199 TGeoNode* currentNode = gGeoManager->InitTrack(
200 telescopeVertex.X(), telescopeVertex.Y(), telescopeVertex.Z(),
201 direction.X(), direction.Y(), direction.Z());
202 TGeoNode* lastSensetiveNode =
nullptr;
203 TString lastSensetivePath;
204 TVector3 lastSensetivePosition;
205 while(!gGeoManager->IsOutside()) {
206 bool inSensetiveVolume =
false;
207 const TString path = gGeoManager->GetPath();
208 if (path.Contains(
"Sensitive")) {
210 inSensetiveVolume =
true;
211 lastSensetiveNode = currentNode;
212 lastSensetivePath = path;
214 currentNode = gGeoManager->FindNextBoundary();
215 currentNode = gGeoManager->Step();
216 if (inSensetiveVolume) {
218 lastSensetivePosition = TVector3(gGeoManager->GetCurrentPoint());
221 if (lastSensetiveNode) {
222 back_propagation_start_point = lastSensetivePosition;
223 LOG(DEBUG) <<
"[FindBackPropagationStartPoint] Last sensetive volume for track " 224 << lastSensetivePath << FairLogger::endl;
226 LOG(DEBUG) <<
"[FindBackPropagationStartPoint] Last sensetive volume for track not found. " 227 <<
"Track telescope vertex will be used as start point for back propagation\n";
229 LOG(DEBUG) <<
"[FindBackPropagationStartPoint] Back propagation start point " 230 <<
"(" << back_propagation_start_point.X() <<
"," << back_propagation_start_point.Y()
231 <<
"," << back_propagation_start_point.Z() <<
")" << FairLogger::endl;
232 return back_propagation_start_point;
235 std::pair<Double_t, Double_t> ERTelescopePID::
236 CalcEnergyDeposites(
const ERTelescopeTrack& track,
const TVector3& start_point,
237 const G4ParticleDefinition& particle,
238 std::list<DigiOnTrack>& digisOnTrack,
239 const std::vector<TString>& stations_to_use_em_calculator_for_de_e,
240 const std::vector<TString>& stations_to_use_em_calculator_for_kinetic_energy) {
244 Double_t digiDepositesSum = 0.;
245 Double_t deadDepositesSum = 0.;
251 Double_t kinetic_energy = 0.;
253 auto back_direction = track.GetBackDirection();
254 const TString log_prefix =
"[ERTelescopePID] [CalcEnergyDeposites] ";
255 LOG(DEBUG) << log_prefix <<
"Energy deposites calculation for particle " 256 << particle.GetParticleName() <<
"; start point = (" << start_point.X() <<
"," 257 << start_point.Y() <<
"," << start_point.Z() <<
"; and direction = " 258 << back_direction.X() <<
"," << back_direction.Y() <<
"," << back_direction.Z()
260 const auto calc_edep_using_em_calulator =
261 [&log_prefix, &particle](TGeoNode* node,
float step,
float T) {
262 const TString materialName = node->GetMedium()->GetMaterial()->GetName();
263 const auto* material = G4NistManager::Instance()->FindOrBuildMaterial(materialName.Data());
264 LOG(DEBUG) << log_prefix <<
" Calc energy deposite for range " << step <<
" in material " 265 << materialName <<
" with kinetic energy " << T << FairLogger::endl;
266 return CalcElossIntegralVolStep(T, particle, *material, step);
268 TGeoNode* node = gGeoManager->InitTrack(start_point.X(), start_point.Y(), start_point.Z(),
269 back_direction.X(), back_direction.Y(), back_direction.Z());
272 while(!gGeoManager->IsOutside()) {
273 gGeoManager->FindNextBoundary();
274 const TVector3 current_position(gGeoManager->GetCurrentPoint());
275 LOG(DEBUG) << log_prefix <<
"track position (" << current_position.X() <<
", " 276 << current_position.Y() <<
", " << current_position.Z() <<
")" << FairLogger::endl;
277 LOG(DEBUG) << log_prefix <<
"path = " 278 << gGeoManager->GetPath() << FairLogger::endl;
280 const TString nodePath = TString(gGeoManager->GetPath());
281 bool is_last_step =
false;
282 if (nodePath.Contains(
"Sensitive")){
283 const Bool_t use_em_calcaulator_for_de_e =
284 std::find_if(stations_to_use_em_calculator_for_de_e.begin(),
285 stations_to_use_em_calculator_for_de_e.end(),
286 [&nodePath](
const TString& station) {
return nodePath.Contains(station);})
287 != stations_to_use_em_calculator_for_de_e.end();
288 const Bool_t use_em_calcaulator_for_kinetic_energy =
289 std::find_if(stations_to_use_em_calculator_for_kinetic_energy.begin(),
290 stations_to_use_em_calculator_for_kinetic_energy.end(),
291 [&nodePath](
const TString& station) {
return nodePath.Contains(station);})
292 != stations_to_use_em_calculator_for_kinetic_energy.end();
293 LOG(DEBUG) << log_prefix <<
" Finding digis..." << FairLogger::endl;
294 auto branchAndDigis = FindDigisByNode(*node, gGeoManager->GetPath());
295 Bool_t digis_for_node_are_found = !branchAndDigis.empty();
296 float edep_using_em_calculator = -1.;
297 if (!digis_for_node_are_found
298 || use_em_calcaulator_for_de_e
299 || use_em_calcaulator_for_kinetic_energy) {
300 edep_using_em_calculator = calc_edep_using_em_calulator(node, gGeoManager->GetStep(),
303 for (
auto& branchAndDigi : branchAndDigis) {
304 const auto digiBranch = branchAndDigi.first;
305 auto* digi = branchAndDigi.second;
306 if (use_em_calcaulator_for_de_e)
307 digi->SetEdep(edep_using_em_calculator);
308 digisOnTrack.emplace_back(digiBranch, digi, gGeoManager->GetStep());
310 const Double_t edepInStation = digis_for_node_are_found && !use_em_calcaulator_for_kinetic_energy
311 ? ApplyEdepAccountingStrategy(branchAndDigis)
312 : edep_using_em_calculator;
313 kinetic_energy += edepInStation;
314 digiDepositesSum += edepInStation;
317 auto step = gGeoManager->GetStep();
318 const auto target_vertex = track.GetTargetVertex();
319 const double step_to_target_vertex = (target_vertex - current_position).Mag();
320 is_last_step = step_to_target_vertex <= step;
321 step = is_last_step ? step_to_target_vertex : step;
322 const auto deadDeposite = calc_edep_using_em_calulator(node, step, kinetic_energy);
323 kinetic_energy += deadDeposite;
324 deadDepositesSum += deadDeposite;
326 LOG(DEBUG) << log_prefix <<
"Current kinetic Energy = " << kinetic_energy << FairLogger::endl;
329 node = gGeoManager->Step();
331 LOG(DEBUG) << log_prefix <<
"Finish deposite calculation with Kinetic energy = " 332 << kinetic_energy <<
" = digis sum deposite : " << digiDepositesSum
333 <<
" + dead deposites sum : " << deadDepositesSum << FairLogger::endl;
334 return {digiDepositesSum, deadDepositesSum};
337 std::map<TString, ERDigi*> ERTelescopePID::FindDigisByNode(
const TGeoNode& node,
const TString& nodePath) {
345 std::map<TString, ERDigi*> resultDigis;
346 const bool nodeOfDoubleSiStation = nodePath.Contains(
"DoubleSi");
348 const auto getDigiBranchSubString = [&node, &nodePath, nodeOfDoubleSiStation]() -> TString {
349 TString digiBranchSubString = nodePath;
350 digiBranchSubString.Remove(digiBranchSubString.Last(
'/'), digiBranchSubString.Length());
351 if (nodeOfDoubleSiStation || nodePath.Contains(
"CsI") || nodePath.Contains(
"pseudo"))
352 digiBranchSubString.Remove(digiBranchSubString.Last(
'/'), digiBranchSubString.Length());
353 if (digiBranchSubString.EndsWith(
"r_station_0"))
354 digiBranchSubString.Remove(digiBranchSubString.Last(
'/'), digiBranchSubString.Length());
355 digiBranchSubString.Remove(0, digiBranchSubString.Last(
'/') + 1);
357 digiBranchSubString.Remove(digiBranchSubString.Last(
'_'), digiBranchSubString.Length());
358 return digiBranchSubString;
360 const auto digiBranchSubstring = getDigiBranchSubString();
361 LOG(DEBUG) <<
" [ERTelescopePID][CalcEnergyDeposites] Digi branch substring " 362 << digiBranchSubstring << FairLogger::endl;
366 std::list<TString> digiBranchNames;
367 for (
const auto& digiCollectionPair : fQTelescopeDigi) {
368 if (digiCollectionPair.first.Contains(digiBranchSubstring))
369 digiBranchNames.push_back(digiCollectionPair.first);
371 if (digiBranchNames.empty()) {
372 LOG(ERROR) <<
" [ERTelescopePID][CalcEnergyDeposites] Branch with substring " << digiBranchSubstring
373 <<
" not found." << FairLogger::endl;
377 const auto getChannels = [&node, &nodePath, nodeOfDoubleSiStation]() -> std::vector<Int_t> {
378 TString pathWithChannelPostfix = nodePath;
379 if (nodePath.Contains(
"CsI") || nodePath.Contains(
"pseudo"))
380 pathWithChannelPostfix.Remove(pathWithChannelPostfix.Last(
'/'), pathWithChannelPostfix.Length());
381 const TString channelStr(pathWithChannelPostfix(pathWithChannelPostfix.Last(
'_') + 1,
382 pathWithChannelPostfix.Length()));
383 if (!nodeOfDoubleSiStation)
384 return {channelStr.Atoi()};
385 pathWithChannelPostfix.Remove(pathWithChannelPostfix.Last(
'/'), pathWithChannelPostfix.Length());
386 const TString secondChannelStr(pathWithChannelPostfix(pathWithChannelPostfix.Last(
'_') + 1,
387 pathWithChannelPostfix.Length()));
388 return {channelStr.Atoi(), secondChannelStr.Atoi()};
390 const auto channels = getChannels();
391 for (
const auto& digiBranchName : digiBranchNames) {
392 auto* digis = fQTelescopeDigi[digiBranchName];
394 Int_t channel = (nodeOfDoubleSiStation && digiBranchName.EndsWith(
"_X")) ? channels[1] : channels[0];
395 LOG(DEBUG) <<
" [ERTelescopePID][CalcEnergyDeposites] Finding digi with channel number " 396 << channel <<
" in branch " << digiBranchName << FairLogger::endl;
397 Bool_t digiFound =
false;
398 for (Int_t iDigi = 0; iDigi < digis->GetEntriesFast(); iDigi++){
399 auto* digi =
static_cast<ERDigi*
>(digis->At(iDigi));
400 LOG(DEBUG) <<
" [ERTelescopePID][CalcEnergyDeposites] Collection has digi with channel " 401 << digi->Channel() <<
" and edep " << digi->Edep() << FairLogger::endl;
402 if (digi->Channel() != channel)
405 LOG(DEBUG) <<
" [ERTelescopePID][CalcEnergyDeposites] Found digi with edep " 406 << digi->Edep() << FairLogger::endl;
407 resultDigis[digiBranchName] = digi;
411 LOG(ERROR) <<
" [ERTelescopePID][CalcEnergyDeposites] Digi with channel number " 412 << channel <<
" not found in collection " << digiBranchName << FairLogger::endl;
417 void ERTelescopePID::FindEnergiesForDeEAnalysis(
const TString& trackBranch,
418 const std::list<DigiOnTrack>& digisOnTrack,
const std::list<TString>& eStations,
419 const TString& deStation,
const Double_t normalizedThickness, Double_t& edepInThickStation,
420 Double_t& edepInThinStation, Double_t& edepInThickStationCorrected,
421 Double_t& edepInThinStationCorrected, ERChannel& channelOfThinStation,
422 ERChannel& channelOfThickStation) {
423 const TString log_prefix =
"[ERTelescopePID][FindEnergiesForDeEAnalysis] ";
424 if (eStations.empty() || deStation ==
"")
426 const auto getDigisOnTrack = [&digisOnTrack](
const TString& stationName) -> std::list<DigiOnTrack> {
427 std::list<DigiOnTrack> digisOnTrackInStation;
428 for (
const auto digiOnTrack : digisOnTrack) {
429 if (digiOnTrack.fBranch.Contains(stationName)) {
430 digisOnTrackInStation.push_back(digiOnTrack);
433 return digisOnTrackInStation;
435 const auto deDigisOnTrack = getDigisOnTrack(deStation);
436 if (deDigisOnTrack.empty()) {
437 LOG(WARNING) << log_prefix <<
"Digi for station " << deStation
438 <<
" not found on track from " << trackBranch <<
" path." << FairLogger::endl;
441 channelOfThinStation = deDigisOnTrack.front().fDigi->Channel();
442 TString eStations_string;
443 for (
const auto& eStation : eStations) {
444 const auto eDigisOnTrack = getDigisOnTrack(eStation);
445 if (eDigisOnTrack.empty()) {
446 LOG(WARNING) << log_prefix <<
"Digi for station " << eStation
447 <<
" not found on track from " << trackBranch <<
" path" << FairLogger::endl;
450 if (edepInThickStation == -1.) {
451 edepInThickStation = ApplyEdepAccountingStrategy(eDigisOnTrack);
452 eStations_string += eStation;
454 edepInThickStation += ApplyEdepAccountingStrategy(eDigisOnTrack);
455 eStations_string += TString(
", ") + eStation;
458 channelOfThickStation = eDigisOnTrack.front().fDigi->Channel();
460 if (edepInThickStation == -1.) {
461 LOG(WARNING) << log_prefix <<
"No digis found for E stations in de-E analysis." << FairLogger::endl;
464 edepInThinStation = ApplyEdepAccountingStrategy(deDigisOnTrack);
465 const auto deSensetiveThickness = deDigisOnTrack.front().fSensetiveThickness;
467 edepInThinStationCorrected = edepInThinStation * normalizedThickness / deSensetiveThickness;
468 LOG(DEBUG) << log_prefix <<
"Digi from station " << deStation
469 <<
" with edep = " << edepInThinStation <<
" [MeV] corrected to edep = " 470 << edepInThinStationCorrected <<
". Normalized thickness = " 471 << normalizedThickness <<
", step in sensetive volume = " << deSensetiveThickness
473 edepInThickStationCorrected = edepInThickStation + edepInThinStation - edepInThinStationCorrected;
474 LOG(DEBUG) << log_prefix <<
"Digis from stations " << eStations_string
475 <<
" with edep = " << edepInThickStation
476 <<
" corrected to " << edepInThickStationCorrected << FairLogger::endl;
479 Double_t ERTelescopePID::ApplyEdepAccountingStrategy(
const std::map<TString, ERDigi*>& digisByBranchName) {
480 if (digisByBranchName.empty())
483 const auto getStrategyForStation = [
this](
const TString& branchName) -> EdepAccountingStrategy {
484 const auto itStationStrategy = std::find_if(
485 fEdepAccountingStrategies.begin(), fEdepAccountingStrategies.end(),
486 [&branchName](
const std::pair<TString, EdepAccountingStrategy> stationAndStrategy) {
487 return branchName.Contains(stationAndStrategy.first);
489 if (itStationStrategy != fEdepAccountingStrategies.end())
490 return itStationStrategy->second;
491 if (branchName.Contains(
"_X"))
492 return EdepFromXChannel;
493 else if (branchName.Contains(
"_Y"))
494 return EdepFromYChannel;
495 if (branchName.Contains(
"CsI"))
496 return SummarizedEdep;
497 LOG(FATAL) <<
"Unable to select edep accaunting strategy by branch " << branchName << FairLogger::endl;
499 const auto strategy = getStrategyForStation(digisByBranchName.begin()->first);
500 Double_t summarizedEdep = 0.;
501 for (
const auto& branchAndDigi : digisByBranchName) {
502 const auto branchName = branchAndDigi.first;
503 const auto* digi = branchAndDigi.second;
505 if ((strategy == EdepFromXChannel && branchName.Contains(
"_X"))
506 || (strategy == EdepFromYChannel && branchName.Contains(
"_Y"))) {
509 summarizedEdep += digi->Edep();
511 if (strategy == AverageEdep)
512 return summarizedEdep / digisByBranchName.size();
513 else if (strategy == SummarizedEdep)
514 return summarizedEdep;
515 LOG(FATAL) <<
"[ERTelescopePID][ApplyEdepAccountingStrategy] Unable to apply edep accounting strategy." << FairLogger::endl;
519 Double_t ERTelescopePID::ApplyEdepAccountingStrategy(
const std::list<DigiOnTrack>& digisOnTrack) {
520 std::map<TString, ERDigi*> digisByBranchName;
521 for (
auto& digiOnTrack : digisOnTrack) {
522 digisByBranchName[digiOnTrack.fBranch] = digiOnTrack.fDigi;
524 return ApplyEdepAccountingStrategy(digisByBranchName);
virtual void Exec(Option_t *opt)
Defines the transformation actions for all input data (Digi) to output data (Track) for each event...
virtual void Reset()
Resets all output data.
ERTelescopeSetup * fQTelescopeSetup
access to ERTelescopeSetup class instance
virtual InitStatus Init()
Defines all input and output object colletions participates in track finding.
virtual InitStatus Init()
ERTelescopePID()
Default constructor.
ERTelescopeParticle * AddParticle(const TLorentzVector &lvInteraction, Double_t kineticEnergy, Double_t deadEloss, Double_t edepInThickStation, Double_t edepInThinStation, Double_t edepInThickStationCorrected, Double_t edepInThinStationCorrected, ERChannel channelOfThinStaion, ERChannel channelOfThickStation, TClonesArray &col)
Adds a ERTelescopeParticles to the output Collection.
std::vector< TString > fAvailibleRunManagers
Run managers that are availible for this task.
Base abstract class for all tasks in er.