23 std::string isotope_key;
24 isotope_key = std::to_string( Ai ) +
gElName.at( Zi );
27 if ( ame_be_str.Contains(
"#") )
28 ame_be_str.ReplaceAll(
"#",
".");
31 if ( ame_be_str.Contains(
"*") )
32 ame_be.insert( std::make_pair( isotope_key, 0 ) );
36 ame_be.insert( std::make_pair( isotope_key, ame_be_str.Atof() ) );
46 std::ifstream input_file;
49 std::string line, BE_str, N_str, Z_str;
50 std::string startline =
"1N-Z";
55 if( input_file.is_open() ){
58 std::getline( input_file, line );
61 while( line.substr( 0, startline.size() ) != startline ){
64 if( !std::getline( input_file, line ) ){
66 std::cout <<
"Can't read mass tables from ";
75 std::getline( input_file, line );
78 while( std::getline( input_file, line ) ){
81 N_str = line.substr( 5, 5 );
82 Z_str = line.substr( 9, 5 );
83 BE_str = line.substr( 54, 13 );
86 Ni = std::stoi( N_str );
87 Zi = std::stoi( Z_str );
99 std::cout <<
"Mass tables file doesn't exist: " <<
AME_FILE << std::endl;
110 TEnv *config =
new TEnv( fInputFile.data() );
112 std::string isotope_key;
115 Beam.
SetA( config->GetValue(
"BeamA", 185 ) );
116 Beam.
SetZ( config->GetValue(
"BeamZ", 80 ) );
119 std::cout <<
"Not a recognised element with Z = ";
120 std::cout <<
Beam.
GetZ() <<
" (beam)" << std::endl;
125 Beam.
SetEx( config->GetValue(
"BeamEx", 0. ) );
127 Eb = config->GetValue(
"BeamE", 4500.0 );
131 Target.
SetA( config->GetValue(
"TargetA", 120 ) );
132 Target.
SetZ( config->GetValue(
"TargetZ", 50 ) );
136 std::cout <<
"Not a recognised element with Z = ";
137 std::cout <<
Target.
GetZ() <<
" (target)" << std::endl;
142 Target.
SetEx( config->GetValue(
"TargetEx", 0. ) );
148 std::cout <<
"Not a recognised element with Z = ";
149 std::cout <<
Ejectile.
GetZ() <<
" (ejectile)" << std::endl;
156 Recoil.
SetA( config->GetValue(
"RecoilA", 120 ) );
157 Recoil.
SetZ( config->GetValue(
"RecoilZ", 50 ) );
160 std::cout <<
"Not a recognised element with Z = ";
161 std::cout <<
Recoil.
GetZ() <<
" (recoil)" << std::endl;
166 Recoil.
SetEx( config->GetValue(
"RecoilEx", 0. ) );
171 recoilcutfile = config->GetValue(
"RecoilCut.File",
"NULL" );
172 recoilcutname = config->GetValue(
"RecoilCut.Name",
"CUTG" );
187 laser_mode = config->GetValue(
"LaserMode", 2 );
190 EBIS_On = config->GetValue(
"EBIS.On", 1.2e6 );
191 EBIS_Off = config->GetValue(
"EBIS.Off", 2.52e7 );
195 t1_cut = config->GetValue(
"T1.Cut",
false );
196 t1_time[0] = config->GetValue(
"T1.Min", 0.0 );
197 t1_time[1] = config->GetValue(
"T1.Max", 1.2e9 );
209 hist_wo_addback = config->GetValue(
"Histograms.WithoutAddback",
true );
210 hist_w_addback = config->GetValue(
"Histograms.WithAddback",
false );
213 hist_by_pmult = config->GetValue(
"Histograms.ByMultiplicity",
false );
214 hist_by_sector = config->GetValue(
"Histograms.BySector",
false );
215 hist_by_t1 = config->GetValue(
"Histograms.ByT1",
false );
217 hist_electron = config->GetValue(
"Histograms.Electron",
false );
220 hist_ion_chamb = config->GetValue(
"Histograms.IonChamber",
false );
223 gamma_bins = config->GetValue(
"Histograms.Gamma.Bins", 6000 );
224 gamma_range[0] = config->GetValue(
"Histograms.Gamma.Min", -0.5 );
225 gamma_range[1] = config->GetValue(
"Histograms.Gamma.Max", 5999.5 );
226 electron_bins = config->GetValue(
"Histograms.Electron.Bins", 2000 );
227 electron_range[0] = config->GetValue(
"Histograms.Electron.Min", -0.5 );
228 electron_range[1] = config->GetValue(
"Histograms.Electron.Max", 1999.5 );
231 double pmax_default = 2.0e6;
233 if(
Recoil.
GetA() <= 12 ) pmax_default = 200e3;
246 particle_bins = config->GetValue(
"Histograms.Particle.Bins", 2000 );
247 particle_range[0] = config->GetValue(
"Histograms.Particle.Min", 0.0 );
248 particle_range[1] = config->GetValue(
"Histograms.Particle.Max", pmax_default );
251 pg_prompt[0] = config->GetValue(
"ParticleGamma_PromptTime.Min", -300 );
252 pg_prompt[1] = config->GetValue(
"ParticleGamma_PromptTime.Max", 300 );
253 pg_random[0] = config->GetValue(
"ParticleGamma_RandomTime.Min", 600 );
254 pg_random[1] = config->GetValue(
"ParticleGamma_RandomTime.Max", 1200 );
255 gg_prompt[0] = config->GetValue(
"GammaGamma_PromptTime.Min", -250 );
256 gg_prompt[1] = config->GetValue(
"GammaGamma_PromptTime.Max", 250 );
257 gg_random[0] = config->GetValue(
"GammaGamma_RandomTime.Min", 500 );
258 gg_random[1] = config->GetValue(
"GammaGamma_RandomTime.Max", 1000 );
259 pp_prompt[0] = config->GetValue(
"ParticleParticle_PromptTime.Min", -200 );
260 pp_prompt[1] = config->GetValue(
"ParticleParticle_PromptTime.Max", 200 );
261 pp_random[0] = config->GetValue(
"ParticleParticle_RandomTime.Min", 400 );
262 pp_random[1] = config->GetValue(
"ParticleParticle_RandomTime.Max", 800 );
263 ee_prompt[0] = config->GetValue(
"ElectronElectron_PromptTime.Min", -200 );
264 ee_prompt[1] = config->GetValue(
"ElectronElectron_PromptTime.Max", 200 );
265 ee_random[0] = config->GetValue(
"ElectronElectron_RandomTime.Min", 400 );
266 ee_random[1] = config->GetValue(
"ElectronElectron_RandomTime.Max", 800 );
267 ge_prompt[0] = config->GetValue(
"GammaElectron_PromptTime.Min", -200 );
268 ge_prompt[1] = config->GetValue(
"GammaElectron_PromptTime.Max", 200 );
269 ge_random[0] = config->GetValue(
"GammaElectron_RandomTime.Min", 400 );
270 ge_random[1] = config->GetValue(
"GammaElectron_RandomTime.Max", 800 );
271 pe_prompt[0] = config->GetValue(
"ParticleElectron_PromptTime.Min", -200 );
272 pe_prompt[1] = config->GetValue(
"ParticleElectron_PromptTime.Max", 200 );
273 pe_random[0] = config->GetValue(
"ParticleElectron_RandomTime.Min", 400 );
274 pe_random[1] = config->GetValue(
"ParticleElectron_RandomTime.Max", 800 );
285 cd_dist.resize(
set->GetNumberOfCDDetectors() );
289 for(
unsigned int i = 0; i <
set->GetNumberOfCDDetectors(); ++i ) {
291 if( i == 0 ) d_tmp = 32.0;
292 else if( i == 1 ) d_tmp = -64.0;
293 cd_dist[i] = config->GetValue( Form(
"CD_%d.Distance", i ), d_tmp );
294 cd_offset[i] = config->GetValue( Form(
"CD_%d.PhiOffset", i ), 0.0 );
295 dead_layer[i] = config->GetValue( Form(
"CD_%d.DeadLayer", i ), 0.0007 );
301 x_offset = config->GetValue(
"TargetOffset.X", 0.0 );
302 y_offset = config->GetValue(
"TargetOffset.Y", 0.0 );
303 z_offset = config->GetValue(
"TargetOffset.Z", 0.0 );
307 std::string degrader_material_tmp = config->GetValue(
"DegraderMaterial",
"197Au" );
308 for(
unsigned int i = 0; i < degrader_material_tmp.length(); i++ ){
309 if( std::isspace( degrader_material_tmp[i] ) || degrader_material_tmp[i] ==
'#' )
315 mb_type = config->GetValue(
"MiniballGeometry.Type", 1 );
316 mb_geo.resize(
set->GetNumberOfMiniballClusters() );
317 mb_theta.resize(
set->GetNumberOfMiniballClusters() );
318 mb_phi.resize(
set->GetNumberOfMiniballClusters() );
319 mb_alpha.resize(
set->GetNumberOfMiniballClusters() );
320 mb_r.resize(
set->GetNumberOfMiniballClusters() );
321 for(
unsigned int i = 0; i <
set->GetNumberOfMiniballClusters(); ++i ) {
323 mb_theta[i] = config->GetValue( Form(
"MiniballCluster_%d.Theta", i ), 0. );
324 mb_phi[i] = config->GetValue( Form(
"MiniballCluster_%d.Phi", i ), 0. );
325 mb_alpha[i] = config->GetValue( Form(
"MiniballCluster_%d.Alpha", i ), 0. );
326 mb_r[i] = config->GetValue( Form(
"MiniballCluster_%d.R", i ), 0. );
334 spede_dist = config->GetValue(
"Spede.Distance", -30.0 );
335 spede_offset = config->GetValue(
"Spede.PhiOffset", 0.0 );
336 if(
spede_dist > 0 ) std::cout <<
" !! WARNING !! Spede.Distance should be negative" << std::endl;
340 for(
unsigned int i = 0; i < 7; ++i )
341 gStopping.push_back( std::make_unique<TGraph>() );
354 std::cout << std::endl <<
" +++ ";
357 std::cout <<
" +++" << std::endl;
358 std::cout <<
"Q-value = " <<
GetQvalue()*0.001 <<
" MeV" << std::endl;
359 std::cout <<
"Incoming beam energy = ";
361 std::cout <<
"Target thickness = ";
369 std::cout <<
"Beam energy at centre of target = ";
373 else std::cout <<
"Stopping powers not calculated" << std::endl;
375 std::cout <<
"Beam velocity at reaction position = ";
381 std::cout <<
" mg/cm2 has been included. Doppler correction will be performed";
383 std::cout <<
" BEFORE the degrader";
385 std::cout <<
" AFTER the degrader";
387 std::cout <<
" with unknown DopplerMode = " <<
doppler_mode;
388 std::cout << std::endl;
400 if( opt.length() > 0 )
401 stream <<
"# The following print options were used: " << opt << std::endl;
404 for(
unsigned int i = 0; i <
set->GetNumberOfMiniballClusters(); ++i ) {
406 stream << Form(
"MiniballCluster_%d.Theta: %f", i,
GetMiniballTheta(i) * TMath::RadToDeg() ) << std::endl;
407 stream << Form(
"MiniballCluster_%d.Phi: %f", i,
GetMiniballPhi(i) * TMath::RadToDeg() ) << std::endl;
408 stream << Form(
"MiniballCluster_%d.Alpha: %f", i,
GetMiniballAlpha(i) * TMath::RadToDeg() ) << std::endl;
409 stream << Form(
"MiniballCluster_%d.R: %f", i,
GetMiniballR(i) ) << std::endl;
420 std::shared_ptr<TCutG> cut;
423 if( cut_filename !=
"NULL" ) {
425 TFile *
cut_file =
new TFile( cut_filename.data(),
"READ" );
427 std::cout <<
"Couldn't open " << cut_filename <<
" correctly" << std::endl;
431 if( !
cut_file->GetListOfKeys()->Contains( cut_name.data() ) )
432 std::cout <<
"Couldn't find " << cut_name <<
" in "
433 << cut_filename << std::endl;
435 cut = std::make_shared<TCutG>( *
static_cast<TCutG*
>(
cut_file->Get( cut_name.data() )->Clone() ) );
444 if( !cut ) cut = std::make_shared<TCutG>();
454 if( det >=
set->GetNumberOfCDDetectors() ) {
456 std::cerr <<
"Bad CD Detector requested = " << det << std::endl;
462 TVector3 vec( 0, 0,
cd_dist[det] );
465 float phi = 90.0 * sec;
469 if(
set->GetNumberOfCDNStrips() == 12 ||
set->GetNumberOfCDNStrips() == 24 ) {
473 double offset_x = 1.6728;
474 double offset_y = 1.5751;
475 double grouping = 24.0 / (double)
set->GetNumberOfCDNStrips();
477 double phi_body = grouping * ( nid + 0.5 ) * alpha / 24.;
480 r_lab += ( 15.5 - pid ) * 2.0;
482 double beta = 180.0 - TMath::ATan(offset_y/offset_x) * TMath::RadToDeg();
483 double bphi = beta + phi_body;
484 if( bphi > 180.0) bphi = 360.0 - bphi;
486 double r_d = TMath::Sqrt( offset_x * offset_x + offset_y * offset_y );
487 double delta = TMath::ASin( r_d * TMath::Sin( bphi * TMath::DegToRad() ) / r_lab );
488 delta *= TMath::RadToDeg();
490 double gamma = 180.0 - bphi - delta;
493 if (TMath::Abs(TMath::Sin( bphi * TMath::DegToRad() ) < 1e-5)) r_body = r_lab - r_d;
494 else r_body = TMath::Sin( gamma * TMath::DegToRad() ) / ( TMath::Sin( bphi * TMath::DegToRad() ) / r_lab );
496 double x_body = r_body * TMath::Cos( phi_body * TMath::DegToRad() );
497 double y_body = r_body * TMath::Sin( phi_body * TMath::DegToRad() );
500 double y = y_body + offset_y;
501 double x = x_body + offset_x;
510 //float initial_offset = 0.000286 * TMath::Power(pid,4);
511 //initial_offset += -0.00541 * TMath::Power(pid,3);
512 //initial_offset += 0.04437 * TMath::Power(pid,2);
513 //initial_offset += 0.01679 * pid;
514 //initial_offset += 2.4137;
517 //double phi_coverage = -0.00625 * TMath::Power(pid,3);
518 //phi_coverage += 0.07056 * TMath::Power(pid,2);
519 //phi_coverage += -0.54542 * pid;
520 //phi_coverage += 77.66278; // parametrization from Konstantin Stoychev
522 //float pixel_width = phi_coverage / 12.;
524 //phi += initial_offset;
525 //phi += pixel_width / 2.;
526 //phi += nid * pixel_width;
537 else if(
set->GetNumberOfCDNStrips() == 16 ) {
543 x += ( pid + 0.5 ) * 2.0;
548 if( nid < 4 ) phi += nid * 3.5;
549 else if( nid < 12 ) phi += 14. + ( nid - 4 ) * 7.0;
550 else phi += 70. + ( nid - 12 ) * 3.5;
555 vec.RotateZ( phi * TMath::DegToRad() );
585 if( random ) mult =
rand.Rndm();
586 if( seg < 8 ) x += 5.15 * mult;
587 else if( seg < 16 ) x += 5.2 + 3.85 * mult;
588 else if( seg < 24 ) x += 9.1 + 3.15 * mult;
594 if( random ) mult =
rand.Rndm();
595 float phi = (float)(seg%8) * TMath::Pi() / 4.0;
596 phi += 0.98 * mult * TMath::Pi() / 4.0;
597 phi += 0.01 * TMath::Pi() / 4.0;
631 TVector3 gvec =
mb_geo[g->GetCluster()].GetSegVector( g->GetCrystal(), g->GetSegment() );
640 return TMath::Cos( gvec.Angle( p.
GetVector() ) );
654 return TMath::Cos( evec.Angle( p.
GetVector() ) );
661 double gamma = 1.0 / TMath::Sqrt( 1.0 - TMath::Power( pbeta, 2.0 ) );
662 double corr = 1.0 - pbeta * costheta;
672 TVector3 gvec = TVector3( 0., 0., 1.0 );
673 gvec.SetTheta( gtheta );
684 TVector3 pvec( 0., 0., 1.0 );
685 pvec.SetTheta( ptheta );
688 double gamma = 1.0 / TMath::Sqrt( 1.0 - TMath::Power( pbeta, 2.0 ) );
689 double corr = 1.0 - pbeta * TMath::Cos( gvec.Angle( pvec ) );
699 TVector3 gvec = TVector3( 0., 0., 1.0 );
700 gvec.SetTheta( gtheta );
716 double costheta = TMath::Cos( gvec.Angle( p.
GetVector() ) );
717 double corr = 1.0 - p.
GetBeta() * costheta;
727 TVector3 gvec =
mb_geo[g->GetCluster()].GetSegVector( g->GetCrystal(), g->GetSegment() );
737 TVector3 pvec( 0., 0., 1.0 );
738 pvec.SetTheta( ptheta );
741 double gamma = 1.0 / TMath::Sqrt( 1.0 - TMath::Power( pbeta, 2.0 ) );
742 double corr = 1.0 - pbeta * TMath::Cos( gvec.Angle( pvec ) );
746 return corr * g->GetSegmentSumEnergy();
748 return corr * g->GetEnergy();
764 return corr * g->GetSegmentSumEnergy();
766 return corr * g->GetEnergy();
780 TMath::Sqrt(s->GetEnergy() * s->GetEnergy() + 2.0 *
e_mass * s->GetEnergy())) /
842 y *= TMath::Sin( maxang );
849 if( kinflag ) y = TMath::ASin( -y );
850 else y = TMath::ASin( y );
899 double En = p->GetEnergy(), Eemit = En;
932 double maxang = TMath::ASin( 1. /
GetEpsilon() );
935 y *= TMath::Sin( maxang );
939 if( kinflag ) y = TMath::ASin( -y );
940 else y = TMath::ASin( y );
997 double Th = TMath::ATan(y);
998 if( Th < 0. ) Th += TMath::Pi();
1032 double En = TMath::Power(
GetEpsilon(), 2.0 ) + 1.0;
1042 double Th = TMath::ATan(y);
1043 if( Th < 0. ) Th += TMath::Pi();
1076 double En = p->GetEnergy();
1078 double after_target_recoil_energy = p->GetEnergy();
1079 double after_degrader_recoil_energy = p->GetEnergy();
1086 after_target_recoil_energy = En;
1087 after_degrader_recoil_energy = En;
1095 after_target_recoil_energy = En;
1115 double theta3 = TMath::ATan2(p3y, p3x);
1126 double p3y_CoM = p3y;
1128 double theta3_CoM = TMath::ATan2(p3y_CoM, p3x_CoM);
1145 double eff_thick = 0.5 *
target_thickness / TMath::Abs( TMath::Cos(theta3) );
1147 beam_kinetic_energy -= eloss;
1154 beam_kinetic_energy -= eloss;
1187 unsigned int Nmeshpoints = 50;
1188 double dx = dist/(double)Nmeshpoints;
1191 for(
unsigned int i = 0; i < Nmeshpoints; i++ ){
1193 double Eloss = g->Eval(E) * dx;
1210 if( isotope2 ==
"1H" ) isotope2 =
"CH2";
1211 if( isotope2 ==
"2H" ) isotope2 =
"CD2";
1212 if( isotope2 ==
"3H" ) isotope2 =
"Ti";
1215 std::string title =
"Stopping powers for ";
1216 title += isotope1 +
" in " + isotope2;
1217 title +=
";" + isotope1 +
" energy [keV];";
1218 title +=
"Energy loss in " + isotope2;
1219 if( isotope2 ==
"Si" ) title +=
" [keV/mm]";
1220 else title +=
" [keV/(mg/cm^{2})]";
1223 g->SetTitle( title.c_str() );
1226 gErrorIgnoreLevel = kWarning;
1230 std::string srimfilename = std::string(
SRIM_DIR ) +
"/";
1231 srimfilename += isotope1 +
"_" + isotope2 +
".txt";
1233 std::ifstream input_file;
1234 input_file.open( srimfilename, std::ios::in );
1237 if( !input_file.is_open() ) {
1239 std::cerr <<
"Cannot open " << srimfilename << std::endl;
1245 std::string line, units, tmp_str;
1246 std::stringstream line_ss;
1247 double En, nucl, elec, total, tmp_dbl;
1250 std::getline( input_file, line );
1251 if( line.substr( 3, 5 ) ==
"=====" ) {
1254 while( std::getline( input_file, line ) && !input_file.eof() ) {
1257 if( line.length() < 10 )
continue;
1260 if( line.substr( 3, 5 ) ==
"-----" )
break;
1267 std::cerr <<
"Not a srim file: " << srimfilename << std::endl;
1273 while( std::getline( input_file, line ) && !input_file.eof() ) {
1276 if( line.length() < 10 )
continue;
1281 line_ss >> En >> units >> nucl >> elec >> tmp_dbl >> tmp_str >> tmp_dbl >> tmp_str;
1283 if( units ==
"eV" ) En *= 1E-3;
1284 else if( units ==
"keV" ) En *= 1E0;
1285 else if( units ==
"MeV" ) En *= 1E3;
1286 else if( units ==
"GeV" ) En *= 1E6;
1288 total = nucl + elec ;
1291 if( line.substr( 3, 9 ) ==
"---------" )
break;
1293 g->SetPoint( g->GetN(), En, total );
1298 std::getline( input_file, line );
1299 if( line.substr( 0, 9 ) !=
" Multiply" ){
1301 std::cerr <<
"Couldn't get conversion factors from ";
1302 std::cerr << srimfilename << std::endl;
1306 std::getline( input_file, line );
1309 double conv, conv_keVum, conv_MeVmgcm2;
1310 std::getline( input_file, line );
1311 std::getline( input_file, line );
1312 conv_keVum = std::stod( line.substr( 0, 15 ) );
1313 std::getline( input_file, line );
1314 std::getline( input_file, line );
1315 std::getline( input_file, line );
1316 conv_MeVmgcm2 = std::stod( line.substr( 0, 15 ) );
1319 if( isotope2 ==
"Si" ) conv = conv_keVum * 1E3;
1320 else conv = conv_MeVmgcm2 * 1E3;
1321 for( Int_t i = 0; i < g->GetN(); ++i ){
1323 g->GetPoint( i, En, total );
1324 g->SetPoint( i, En, total*conv );
1330 TCanvas *c =
new TCanvas();
1334 std::string pdfname = srimfilename.substr( 0, srimfilename.find_last_of(
".") ) +
".pdf";
1335 c->SaveAs( pdfname.c_str() );
1341 gErrorIgnoreLevel = kInfo;
ClassImp(MiniballParticle) ClassImp(MiniballReaction) MiniballReaction
const std::vector< std::string > gElName
const double e_mass
mass of the electron in keV/c^2
void SetBindingEnergy(double myBE)
void SetTheta(double mytheta)
void SetPhi(double myphi)
void SetThetaCoM(double mytheta)
void SetEnergy(double myElab)
void SetEnergyCoM(double myECoM)
std::vector< double > cd_dist
distance from target to CD detector in mm
TVector3 GetCDVector(unsigned char det, unsigned char sec, float pid, float nid)
std::vector< double > mb_r
double GetEBISTimeRatio()
TVector3 GetElectronVector(unsigned char seg)
double GetParticleElectronTimeRatio()
double EBIS_On
beam on max time in ns
std::string transfercutname
double spede_offset
phi rotation of the SPEDE detector
double GetMiniballAlpha(unsigned char clu)
double y_offset
vertical offset of the target/beam position, with respect to the CD and Miniball in mm
MiniballParticle Ejectile
std::vector< double > mb_alpha
void IdentifyRecoil(std::shared_ptr< ParticleEvt > p, bool kinflag=false)
std::vector< std::unique_ptr< TGraph > > gStopping
double x_offset
horizontal offset of the target/beam position, with respect to the CD and Miniball in mm
int pe_prompt[2]
particle-electron prompt
std::shared_ptr< TCutG > recoil_cut
std::vector< double > mb_theta
std::string ejectilecutfile
TVector3 GetSpedeVector(unsigned char seg, bool random=false)
int pp_prompt[2]
particle-particle prompt
double events_gamma_seg_ediff
std::string degrader_material
can be an isotope name, or some string that matches the material used and corresponding SRIM file
ClassDef(MiniballReaction, 3) private std::shared_ptr< MiniballSettings > set
int gg_random[2]
gamma-gamma random
double EBIS_Off
beam off max time in ns
std::string transfercutfile
void SetFile(std::string filename)
double GetParticleGammaTimeRatio()
std::shared_ptr< TCutG > ejectile_cut
double DopplerCorrection(double gen, double gth, double gph, double pbeta, double ptheta, double pphi)
unsigned int events_gamma_max_seg_mult
double z_offset
lateral offset of the target/beam position, with respect to the only Miniball in mm (cd_dist is indep...
void PrintReaction(std::ostream &stream, std::string opt)
int gg_prompt[2]
gamma-gamma prompt
double Eb
laboratory beam energy in keV/u
bool events_gamma_seg_energy
std::string ejectilecutname
double GetMiniballTheta(unsigned char clu)
void AddBindingEnergy(short Ai, short Zi, TString ame_be_str)
unsigned int particle_bins
int ge_prompt[2]
gamma-electron prompt
MiniballReaction(std::string filename, std::shared_ptr< MiniballSettings > myset)
std::vector< double > mb_phi
std::string transfercut_x
std::string recoilcutname
std::vector< MiniballGeometry > mb_geo
double GetParticleTheta(unsigned char det, unsigned char sec, unsigned char pid, unsigned char nid)
double EBIS_ratio
ratio of ebis on/off as measured
double ee_ratio
fill ratios
double t1_time[2]
event time - T1 cut window
double target_thickness
target thickness in units of mg/cm^2
std::shared_ptr< TCutG > transfer_cut
std::string transfercut_y
bool events_particle_gamma
int pe_random[2]
particle-electron random
TVector3 GetParticleVector(unsigned char det, unsigned char sec, unsigned char pid, unsigned char nid)
double GetGammaElectronTimeRatio()
double degrader_thickness
target thickness in units of mg/cm^2. Negative if degrader not present. SHM, RAB 12 June 2025
std::vector< double > cd_offset
phi rotation of the CD in degrees
double CosTheta(std::shared_ptr< GammaRayEvt > g, bool ejectile)
unsigned int electron_bins
bool ReadStoppingPowers(std::string isotope1, std::string isotope2, std::unique_ptr< TGraph > &g)
double GetMiniballR(unsigned char clu)
double GetMiniballPhi(unsigned char clu)
int pg_prompt[2]
particle-gamma prompt
void TransferProduct(std::shared_ptr< ParticleEvt > p, bool kinflag=false)
double GetGammaGammaTimeRatio()
int ee_random[2]
electron-electron random
double pp_ratio
fill ratios
int ge_random[2]
gamma-electron random
double spede_dist
distance from target to SPEDE detector
bool events_particle_cdpad_coinc
void IdentifyEjectile(std::shared_ptr< ParticleEvt > p, bool kinflag=false)
double GetElectronElectronTimeRatio()
double GetParticlePhi(unsigned char det, unsigned char sec, unsigned char pid, unsigned char nid)
unsigned char doppler_mode
std::shared_ptr< TCutG > ReadCutFile(std::string cut_filename, std::string cut_name)
bool events_gamma_demand_seg
double GetEnergyLoss(double Ei, double dist, std::unique_ptr< TGraph > &g)
double GetParticleParticleTimeRatio()
std::vector< double > dead_layer
dead layer thickness in mm
std::map< std::string, double > ame_be
List of biniding energies from AME2021.
std::string recoilcutfile
int pp_random[2]
particle-particle random
bool t1_cut
enable/disable T1 cuts on data
int ee_prompt[2]
electron-electron prompt
int pg_random[2]
particle-gamma random
double DopplerShift(double gen, double pbeta, double costheta)
bool events_particle_cdpad_veto
std::shared_ptr< MiniballSettings > myset