HighLAND
Public Member Functions | List of all members
PionSIManager Class Reference

#include <PionInteractionSystematic.hxx>

Public Member Functions

 PionSIManager ()
 ctor
 
virtual ~PionSIManager ()
 dtor
 
virtual Bool_t InVOI (SubDetId_h det, Float_t *pos) const
 
virtual Bool_t InVOI1 (Float_t *pos) const
 
virtual Bool_t InVOI2 (Float_t *pos) const
 
virtual Bool_t InVOIext (Float_t *pos) const
 
SteppingResult StepBetweenPoints (SubDetId_h det, Int_t charge, TLorentzVector initPos, TVector3 initMom, TLorentzVector finalPos, Double_t stepLength, TGeoManager *geom) const
 
PionInteractionSystematicComputePionWeightInfo (const AnaEventB &event, SubDetId_h det) const
 
PionInteractionSystematicComputePionWeightInfo (const AnaEventB &event, const SelectionBase &sel, Int_t branch) const
 

Detailed Description

Combine everything that may be analysis/selection dependent int a simple class, so that can extended

Definition at line 132 of file PionInteractionSystematic.hxx.

Member Function Documentation

§ ComputePionWeightInfo()

PionInteractionSystematic * PionSIManager::ComputePionWeightInfo ( const AnaEventB event,
SubDetId_h  det 
) const

Calculates the information needed to compute an event weight, as well as a weight correcting Geant4 to Data. Returns a PionInteractionSystematic object containing all the needed information The detector can be provided externally (not only through the selection since for the moment the info is filled prior to any cuts sequence applied) to give more flexibility

Definition at line 767 of file PionInteractionSystematic.cxx.

767  {
768 
769  // Get the geometry from the GeometryManager
770  TGeoManager* pionSIGeom = ND::hgman().GeoManager();
771 
772  //Only load in the geometry if it has not already been loaded by the InputConverter. Use in this case the default file
773  if (!pionSIGeom){
774  ND::hgman().LoadGeometry(); // Use default file
775  pionSIGeom = ND::hgman().GeoManager();
776  }
777 
778  AnaTrueParticleB* allTrajInTPCFGD[NMAXTRUEPARTICLES];
779  int nTraj = anaUtils::GetAllTrajInBunch(event, allTrajInTPCFGD);
780  if((UInt_t) nTraj>NMAXTRUEPARTICLES) nTraj = NMAXTRUEPARTICLES;
781 
782  //Declare the object the result will be written into.
783  //If the geometry has not already been loaded, this will load the geometry.
785  //Now, go through and select only those trajectories that start in the volume we're concerned with.
786  //FGD1FV plus dead material between that and TPC gas.
787  //It is a trajectory of interest if it starts in the volume of interest, as defined by InVOI, or its parent ends
788  //in the volume of interest.
789  std::vector<AnaTrueParticleB*> trajOfInterest;
790  for (Int_t it = 0; it < nTraj; it++){
791 
792  AnaTrueParticleB* track = allTrajInTPCFGD[it];
793 
794  //If the trajectory starts in the volume of interest, save it.
795  //One contiguous VOI, just use the one function.
796  if(InVOI(det, track->Position) ){
797  trajOfInterest.push_back(track);
798  }
799  else{
800  //Otherwise, find its parent, and if the parent ends in the volume of interest,
801  //save this trajectory.
802  for (Int_t jt = 0; jt < nTraj; jt++){
803  AnaTrueParticleB* track2 = allTrajInTPCFGD[jt];
804  if(track->ParentID == track2->ID){
805  if(InVOI(det, track2->PositionEnd) )
806  trajOfInterest.push_back(track);
807  break;
808  }
809  }
810  }
811  }
812 
813  //So at this point we have a vector of all true trajectories that start in the volume of interest and those
814  //whose parents end in the volume of interest. (This is to guard against unsaved trajectories resulting
815  //in an apparent child being created outside the volume of interest, but corresponding to the interaction
816  //that ended the trajectory in the volume of interest.)
817 
818  //We want to go through this list of trajectories, picking out pion trajectories and taking all trajectories with
819  //a pi+/- as a parent and assembling them into Interactions.
820  std::vector<AnaTrueParticleB*> pionTrajs;
821  std::vector<Interaction*> interactions;
822 
823  for(UInt_t oai = 0; oai < trajOfInterest.size(); oai++){
824  //If it's a pi+/- trajectory beginning in the volume of interest, save to pionTrajs.
825  if (trajOfInterest[oai]->PDG == 211 || trajOfInterest[oai]->PDG == -211){
826  if(InVOI(det, trajOfInterest[oai]->Position) )
827  pionTrajs.push_back(trajOfInterest[oai]);
828  }
829 
830  //If it lists a pion as a parent, assign it to an Interaction.
831  if(trajOfInterest[oai]->ParentPDG == 211 || trajOfInterest[oai]->ParentPDG == -211){
832 
833  AnaTrueParticleB* parent = GetParent(trajOfInterest[oai],allTrajInTPCFGD,nTraj);
834  Bool_t matchFound = false;
835  for (UInt_t jsi = 0; jsi < interactions.size(); jsi++){
836  if (interactions[jsi]->IncludesTrajectory(trajOfInterest[oai])){
837  interactions[jsi]->AddTrajectory(trajOfInterest[oai],parent);
838  matchFound = true;
839  break;
840  }
841  }
842 
843  //If an existing interaction does not match the trajectory, make a new interaction for
844  //it to reside in, and add that to the interactions vector.
845  if(!matchFound){
846  Interaction *newInteraction = new Interaction(trajOfInterest[oai], parent);
847  interactions.push_back(newInteraction);
848  }
849  }
850  }
851 
852 
853  //So at this point we have all pion trajectories identified, and all non-primary trajectories assembled into
854  //interactions.
855  //Now, loop through the pion trajectories and the interactions, and assign them to a specific parent pion.
856  //Then, use those trajectories to determine the secondary interaction type of the pion.
857  //Loop over the pions.
858  std::vector< std::pair<AnaTrueParticleB*,Int_t> > pionTrajAndInteraction;
859 
860  //Might as well count the interactions we're interested in now, so we can fill arrays later.
861  Int_t nInteractions = 0;
862  for (UInt_t p = 0; p < pionTrajs.size(); p++){
863 
864  AnaTrueParticleB* pionTraj = pionTrajs[p];
865  TLorentzVector pos(pionTraj->Position[0],pionTraj->Position[1],pionTraj->Position[2],pionTraj->Position[3]);
866  TLorentzVector posEnd(pionTraj->PositionEnd[0],pionTraj->PositionEnd[1],pionTraj->PositionEnd[2],pionTraj->PositionEnd[3]);
867  //Only look for the interaction type if the pion trajectory ends inside of the volume of interest.
868 #if (JMDEBUGVERSION == 0) || (JMDEBUGVERSION == 2) || (JMDEBUGVERSION == 3)
869  if(InVOI(sel.GetDetectorFV(branch), pionTraj->PositionEnd)){
870 
871  //If there are two separate VOIs, since tracking ends at the end of the VOI, we
872  //want to consider any pion trajectory that ends outside the VOI it started in
873  //as having "escaped" (what this if statement elses to.)
874 #elif JMDEBUGVERSION == 1
875  if( (InVOI1( pionTraj->Position ) && InVOI1( pionTraj->PositionEnd )) || (InVOI2( pionTraj->Position ) && InVOI2( pionTraj->PositionEnd ))){
876 #endif
877 
878  //Define a vector to store the (relevant) interactions belonging to this pion.
879  std::vector<Interaction*> thisPionInteractions;
880 
881  //Loop over the interactions vector and fill thisPionInteractions with the ones corresponding to
882  //this pion trajectory.
883  for (UInt_t i = 0; i < interactions.size(); i++){
884 
885  //If the interaction lists the pion as a parent, add it to the list.
886  //Also, we're only interested in interactions at or after the end of the pion trajectory.
887  if (interactions[i]->parentID == pionTraj->ID
888  && interactions[i]->position[3] >= pionTraj->PositionEnd[3]){
889  thisPionInteractions.push_back(interactions[i]);
890  }
891  }
892 
893  //So, at this point should have all the Interactions considered a result of this pion.
894  //Use this vector of interactions and the pion's position to determine its interaction type.
895  //Go through the interactions:
896  //A mu of correct charge originating from the trajectory end point => decay.
897  //A mu originating in a later interactions indicates decay of a pion that need to
898  //count as part of the original secondary interactions.
899  //If it's pi0 decay within 10^-4 ns of the end point, add a pi0.
900  //If it's outside of that time range, attribute it to a pion of the same type as the
901  //incoming pion undergoing a charge exchange (so add another pi+/-)
902  //Once have the full count of relevant particle types, use that to determine the
903  //secondary interaction type.
904  //Start by defining the counters.
905  Int_t NPiPlus = 0;
906  Int_t NPiZero = 0;
907  Int_t NPiMinus = 0;
908  Int_t NMuMinus = 0;
909  Int_t NMuPlus = 0;
910  Int_t NExotic = 0;
911 
912  for (UInt_t i = 0; i < thisPionInteractions.size(); i++){
913 
914  TLorentzVector thisPos(thisPionInteractions[i]->position[0],thisPionInteractions[i]->position[1],thisPionInteractions[i]->position[2],thisPionInteractions[i]->position[3]);
915  //First check the interaction that shares the position with the end of the pion trajectory.
916  //note that this condition only works if posEnd is a TLorentzVector!
917  if(posEnd == thisPos){
918 
919  NPiPlus += thisPionInteractions[i]->NumberOfParticleType(211);
920  NPiZero += thisPionInteractions[i]->NumberOfParticleType(111)
921  + thisPionInteractions[i]->NPiZeroFromDecayProducts();
922  NPiMinus += thisPionInteractions[i]->NumberOfParticleType(-211);
923  NMuPlus += thisPionInteractions[i]->NumberOfParticleType(-13);
924  NMuMinus += thisPionInteractions[i]->NumberOfParticleType(13);
925  NExotic += thisPionInteractions[i]->CountExoticParticles();
926  }
927 
928  //Otherwise it's time separated.
929  //In the below case, assume the particles considered below originate from
930  //something coming out of the original pion trajectory ending vertex (as opposed
931  //to some tertiary or beyond interaction of unsaved trajectories, which is unlikely.)
932  else{
933 
934  //A time separated mu+ implies an unsaved pi+ trajectory.
935  NPiPlus += thisPionInteractions[i]->NumberOfParticleType(-13);
936 
937  //A time separated mu- implies an unsaved pi- trajectory.
938  NPiMinus += thisPionInteractions[i]->NumberOfParticleType(13);
939 
940  //If a pi0 decay was within 10^-4 ns of the pion trajectory end,
941  //count it as being a product of the interaction the pion trajectory ended in.
942  //If there was a saved pi0 trajectory in this time region, assume
943  //that it originated from a time separated interaction.
944  Int_t TSPiZero = 0;
945  if(thisPionInteractions[i]->position[3] - pionTraj->PositionEnd[3] < 10E-4){
946 
947  //Consider the decay products as originating from a pi0 from the
948  //original pion's interaction.
949  NPiZero += thisPionInteractions[i]->NPiZeroFromDecayProducts();
950 
951  //Consider any saved pi0 as originating from a time separated
952  //interaction of an unsaved charged pion trajectory.
953  TSPiZero += thisPionInteractions[i]->NumberOfParticleType(111);
954 
955  }
956 
957  //Otherwise, count it or any saved pi0 as "Time Separated" pi0, which
958  //we later assume originated from a time separated interaction of an
959  //unsaved pi+/- trajectory.
960  else{
961  TSPiZero += thisPionInteractions[i]->NumberOfParticleType(111)
962  + thisPionInteractions[i]->NPiZeroFromDecayProducts();
963  }
964 
965  //Any time separated pions or exotics are likely collectively due
966  //to an unsaved pion trajectory of the same charge as the original pion
967  //trajectory. So count all pi+, time separated pi0, pi-, and exotics, and if the amount is
968  //greater than 0, add a pion of the same charge as the parent of the
969  //interaction.
970  if (thisPionInteractions[i]->NumberOfParticleType(211)
971  + TSPiZero
972  + thisPionInteractions[i]->NumberOfParticleType(-211)
973  + thisPionInteractions[i]->CountExoticParticles() > 0){
974 
975  if(pionTraj->PDG == 211){
976 
977  NPiPlus += 1;
978  }
979 
980  else{
981  NPiMinus += 1;
982  }
983 
984 
985  }
986 
987  }
988 
989  }
990 
991  //clean memory
992  std::vector<Interaction*> interactions;
993  for (std::vector<Interaction*>::iterator it = interactions.begin(); it != interactions.end(); it++){
994  delete (*it);
995 
996  }
997 
998  interactions.clear();
999 
1000 
1001 
1002  //At this point we have all of the relevant particles in the pion's interaction counted.
1003  //Use these counts to determine the interaction type.
1004  Int_t interactionType;
1005 
1006  //First take care of decays.
1007  if((pionTraj->PDG == 211 && NMuPlus == 1)
1008  || (pionTraj->PDG == -211 && NMuMinus == 1)){
1009 
1010  interactionType = 3;
1011 
1012  }
1013 
1014  //Now slot anything with exotic particles in it into Other.
1015  else if(NExotic > 0){
1016  interactionType = 7;
1017  }
1018 
1019  //Multi-pi.
1020  //If it has more than 1 pion total.
1021  else if (NPiPlus + NPiZero + NPiMinus > 1){
1022  interactionType = 5;
1023  }
1024 
1025  //CEX
1026  //Since we've excluded multi-pi events, only have to check the number
1027  //of the desired pion here.
1028  //This is CEX for both pi+ and pi-
1029  else if (NPiZero == 1){
1030  interactionType = 1;
1031  }
1032 
1033  //DCEX
1034  //Has a pi- if parent was pi+, or has a pi+ if parent was pi-
1035  else if ((pionTraj->PDG == 211 && NPiMinus == 1)
1036  || (pionTraj->PDG == -211 && NPiPlus == 1)){
1037  interactionType = 2;
1038  }
1039 
1040  //QE
1041  //If there is one pion of the same kind coming in going out.
1042  else if ((pionTraj->PDG == 211 && NPiPlus == 1)
1043  || (pionTraj->PDG == -211 && NPiMinus == 1)){
1044  interactionType = 4;
1045  }
1046 
1047  //ABS
1048  //If there's no pions or muons, it's absorption.
1049  else if (NPiPlus + NPiZero + NPiMinus
1050  + NMuMinus + NMuPlus == 0){
1051  interactionType = 0;
1052  }
1053 
1054  //As a catch all for weird stuff that shouldn't exist
1055  //(everything is expected to have been caught above.)
1056  else{
1057  interactionType = 7;
1058  }
1059 
1060 
1061  //With the interaction type now determined, write this pion trajectory and its
1062  //interaction type out to the vector that stores them.
1063  pionTrajAndInteraction.push_back(std::make_pair(pionTraj,interactionType));
1064  }
1065 
1066  //If it's not in the volume of interest, assign it the "Escaped" interaction type (8).
1067  else{
1068  pionTrajAndInteraction.push_back(std::make_pair(pionTraj,8));
1069 
1070  }
1071 
1072  //Now, check the recently just added pair to see whether it is one of the interaction
1073  //types we're interested in. If it is, count as one of the nInteractions.
1074  Int_t thisIntType = pionTrajAndInteraction.back().second;
1075 
1076  //If it's one of the interactions we're interested in, count it and
1077  //store its information for later processing.
1078  if(thisIntType == 0 || thisIntType == 1 || thisIntType == 4){
1079 
1080  nInteractions++;
1081  }
1082 
1083 
1084  } //Close loop over pion trajectories.
1085 
1086  //So, at this point we now have a vector of pion trajectories paired with the interaction that ends them
1087  //(or if this interaction occured outside the volume of interest, indication that they escaped.)
1088  //Now we need to step these pions through the detector.
1089  //Propagate from beginning to the end of the trajectory. Elastic interactions aren't accounted for,
1090  //but the error due to that should be small. Propagates out to length between start and end point,
1091  //either stopping when it hits that length or when it goes outside of the volume of interest.
1092 
1093  std::vector<Float_t> allPionSteps;
1094 
1095  Float_t AllPionsMCSumNSigmaStepLength = 0.0;
1096  Float_t AllPionsDataSumNSigmaStepLength = 0.0;
1097 
1098  //Set up as many variables as can.
1099  Int_t nPions = (Int_t)pionTrajAndInteraction.size();
1100  Bool_t* pionType = new Bool_t[(UInt_t)nPions];
1101  Int_t* nSteps = new Int_t[(UInt_t)nPions];
1102  Float_t* initMom = new Float_t[(UInt_t)nPions];
1103  Float_t* pInteraction = new Float_t[(UInt_t)nInteractions];
1104  Int_t* typeInteraction = new Int_t[(UInt_t)nInteractions];
1105  Int_t interactionsSoFar = 0; // Since not every pion has an interaction to count.
1106 
1107  //Variables for validation purposes.
1108  std::vector<Float_t> testFinalMom;
1109  std::vector<TLorentzVector> testFinalPos;
1110  std::vector<Int_t> testInteractionType;
1111  Int_t* pionID = new Int_t[nPions];
1112  AnaTrueParticleB** TrueParticles = new AnaTrueParticleB*[nPions];
1113  AnaTrueParticleB** InteractionTrueParticles = new AnaTrueParticleB*[nInteractions];
1114 
1115  for(UInt_t ip = 0; ip < pionTrajAndInteraction.size(); ip++){
1116 
1117  AnaTrueParticleB* pionTraj = pionTrajAndInteraction[ip].first;
1118  Int_t intCode = pionTrajAndInteraction[ip].second;
1119 
1120  //Set whether it is a pi+ or a pi-.
1121  if(pionTraj->PDG == 211){
1122 
1123  pionType[ip] = true;
1124 
1125  }
1126  else{
1127 
1128  pionType[ip] = false;
1129 
1130  }
1131 
1132  //Store the initial momentum.
1133  //Remember: In highland the magnitude of the momentum
1134  //is stored as Momentum, and the direction elsewhere.
1135  initMom[ip] = pionTraj->Momentum;
1136 
1137  //Store the pion trajectory ID, for validation purposes.
1138  pionID[ip] = pionTraj->ID;
1139 
1140  TrueParticles[ip] = pionTraj;
1141 
1142  TVector3 dir(pionTraj->Direction[0], pionTraj->Direction[1], pionTraj->Direction[2]);
1143  TLorentzVector pos(pionTraj->Position[0],pionTraj->Position[1],pionTraj->Position[2],pionTraj->Position[3]);
1144  TLorentzVector posEnd(pionTraj->PositionEnd[0],pionTraj->PositionEnd[1],pionTraj->PositionEnd[2],pionTraj->PositionEnd[3]);
1145 
1146  SteppingResult sr = StepBetweenPoints(det, (pionTraj->PDG)/211, //Charge
1147  pos,
1148  (pionTraj->Momentum)*dir,
1149  posEnd,
1150  0.1, //Step length, 0.1 mm
1151  pionSIGeom); //The geometry.
1152 
1153  //Store the number of steps for this pion.
1154  nSteps[ip] = sr.stepLengths.size();
1155  //Fill the test variables.
1156  testFinalMom.push_back(sr.finalMom);
1157 
1158  testFinalPos.push_back(sr.finalPos);
1159 
1160  testInteractionType.push_back(intCode);
1161 
1162  //If it's one of the interactions we're interested in, store the information
1163  //we need to store to generate weights.
1164  if(intCode == 0 || intCode == 1 || intCode == 4){
1165 
1166  pInteraction[interactionsSoFar] = sr.finalMom;
1167 
1168  //Get the material this interaction occurred in.
1169  //(Use the true MC end as opposed to the propagated one, which is not exact.
1170  //The interaction necessarily occurred at the end of the trajectory
1171  TGeoNode *node = pionSIGeom->FindNode(pionTraj->PositionEnd[0],
1172  pionTraj->PositionEnd[1],
1173  pionTraj->PositionEnd[2]);
1174 
1175  TGeoVolume *volume = node->GetVolume();
1176  TGeoMaterial *material = volume->GetMaterial();
1177  std::string materialName = material->GetName();
1178 
1179  Int_t materialSeries = GetMaterialSeries(materialName);
1180 
1181 
1182  //Get the pionType Series to add to the interaction type.
1183  //0 for pi+, 100 for pi-
1184  //Int_t pionTypeSeries = (100)*(1-pionType[ip]);
1185  //pionType == true for pi+, false for pi-
1186  Int_t pionTypeSeries = 0;
1187  if(!pionType[ip]){
1188  pionTypeSeries = 100;
1189  }
1190 
1191 
1192  typeInteraction[interactionsSoFar] = intCode + materialSeries + pionTypeSeries;
1193 
1194  InteractionTrueParticles[interactionsSoFar] = pionTraj;
1195 
1196  //Increase the interaction counter to move on to
1197  //the next element.
1198  interactionsSoFar++;
1199  }
1200 
1201 
1202 
1203  //Loop over all the steps for this pion, and add them to allPionSteps
1204  for(UInt_t sIdx = 0; sIdx < sr.stepLengths.size() ; sIdx++){
1205 
1206  allPionSteps.push_back(sr.stepLengths[sIdx]);
1207 
1208  }
1209 
1210  //Add this pion's MC and Data sum N*sigma*StepLength to the total for
1211  //all pions in the event.
1212  AllPionsMCSumNSigmaStepLength += sr.MCSumNSigmaStepLength;
1213  AllPionsDataSumNSigmaStepLength += sr.DataSumNSigmaStepLength;
1214 
1215 
1216  }
1217 
1218 
1219  //Can't fill some output variables until know everything there is to know about the event. Do that here.
1220  Int_t totalSteps = (Int_t)allPionSteps.size();
1221 
1222  //Can now create and fill the stepLengths array.
1223  Float_t* stepLengths = new Float_t[totalSteps];
1224 
1225  for(UInt_t i = 0; i < allPionSteps.size(); i++){
1226 
1227  stepLengths[i] = allPionSteps[i];
1228  }
1229 
1230 
1231  //Use the Step sums and the interactions arrays to compute the MC to data weights.
1232  //Start with the weight portion from the stepping.
1233  Float_t weightMCToData = TMath::Exp(-(AllPionsDataSumNSigmaStepLength - AllPionsMCSumNSigmaStepLength));
1234 
1235  //Now, go through the interactions and multiply the exponential by their contributions.
1236  for(Int_t ni = 0; ni < nInteractions; ni++){
1237 
1238  Int_t siType = typeInteraction[ni];
1239  Float_t siMom = pInteraction[ni];
1240 
1241  int momBin = int(siMom/10);
1242  if (momBin>800) momBin = 800;
1243 
1244  Double_t dataXSec = Interpolate(PiXSec::xsec_data[siType][momBin], PiXSec::xsec_data[siType][momBin+1],momBin,siMom);
1245  Double_t mcXSec = Interpolate(PiXSec::xsec_MC[siType][momBin], PiXSec::xsec_MC[siType][momBin+1],momBin,siMom);
1246 
1247  //Potential 2000 MeV/c cutoff: If want not to weight pions above 2000 MeV/c,
1248  //uncomment the next two commented lines.
1249  //if(pInteraction[ni] < 2000.0){
1250  if(mcXSec != 0.0){
1251  weightMCToData *= dataXSec/mcXSec;
1252  }
1253 
1254  //}
1255  }
1256 
1257  //Now all the variables that are needed have been filled. They need to be written out to the microtree.
1258  //Pass them to our ad-hoc object. May have a better solution later.
1259  //PionInteractionSystematic result;
1260  //This is declared at the beginning of this function now, so that the
1261  //geometry initialization code is called before try to use the geometry.
1262  result->nPions = nPions;
1263  result->pionType = pionType;
1264  result->totalSteps = totalSteps;
1265  result->nSteps = nSteps;
1266  result->initMom = initMom;
1267  result->stepLengths = stepLengths;
1268  result->nInteractions = nInteractions;
1269  result->pInteraction = pInteraction;
1270  result->typeInteraction = typeInteraction;
1271  result->testFinalMom = testFinalMom;
1272  result->testFinalPos = testFinalPos;
1273  result->testInteractionType = testInteractionType;
1274  result->weightMCToData = weightMCToData;
1275  result->MCSumNSigmaStepLength = AllPionsMCSumNSigmaStepLength;
1276  result->DataSumNSigmaStepLength = AllPionsDataSumNSigmaStepLength;
1277  result->MCProbNoInt = TMath::Exp(-AllPionsMCSumNSigmaStepLength);
1278  result->DataProbNoInt = TMath::Exp(-AllPionsDataSumNSigmaStepLength);
1279  result->pionID = pionID;
1280  result->TrueParticles = TrueParticles;
1281  result->InteractionTrueParticles = InteractionTrueParticles;
1282 
1283  return result;
1284 
1285 }
int GetAllTrajInBunch(const AnaEventB &event, AnaTrueParticleB *traj[])
Definition: SubDetUtils.cxx:12
Float_t Momentum
The initial momentum of the true particle.
Int_t ID
The ID of the trueObj, which corresponds to the ID of the TTruthParticle that created it...
Representation of a true Monte Carlo trajectory/particle.
Int_t PDG
The PDG code of this particle.
Int_t ParentID
The ID of this particle&#39;s immediate parent, or 0 if there is no parent.
Float_t PositionEnd[4]
The end position of the true particle.
Float_t Position[4]
The initial position of the true particle.
Float_t Direction[3]
The initial direction of the true particle.
bool LoadGeometry(const std::string &file="", Int_t geomID=-1, const std::string &geomDir="")
Load the TGeoManager from the input root file. Returns true when the new geometry was loaded...

The documentation for this class was generated from the following files: