diff --git a/NPSimulation/Detectors/TACTIC/GARFDRIFT.h b/NPSimulation/Detectors/TACTIC/GARFDRIFT.h index bd1fef1e526dd6b007d00ef469b5beed4b765e73..473193228f73ae63d6dfaa0779ae113187f510d0 100644 --- a/NPSimulation/Detectors/TACTIC/GARFDRIFT.h +++ b/NPSimulation/Detectors/TACTIC/GARFDRIFT.h @@ -4,12 +4,13 @@ #include "Garfield/MediumMagboltz.hh" #include "Garfield/TrackHeed.hh" #include "Garfield/SolidTube.hh" +#include "Garfield/SolidBox.hh" #include "Garfield/AvalancheMC.hh" #include "Garfield/ViewSignal.hh" #include "Garfield/ViewMedium.hh" double GARFDRIFT(double energy, double t_start, G4ThreeVector start, G4ThreeVector delta_pos, double R, int Pad_start, double ID, - double ScoLength, double SegLength, double event, double raw_energy_check) { + double ScoLength, double SegLength, double event, double raw_energy_check, string shape) { ofstream file; /* @@ -17,7 +18,9 @@ double GARFDRIFT(double energy, double t_start, G4ThreeVector start, G4ThreeVect file << raw_energy_check << "\t" << R << endl; file.close(); */ - const double rWire = 1.2; + double rWire; + if(shape == "Cylindrical") rWire = 1.2; + if(shape == "Long_Chamber") rWire = -2.5; const double rTube = 5.; const double lTube = 25.19; //TH1F *hist = new TH1F("","",1000,0,10000); // 10 ns bins @@ -30,6 +33,7 @@ double GARFDRIFT(double energy, double t_start, G4ThreeVector start, G4ThreeVect //const double vWire = -730.; const double vWire = -1000.; //const double vWire = -584.7139; // ND run 4230 (2008) + //const double vWire = -603.6855; // ND run 4279 (2008), HV = 1241, R1 = 1, R2 = 2 const double vTube = 0.; double x_start, y_start, z_start; //double production_bias = 0.01; @@ -50,7 +54,8 @@ double GARFDRIFT(double energy, double t_start, G4ThreeVector start, G4ThreeVect Garfield::MediumMagboltz* gas = new Garfield::MediumMagboltz(); Garfield::ViewMedium* mediumView = new Garfield::ViewMedium(); Garfield::GeometrySimple* geo = new Garfield::GeometrySimple(); - Garfield::SolidTube* tube = new Garfield::SolidTube(0, 0, 0, 0, rTube, lTube/2); + Garfield::SolidTube* tube = new Garfield::SolidTube(0, 0, 0, 0, rTube, lTube/2); + Garfield::SolidBox* box = new Garfield::SolidBox(0, 0, 0, 3.47, 5.0, lTube/2); Garfield::ComponentAnalyticField* cmp = new Garfield::ComponentAnalyticField(); Garfield::Sensor* sensor = new Garfield::Sensor(); Garfield::AvalancheMC* drift = new Garfield::AvalancheMC(); @@ -69,19 +74,26 @@ double GARFDRIFT(double energy, double t_start, G4ThreeVector start, G4ThreeVect //gas->LoadGasFile("he_90_co2_10_200mbar.gas"); //gas->LoadGasFile("ar_90_ch4_10.gas"); //atomic fraction in this case (P10). - //gas->LoadGasFile("he_90_co2_10_500mbar.gas"); //mass fraction in this case + //gas->LoadGasFile("he_90_co2_10_500mbar.gas"); //mass fraction in this case //gas->LoadGasFile("he_90_co2_10_1bar.gas"); gas->LoadGasFile("he_90_co2_10_100mbar.gas"); - //gas->LoadGasFile("he_90_co2_10_600mbar.gas"); + //gas->LoadGasFile("he_90_co2_10_700mbar.gas"); gas->Initialise(true); mediumView->SetMedium(gas); - geo->AddSolid(tube, gas); + if(shape == "Cylindrical") geo->AddSolid(tube, gas); + if(shape == "Long_Chamber") geo->AddSolid(box, gas); cmp->SetGeometry(geo); - cmp->AddWire(0, 0, 2*rWire, vWire, "c"); - cmp->AddTube(rTube, vTube, 0, "a"); + if(shape == "Cylindrical") { + cmp->AddWire(0, 0, 2*rWire, vWire, "c"); + cmp->AddTube(rTube, vTube, 0, "a"); + } + if(shape == "Long_Chamber") { + cmp->AddPlaneY(-2.5,-500.,"c"); //CHANGE CATHODE AND ANODE VOLTAGE HERE (FOR LONG CHAMBER) + cmp->AddPlaneY(2.5,0.,"a"); + } sensor->AddComponent(cmp); drift->SetSensor(sensor); @@ -95,8 +107,8 @@ double GARFDRIFT(double energy, double t_start, G4ThreeVector start, G4ThreeVect y_start = start.y() + delta_pos.y()*randomize; z_start = start.z() + delta_pos.z()*randomize; /* - file.open("garf_electrons_start_RZ.dat", std::ios::app); - file << pow(pow(x_start,2)+pow(y_start,2),0.5) << "\t" << z_start << endl; + file.open("coord_check.dat", std::ios::app); + file << start.x() << "\t" << start.y() << "\t" << start.z() << x_start endl; file.close(); */ drift->DriftElectron(x_start, y_start, z_start, t_start); @@ -108,28 +120,34 @@ double GARFDRIFT(double energy, double t_start, G4ThreeVector start, G4ThreeVect //drift->GetElectronEndPoint(np-1, x_end, y_end, z_end, t_end); Pad_end = (int)((z_end + ScoLength / 2.) / SegLength ) + 1; //new Pad number + + if(shape=="Cylindrical") { - if(x_end > 0 and y_end > 0) { - if(abs(x_end) > abs(y_end)) sector = 0; - if(abs(x_end) < abs(y_end)) sector = 1; - } - if(x_end < 0 and y_end > 0) { - if(abs(x_end) < abs(y_end)) sector = 2; - if(abs(x_end) > abs(y_end)) sector = 3; - } - if(x_end < 0 and y_end < 0) { - if(abs(x_end) > abs(y_end)) sector = 4; - if(abs(x_end) < abs(y_end)) sector = 5; - } - if(x_end > 0 and y_end < 0) { - if(abs(x_end) < abs(y_end)) sector = 6; - if(abs(x_end) > abs(y_end)) sector = 7; + if(x_end > 0 and y_end > 0) { + if(abs(x_end) > abs(y_end)) sector = 0; + if(abs(x_end) < abs(y_end)) sector = 1; + } + if(x_end < 0 and y_end > 0) { + if(abs(x_end) < abs(y_end)) sector = 2; + if(abs(x_end) > abs(y_end)) sector = 3; + } + if(x_end < 0 and y_end < 0) { + if(abs(x_end) > abs(y_end)) sector = 4; + if(abs(x_end) < abs(y_end)) sector = 5; + } + if(x_end > 0 and y_end < 0) { + if(abs(x_end) < abs(y_end)) sector = 6; + if(abs(x_end) > abs(y_end)) sector = 7; + } + } - + + if(shape=="Long_Chamber") sector = 0; //if(pow(pow(x_end,2)+pow(y_end,2),0.5)>4.9) { //reached the anode file.open("signal.dat", std::ios::app); - file << event << "\t" << ID << "\t" << sector << "\t" << Pad_end << "\t" << t_end << "\t" << pow(pow(x_start,2)+pow(y_start,2),0.5) << "\t" << pow(pow(x_end,2)+pow(y_end,2),0.5) << endl; + if(shape == "Cylindrical") file << event << "\t" << ID << "\t" << sector << "\t" << Pad_end << "\t" << t_end << "\t" << pow(pow(x_start,2)+pow(y_start,2),0.5) << "\t" << pow(pow(x_end,2)+pow(y_end,2),0.5) << endl; + if(shape == "Long_Chamber") file << event << "\t" << ID << "\t" << sector << "\t" << Pad_end << "\t" << z_end << "\t" << t_end << "\t" << y_start << "\t" << y_end << endl; //file << event << "\t" << ID << "\t" << sector << "\t" << Pad_end << "\t" << t_end file.close(); //} diff --git a/NPSimulation/Detectors/TACTIC/TACTIC.cc b/NPSimulation/Detectors/TACTIC/TACTIC.cc index c39020979b1289069259dce11d35075df081f881..07c2b4d099531f0c102be619b379b1640e65b84e 100644 --- a/NPSimulation/Detectors/TACTIC/TACTIC.cc +++ b/NPSimulation/Detectors/TACTIC/TACTIC.cc @@ -65,24 +65,16 @@ using namespace CLHEP; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... namespace TACTIC_NS{ - // Energy and time Resolution - - //const double EnergyThreshold = 0.01*MeV; - //const double ResoTime = 17.*ns ; - //const double ResoEnergy = 1.0*MeV ; - // const double cathode_radius = 12.*mm; const double drift_radius = 50.*mm; - const double anode_radius = 51.*mm; const double active_length = 251.9*mm; const double window_pos = 104.*mm; //from centre of TACTIC from https://elog.triumf.ca/Tactic/Documentation/18 const double window_radius = 12.*mm; //guess const double window_width = 1.5e-03*mm; - //const double vacuum_pos = (active_length/2. + window_pos + window_width/2.)/2.*mm; - //const double vacuum_width = active_length/2. - window_pos - window_width/2.*mm; - const G4int NumberOfStrips = 60; + const int NumberOfStrips = 60; } + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // TACTIC Specific Method TACTIC::TACTIC(){ @@ -125,9 +117,9 @@ void TACTIC::AddDetector(double R, double Theta, double Phi, string Shape){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4LogicalVolume* TACTIC::BuildCylindricalDetector(){ - if(!m_CylindricalDetector){ - - G4Material* Cu = MaterialManager::getInstance()->GetMaterialFromLibrary("Cu"); + // if(!m_CylindricalDetector){ + + // G4Material* Cu = MaterialManager::getInstance()->GetMaterialFromLibrary("Cu"); G4Material* Mylar = MaterialManager::getInstance()->GetMaterialFromLibrary("Mylar"); G4Material* Vacuum = MaterialManager::getInstance()->GetMaterialFromLibrary("G4_Galactic"); @@ -165,37 +157,50 @@ G4LogicalVolume* TACTIC::BuildCylindricalDetector(){ cout << TACTIC_gas << endl; - G4Tubs* world_volume = new G4Tubs("world_volume",0,TACTIC_NS::drift_radius+1*mm,TACTIC_NS::active_length*0.5+1*mm,0,360*deg); - G4Tubs* window = new G4Tubs("window",0,TACTIC_NS::window_radius,TACTIC_NS::window_width*0.5,0,360*deg); - - //G4Tubs* anode = new G4Tubs("anode",TACTIC_NS::drift_radius,TACTIC_NS::anode_radius,TACTIC_NS::active_length*0.5,0,360*deg); - G4Tubs* gas_cathode = new G4Tubs("gas_cathode",0,TACTIC_NS::window_radius,TACTIC_NS::window_pos-TACTIC_NS::window_width*0.5,0,360*deg); //window pos doesn't need halving - G4Tubs* gas_drift = new G4Tubs("gas_drift",TACTIC_NS::window_radius,TACTIC_NS::drift_radius,TACTIC_NS::active_length*0.5,0,360*deg); - G4UnionSolid* gas_volume = new G4UnionSolid("gas_volume",gas_cathode,gas_drift); - //G4Tubs* gas_volume = new G4Tubs("gas_volume",0,TACTIC_NS::drift_radius,TACTIC_NS::active_length*0.5,0,360*deg); + if(m_Shape[0] == "Cylindrical") { + + G4Tubs* world_volume = new G4Tubs("world_volume",0,TACTIC_NS::drift_radius+1*mm,TACTIC_NS::active_length*0.5+1*mm,0,360*deg); + G4Tubs* window = new G4Tubs("window",0,TACTIC_NS::window_radius,TACTIC_NS::window_width*0.5,0,360*deg); + + //G4Tubs* anode = new G4Tubs("anode",TACTIC_NS::drift_radius,TACTIC_NS::anode_radius,TACTIC_NS::active_length*0.5,0,360*deg); + G4Tubs* gas_cathode = new G4Tubs("gas_cathode",0,TACTIC_NS::window_radius,TACTIC_NS::window_pos-TACTIC_NS::window_width*0.5,0,360*deg); //window pos doesn't need halving + G4Tubs* gas_drift = new G4Tubs("gas_drift",TACTIC_NS::window_radius,TACTIC_NS::drift_radius,TACTIC_NS::active_length*0.5,0,360*deg); + G4UnionSolid* gas_volume = new G4UnionSolid("gas_volume",gas_cathode,gas_drift); + + //G4Tubs* gas_volume = new G4Tubs("gas_volume",0,TACTIC_NS::drift_radius,TACTIC_NS::active_length*0.5,0,360*deg); + + m_CylindricalDetector = new G4LogicalVolume(world_volume, Vacuum, "m_CylindricalDetector_log",0,0,0); + //anode_log = new G4LogicalVolume(anode, Cu, "anode_log", 0,0,0); + gas_volume_log = new G4LogicalVolume(gas_volume, TACTIC_gas, "gas_volume_log",0,0,0); + window_log = new G4LogicalVolume(window, Mylar, "window_log",0,0,0); + + new G4PVPlacement(0,G4ThreeVector(0,0,0),gas_volume_log,"gas_volume_phys",m_CylindricalDetector,false,0); + //new G4PVPlacement(0,G4ThreeVector(0,0,0),anode_log,"anode_phys",m_CylindricalDetector,false,0,true); + new G4PVPlacement(0,G4ThreeVector(0,0,TACTIC_NS::window_pos),window_log,"window_phys1",m_CylindricalDetector,false,0,true); + new G4PVPlacement(0,G4ThreeVector(0,0,-TACTIC_NS::window_pos),window_log,"window_phys2",m_CylindricalDetector,false,0,true); - m_CylindricalDetector = new G4LogicalVolume(world_volume, Vacuum, "m_CylindricalDetector_log",0,0,0); - //anode_log = new G4LogicalVolume(anode, Cu, "anode_log", 0,0,0); - gas_volume_log = new G4LogicalVolume(gas_volume, TACTIC_gas, "gas_volume_log",0,0,0); - window_log = new G4LogicalVolume(window, Mylar, "window_log",0,0,0); + } - new G4PVPlacement(0,G4ThreeVector(0,0,0),gas_volume_log,"gas_volume_phys",m_CylindricalDetector,false,0); - //new G4PVPlacement(0,G4ThreeVector(0,0,0),anode_log,"anode_phys",m_CylindricalDetector,false,0,true); - new G4PVPlacement(0,G4ThreeVector(0,0,TACTIC_NS::window_pos),window_log,"window_phys1",m_CylindricalDetector,false,0,true); - new G4PVPlacement(0,G4ThreeVector(0,0,-TACTIC_NS::window_pos),window_log,"window_phys2",m_CylindricalDetector,false,0,true); - - gas_volume_log->SetVisAttributes(m_VisGas); + if(m_Shape[0] == "Long_Chamber") { + + G4Box* world_volume = new G4Box("world_volume",34.7,25.,TACTIC_NS::active_length/2.); //Pad width = 34.7 mm (2 rows of pads), LC drift = 50 mm + m_CylindricalDetector = new G4LogicalVolume(world_volume, Vacuum, "m_CylindricalDetector_log",0,0,0); + G4Box* gas_volume = new G4Box("gas_volume",34.7,25.,TACTIC_NS::active_length/2.); + gas_volume_log = new G4LogicalVolume(gas_volume, TACTIC_gas, "gas_volume_log",0,0,0); + new G4PVPlacement(0,G4ThreeVector(0,0,0),gas_volume_log,"gas_volume_phys",m_CylindricalDetector,false,0); + + } + m_CylindricalDetector->SetVisAttributes(m_VisGas); - //anode_log->SetVisAttributes(m_VisGas); - + gas_volume_log->SetVisAttributes(m_VisGas); + G4UserLimits *gas_volume_step = new G4UserLimits(); G4double maxStep = 0.1*mm; gas_volume_step->SetMaxAllowedStep(maxStep); gas_volume_log->SetUserLimits(gas_volume_step); gas_volume_log->SetSensitiveDetector(m_Scorer); - - } + return m_CylindricalDetector; } @@ -219,7 +224,7 @@ void TACTIC::ReadConfiguration(NPL::InputParser parser){ cout << endl << "//// TACTIC " << i+1 << endl; G4ThreeVector Pos = NPS::ConvertVector(blocks[i]->GetTVector3("POS","mm")); - string Shape = blocks[i]->GetString("Shape"); + Shape = blocks[i]->GetString("Shape"); m_GasMaterial.push_back(blocks[i]->GetString("GasMaterial_1")); m_GasMaterial.push_back(blocks[i]->GetString("GasMaterial_2")); m_GasFraction.push_back(blocks[i]->GetInt("GasFraction_1")); @@ -272,11 +277,12 @@ void TACTIC::ConstructDetector(G4LogicalVolume* world){ if(!m_ReactionRegion){ G4ProductionCuts* ecut = new G4ProductionCuts(); - ecut->SetProductionCut(1000,"e-"); //I think lowest is 900 eV for delta electron production, this is 1000 MeV to cut all electrons produced this way + ecut->SetProductionCut(1e06,"e-"); //I think lowest is 900 eV for delta electron production, this is 1e06 MeV to cut all electrons produced this way m_ReactionRegion= new G4Region("NPSimulationProcess"); m_ReactionRegion->SetProductionCuts(ecut); //m_ReactionRegion->AddRootLogicalVolume(gas_volume_log); //m_ReactionRegion->AddRootLogicalVolume(m_CylindricalDetector); + if(m_Active == "windows") m_ReactionRegion->AddRootLogicalVolume(window_log); if(m_Active == "gas") m_ReactionRegion->AddRootLogicalVolume(gas_volume_log); } @@ -333,7 +339,7 @@ void TACTIC::ReadSensitive(const G4Event* event ){ } file << Info[13] << endl; } - + LightHitMap->clear(); G4THitsMap<G4double*>* HeavyHitMap; @@ -349,7 +355,7 @@ void TACTIC::ReadSensitive(const G4Event* event ){ } file << Info[13] << endl; } - + HeavyHitMap->clear(); G4THitsMap<G4double*>* BeamHitMap; @@ -380,7 +386,7 @@ void TACTIC::InitializeScorers() { m_Scorer = CheckScorer("TACTICScorer",already_exist) ; if(already_exist) return ; - + // Otherwise the scorer is initialised NPL::InputParser input(NPOptionManager::getInstance()->GetReactionFile()); @@ -389,19 +395,19 @@ void TACTIC::InitializeScorers() { if(input.GetAllBlocksWithToken("TwoBodyReaction").size()>0) { // NEED SEPERATE SCORERS FOR EACH PARTICLE! OTHERWISE SCORER JUST RETURNS OUTPUT FOR ONE PARTICLE WHEN THERE IS OVERLAP - G4VPrimitiveScorer* LightScorer = new TACTICScorer::Gas_Scorer("LightScorer",1,TACTIC_NS::active_length,(int)TACTIC_NS::NumberOfStrips,0,m_p0,m_p1,m_p2,m_p3); - G4VPrimitiveScorer* HeavyScorer = new TACTICScorer::Gas_Scorer("HeavyScorer",1,TACTIC_NS::active_length,(int)TACTIC_NS::NumberOfStrips,0,m_p0,m_p1,m_p2,m_p3); - G4VPrimitiveScorer* BeamScorer = new TACTICScorer::Gas_Scorer("BeamScorer",1,TACTIC_NS::active_length,(int)TACTIC_NS::NumberOfStrips,0,m_p0,m_p1,m_p2,m_p3); + G4VPrimitiveScorer* LightScorer = new TACTICScorer::Gas_Scorer("LightScorer",1,TACTIC_NS::active_length,TACTIC_NS::NumberOfStrips,0,m_p0,m_p1,m_p2,m_p3,Shape); + G4VPrimitiveScorer* HeavyScorer = new TACTICScorer::Gas_Scorer("HeavyScorer",1,TACTIC_NS::active_length,TACTIC_NS::NumberOfStrips,0,m_p0,m_p1,m_p2,m_p3,Shape); + G4VPrimitiveScorer* BeamScorer = new TACTICScorer::Gas_Scorer("BeamScorer",1,TACTIC_NS::active_length,TACTIC_NS::NumberOfStrips,0,m_p0,m_p1,m_p2,m_p3,Shape); G4SDParticleFilter* LightFilter = new G4SDParticleFilter("LightFilter"); G4SDParticleFilter* HeavyFilter = new G4SDParticleFilter("HeavyFilter"); G4SDParticleFilter* BeamFilter = new G4SDParticleFilter("BeamFilter"); - /* - cout << m_Reaction.GetParticle1()->GetName() << "\t" << m_Reaction.GetParticle1()->GetA() << "\t" << m_Reaction.GetParticle1()->GetZ() << endl; - cout << m_Reaction.GetParticle2()->GetName() << "\t" << m_Reaction.GetParticle2()->GetA() << "\t" << m_Reaction.GetParticle2()->GetZ() << endl; - cout << m_Reaction.GetParticle3()->GetName() << "\t" << m_Reaction.GetParticle3()->GetA() << "\t" << m_Reaction.GetParticle3()->GetZ() << endl; - cout << m_Reaction.GetParticle4()->GetName() << "\t" << m_Reaction.GetParticle4()->GetA() << "\t" << m_Reaction.GetParticle4()->GetZ() << endl; - */ + + cout << m_Reaction.GetParticle1()->GetName() << "\t" << m_Reaction.GetParticle1()->GetA() << "\t" << m_Reaction.GetParticle1()->GetZ() << endl; + cout << m_Reaction.GetParticle2()->GetName() << "\t" << m_Reaction.GetParticle2()->GetA() << "\t" << m_Reaction.GetParticle2()->GetZ() << endl; + cout << m_Reaction.GetParticle3()->GetName() << "\t" << m_Reaction.GetParticle3()->GetA() << "\t" << m_Reaction.GetParticle3()->GetZ() << endl; + cout << m_Reaction.GetParticle4()->GetName() << "\t" << m_Reaction.GetParticle4()->GetA() << "\t" << m_Reaction.GetParticle4()->GetZ() << endl; + LightFilter->addIon(m_Reaction.GetParticle3()->GetZ(),m_Reaction.GetParticle3()->GetA()); HeavyFilter->addIon(m_Reaction.GetParticle4()->GetZ(),m_Reaction.GetParticle4()->GetA()); if(m_Reaction.GetParticle1()->GetZ() == m_Reaction.GetParticle4()->GetZ()) BeamFilter->add("geantino"); @@ -419,9 +425,9 @@ void TACTIC::InitializeScorers() { if(input.GetAllBlocksWithToken("Isotropic").size()>0) { //For alpha, proton or neutron source (obviously neutron wont do anything so this is spare). - G4VPrimitiveScorer* LightScorer = new TACTICScorer::Gas_Scorer("LightScorer",1,TACTIC_NS::active_length,(int)TACTIC_NS::NumberOfStrips,0,m_p0,m_p1,m_p2,m_p3); - G4VPrimitiveScorer* HeavyScorer = new TACTICScorer::Gas_Scorer("HeavyScorer",1,TACTIC_NS::active_length,(int)TACTIC_NS::NumberOfStrips,0,m_p0,m_p1,m_p2,m_p3); - G4VPrimitiveScorer* BeamScorer = new TACTICScorer::Gas_Scorer("BeamScorer",1,TACTIC_NS::active_length,(int)TACTIC_NS::NumberOfStrips,0,m_p0,m_p1,m_p2,m_p3); + G4VPrimitiveScorer* LightScorer = new TACTICScorer::Gas_Scorer("LightScorer",1,TACTIC_NS::active_length,TACTIC_NS::NumberOfStrips,0,m_p0,m_p1,m_p2,m_p3,Shape); + G4VPrimitiveScorer* HeavyScorer = new TACTICScorer::Gas_Scorer("HeavyScorer",1,TACTIC_NS::active_length,TACTIC_NS::NumberOfStrips,0,m_p0,m_p1,m_p2,m_p3,Shape); + G4VPrimitiveScorer* BeamScorer = new TACTICScorer::Gas_Scorer("BeamScorer",1,TACTIC_NS::active_length,TACTIC_NS::NumberOfStrips,0,m_p0,m_p1,m_p2,m_p3,Shape); G4SDParticleFilter* LightFilter = new G4SDParticleFilter("LightFilter","alpha"); G4SDParticleFilter* HeavyFilter = new G4SDParticleFilter("HeavyFilter","proton"); G4SDParticleFilter* BeamFilter = new G4SDParticleFilter("BeamFilter","neutron"); diff --git a/NPSimulation/Detectors/TACTIC/TACTIC.detector b/NPSimulation/Detectors/TACTIC/TACTIC.detector index 74d1c6d134825e1a978f14cdfb19733256ff6dc2..07f6d53e3cba8f2a6644446991300672c1f9819b 100644 --- a/NPSimulation/Detectors/TACTIC/TACTIC.detector +++ b/NPSimulation/Detectors/TACTIC/TACTIC.detector @@ -2,15 +2,16 @@ TACTIC POS= 0 0 0 mm Shape= Cylindrical +% Shape = Long_Chamber % GasMaterial_1 = P10_gas GasMaterial_1 = He_gas GasMaterial_2 = G4_CARBON_DIOXIDE GasFraction_1 = 90 GasFraction_2 = 10 Temperature = 293.15 kelvin +% Pressure = 2.0 bar Pressure = 0.1 bar -% Pressure = 1.0 bar - Active = gas + Active = gas p0 = 0 p1 = 0 p2 = 0 diff --git a/NPSimulation/Detectors/TACTIC/TACTIC.hh b/NPSimulation/Detectors/TACTIC/TACTIC.hh index fa59503a54863e10a39c89ede683aaf9a226fab7..6516304cd3e85414a02d0e8174c0ecd1ddc045aa 100644 --- a/NPSimulation/Detectors/TACTIC/TACTIC.hh +++ b/NPSimulation/Detectors/TACTIC/TACTIC.hh @@ -42,6 +42,8 @@ using namespace std; #include "Decay.hh" #include "BeamReaction.hh" +extern double excess; + class TACTIC : public NPS::VDetector{ //////////////////////////////////////////////////// /////// Default Constructor and Destructor ///////// @@ -65,7 +67,8 @@ private: G4LogicalVolume* m_CylindricalDetector; G4LogicalVolume* gas_volume_log; G4LogicalVolume* window_log; - G4LogicalVolume* vacuum_log; + //G4LogicalVolume* window_log_2; + //G4LogicalVolume* vacuum_log; //////////////////////////////////////////////////// ////// Inherite from NPS::VDetector class ///////// //////////////////////////////////////////////////// @@ -116,13 +119,16 @@ private: // Geometry vector<string> m_Shape ; string m_Active; double m_p0, m_p1, m_p2, m_p3; + string Shape; + + //int NumberOfStrips; // Visualisation Attribute G4VisAttributes* m_VisChamber; G4VisAttributes* m_VisWindows; G4VisAttributes* m_VisGas; G4VisAttributes* m_VisVacuum; - + private: // Region were reaction can occure: G4Region* m_ReactionRegion; @@ -131,6 +137,7 @@ private: // Needed for dynamic loading of the library public: static NPS::VDetector* Construct(); + }; #endif diff --git a/NPSimulation/Detectors/TACTIC/TACTICScorer.cc b/NPSimulation/Detectors/TACTIC/TACTICScorer.cc index f2cf165b9c5b801f923c6a6a6cbf1dfb5a771d4a..1c7a589c8126e62730281c38109b23d0aef55333 100644 --- a/NPSimulation/Detectors/TACTIC/TACTICScorer.cc +++ b/NPSimulation/Detectors/TACTIC/TACTICScorer.cc @@ -13,7 +13,7 @@ double excess; using namespace TACTICScorer; -Gas_Scorer::Gas_Scorer(G4String name,G4int Level,G4double ScorerLength,G4int NumberOfSegments, G4int depth, G4double p0, G4double p1, G4double p2, G4double p3) //what do level and depth do? +Gas_Scorer::Gas_Scorer(G4String name,G4int Level,G4double ScorerLength,G4int NumberOfSegments, G4int depth, G4double p0, G4double p1, G4double p2, G4double p3,string Shape) //what do level and depth do? :G4VPrimitiveScorer(name, depth),HCID(-1){ m_ScorerLength = ScorerLength; m_NumberOfSegments = NumberOfSegments; @@ -26,6 +26,7 @@ Gas_Scorer::Gas_Scorer(G4String name,G4int Level,G4double ScorerLength,G4int Num m_p1 = p1; m_p2 = p2; m_p3 = p3; + m_Shape = Shape; } Gas_Scorer::~Gas_Scorer(){} @@ -35,7 +36,7 @@ G4bool Gas_Scorer::ProcessHits(G4Step* aStep, G4TouchableHistory*){ G4double* Infos = new G4double[15]; //bool first_step = true; m_Position = aStep->GetPreStepPoint()->GetPosition(); - + Infos[0] = G4RunManager::GetRunManager()->GetCurrentEvent()->GetEventID(); Infos[1] = aStep->GetTrack()->GetTrackID(); @@ -50,7 +51,8 @@ G4bool Gas_Scorer::ProcessHits(G4Step* aStep, G4TouchableHistory*){ Infos[6] = m_SegmentNumber; //prepad = Infos[6]; Infos[7] = m_Position.z(); - Infos[8] = pow(pow(m_Position.x(),2) + pow(m_Position.y(),2),0.5); //R + if(m_Shape == "Cylindrical") Infos[8] = pow(pow(m_Position.x(),2) + pow(m_Position.y(),2),0.5); //R + if(m_Shape == "Long_Chamber") Infos[8] = m_Position.y(); Infos[9] = aStep->GetTrack()->GetVertexPosition()[2]; Infos[10] = aStep->GetTrack()->GetVertexKineticEnergy(); G4ThreeVector p_vec = aStep->GetTrack()->GetVertexMomentumDirection(); @@ -82,7 +84,7 @@ G4bool Gas_Scorer::ProcessHits(G4Step* aStep, G4TouchableHistory*){ #ifdef USE_Garfield - Infos[14] = GARFDRIFT(((aStep->GetTotalEnergyDeposit() - aStep->GetNonIonizingEnergyDeposit())/eV+excess), Infos[3], m_Position/cm, delta_Position/cm, Infos[8]/cm, Infos[6], Infos[2], m_ScorerLength/cm, m_SegmentLength/cm, Infos[0], (aStep->GetTotalEnergyDeposit() - aStep->GetNonIonizingEnergyDeposit())/eV)*eV; + Infos[14] = GARFDRIFT(((aStep->GetTotalEnergyDeposit() - aStep->GetNonIonizingEnergyDeposit())/eV+excess), Infos[3], m_Position/cm, delta_Position/cm, Infos[8]/cm, Infos[6], Infos[2], m_ScorerLength/cm, m_SegmentLength/cm, Infos[0], (aStep->GetTotalEnergyDeposit() - aStep->GetNonIonizingEnergyDeposit())/eV, m_Shape)*eV; /* file.open("excess_test.dat",std::ios::app); file << Infos[6] << "\t" << "\t" << aStep->IsFirstStepInVolume() << "\t" << excess << "\t" << Infos[14]/eV << "\t" << (int)((((aStep->GetTotalEnergyDeposit() - aStep->GetNonIonizingEnergyDeposit())/eV+excess) / 41.1)*0.01) << "\t" << Infos[8] << endl; diff --git a/NPSimulation/Detectors/TACTIC/TACTICScorer.hh b/NPSimulation/Detectors/TACTIC/TACTICScorer.hh index b05e0f7313d6a51773e64f4c00221f248ccf5306..dd25a95dd1d2ca4f79591e28c72ae243c1aa423d 100644 --- a/NPSimulation/Detectors/TACTIC/TACTICScorer.hh +++ b/NPSimulation/Detectors/TACTIC/TACTICScorer.hh @@ -21,7 +21,8 @@ namespace TACTICScorer { G4double p0 = 0, G4double p1 = 0, G4double p2 = 0, - G4double p3 = 0 + G4double p3 = 0, + string Shape = "default" ); ~Gas_Scorer(); @@ -47,6 +48,7 @@ namespace TACTICScorer { G4double m_p1; G4double m_p2; G4double m_p3; + string m_Shape; ofstream file; // G4double excess;