diff --git a/Benchmarks/cats/benchmark_cats.detector b/Benchmarks/cats/benchmark_cats.detector index ddbb227666fdf3be5a22c77f00dc52de00d373f2..a8829dbfec379075a090b5cde4eed119196fb379 100644 --- a/Benchmarks/cats/benchmark_cats.detector +++ b/Benchmarks/cats/benchmark_cats.detector @@ -1,6 +1,4 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -CATSArray -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CATSDetector X1_Y1= 38.86 -34.36 -1193 X28_Y1= -32.26 -34.36 -1193 diff --git a/Examples/Example1/Analysis.cxx b/Examples/Example1/Analysis.cxx index 675789eb3057687d13841b84b96a5c92c30c91d1..41c67c0bbbb02d3bdb2b8d2316cd99844718653c 100644 --- a/Examples/Example1/Analysis.cxx +++ b/Examples/Example1/Analysis.cxx @@ -36,7 +36,7 @@ Analysis::~Analysis(){ //////////////////////////////////////////////////////////////////////////////// void Analysis::Init(){ - M2= (TMust2Physics*) m_DetectorManager->GetDetector("MUST2Array"); + M2= (TMust2Physics*) m_DetectorManager->GetDetector("M2Telescope"); SSSD= (TSSSDPhysics*) m_DetectorManager->GetDetector("SSSD"); Initial=new TInitialConditions(); InitOutputBranch(); diff --git a/Examples/Example2/Analysis.cxx b/Examples/Example2/Analysis.cxx index da4653f2b100d8ab315b57b371e62d1e88e1836c..8114e780fccb762c1259d4635dcdd16e40285c0e 100644 --- a/Examples/Example2/Analysis.cxx +++ b/Examples/Example2/Analysis.cxx @@ -43,7 +43,7 @@ void Analysis::Init(){ BeamCD2 = EnergyLoss("Example/Mg28_CD2.G4table","G4Table",10); myReaction = new NPL::Reaction(); myReaction->ReadConfigurationFile(NPOptionManager::getInstance()->GetReactionFile()); - TargetThickness = m_DetectorManager->GetTargetThickness()*micrometer; + TargetThickness = m_DetectorManager->GetTargetThickness(); OriginalBeamEnergy = myReaction->GetBeamEnergy(); Rand = TRandom3(); DetectorNumber = 0 ; @@ -86,7 +86,6 @@ void Analysis::TreatEvent(){ if(XTarget>-1000 && YTarget>-1000){ TVector3 HitDirection = Sharc -> GetPositionOfInteraction(0,true); ThetaLab = HitDirection.Angle( BeamDirection ); - ThetaSharcSurface = HitDirection.Angle( TVector3(0,0,1) ) ; ThetaNormalTarget = HitDirection.Angle( TVector3(0,0,1) ) ; } @@ -101,7 +100,6 @@ void Analysis::TreatEvent(){ /************************************************/ // Part 2 : Impact Energy - Energy = 0; if(Sharc->PAD_E[0]>0){ Energy = Sharc->PAD_E[0]; @@ -109,9 +107,8 @@ void Analysis::TreatEvent(){ Energy += Sharc->Strip_E[0]; // Target Correction - ELab = LightCD2.EvaluateInitialEnergy( Energy ,TargetThickness*0.5, ThetaNormalTarget); - /************************************************/ + /************************************************/ /************************************************/ // Part 3 : Excitation Energy Calculation @@ -125,7 +122,6 @@ void Analysis::TreatEvent(){ ThetaLab=ThetaLab/deg; /************************************************/ }//end loop Sharc - } //////////////////////////////////////////////////////////////////////////////// diff --git a/Examples/Example2/Reaction/28Mgdp_1.reaction b/Examples/Example2/Reaction/28Mgdp_1.reaction index d9e0b8827a38c5806c59b28aae0f7099643acb0e..e92d87e72d51774d777aaf1e99fb6c33007136a5 100644 --- a/Examples/Example2/Reaction/28Mgdp_1.reaction +++ b/Examples/Example2/Reaction/28Mgdp_1.reaction @@ -2,39 +2,31 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Beam Particle= 28Mg - ExcitationEnergy= 0 - Energy= 224 - SigmaEnergy= 0.448 - SigmaThetaX= 0.01 - SigmaPhiY= 0.01 - SigmaX= 0.5 - SigmaY= 0.5 - MeanThetaX= 0 - MeanPhiY= 0 - MeanX= 0 - MeanY= 0 + ExcitationEnergy= 0 MeV + Energy= 224 MeV + SigmaEnergy= 0.448 MeV + SigmaThetaX= 0.01 deg + SigmaPhiY= 0.01 deg + SigmaX= 0.5 mm + SigmaY= 0.5 mm + MeanThetaX= 0 deg + MeanPhiY= 0 deg + MeanX= 0 mm + MeanY= 0 mm %EnergyProfilePath= %XThetaXProfilePath= %YPhiYProfilePath= %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 28Mg - Target= 2H - Light= 1H - Heavy= 29Mg - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 0.0 - CrossSectionPath= flat.txt CSR - ShootLight= 1 - ShootHeavy= 1 + Beam= 28Mg + Target= 2H + Light= 1H + Heavy= 29Mg + ExcitationEnergyLight= 0.0 MeV + ExcitationEnergyHeavy= 0.0 MeV + CrossSectionPath= flat.txt CSR1 + ShootLight= 1 + ShootHeavy= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%GammaDecay 25Na - Cascade - BranchingRatio= 70 - Energies= 2.2 - DifferentialCrossSection= 11Li(d,3He)10He.txt Gamma25Na - Cascade - BranchingRatio= 30 - Energies= 1.0 1.2 diff --git a/Examples/Example2/Reaction/28Mgdp_2.reaction b/Examples/Example2/Reaction/28Mgdp_2.reaction index 730bda4a694336747824cfab973ea9619929969b..ed0eeadbe1ef34d4d401bf499693f865351bd2e2 100644 --- a/Examples/Example2/Reaction/28Mgdp_2.reaction +++ b/Examples/Example2/Reaction/28Mgdp_2.reaction @@ -2,39 +2,30 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Beam Particle= 28Mg - ExcitationEnergy= 0 - Energy= 224 - SigmaEnergy= 0.448 - SigmaThetaX= 0.01 - SigmaPhiY= 0.01 - SigmaX= 0.5 - SigmaY= 0.5 - MeanThetaX= 0 - MeanPhiY= 0 - MeanX= 0 - MeanY= 0 + ExcitationEnergy= 0 MeV + Energy= 224 MeV + SigmaEnergy= 0.448 MeV + SigmaThetaX= 0.01 deg + SigmaPhiY= 0.01 deg + SigmaX= 0.5 mm + SigmaY= 0.5 mm + MeanThetaX= 0 deg + MeanPhiY= 0 deg + MeanX= 0 mm + MeanY= 0 mm %EnergyProfilePath= %XThetaXProfilePath= %YPhiYProfilePath= %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 28Mg - Target= 2H - Light= 1H - Heavy= 29Mg - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 1.1 - CrossSectionPath= flat.txt CSR - ShootLight= 1 - ShootHeavy= 1 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%GammaDecay 25Na - Cascade - BranchingRatio= 70 - Energies= 2.2 - DifferentialCrossSection= 11Li(d,3He)10He.txt Gamma25Na - Cascade - BranchingRatio= 30 - Energies= 1.0 1.2 + Beam= 28Mg + Target= 2H + Light= 1H + Heavy= 29Mg + ExcitationEnergyLight= 0.0 MeV + ExcitationEnergyHeavy= 1.1 MeV + CrossSectionPath= flat.txt CSR2 + ShootLight= 1 + ShootHeavy= 1 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Examples/Example2/Reaction/28Mgdp_3.reaction b/Examples/Example2/Reaction/28Mgdp_3.reaction index d1a0c43122c06d8bfd5cde4f7e949241f0201ce4..fbca09181926bff31b074f0539eda4dfc3887cff 100644 --- a/Examples/Example2/Reaction/28Mgdp_3.reaction +++ b/Examples/Example2/Reaction/28Mgdp_3.reaction @@ -2,39 +2,31 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Beam Particle= 28Mg - ExcitationEnergy= 0 - Energy= 224 - SigmaEnergy= 0.448 - SigmaThetaX= 0.01 - SigmaPhiY= 0.01 - SigmaX= 0.5 - SigmaY= 0.5 - MeanThetaX= 0 - MeanPhiY= 0 - MeanX= 0 - MeanY= 0 + ExcitationEnergy= 0 MeV + Energy= 224 MeV + SigmaEnergy= 0.448 MeV + SigmaThetaX= 0.01 deg + SigmaPhiY= 0.01 deg + SigmaX= 0.5 mm + SigmaY= 0.5 mm + MeanThetaX= 0 deg + MeanPhiY= 0 deg + MeanX= 0 mm + MeanY= 0 mm %EnergyProfilePath= %XThetaXProfilePath= %YPhiYProfilePath= %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 28Mg - Target= 2H - Light= 1H - Heavy= 29Mg - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 1.4 - CrossSectionPath= flat.txt CSR - ShootLight= 1 - ShootHeavy= 1 + Beam= 28Mg + Target= 2H + Light= 1H + Heavy= 29Mg + ExcitationEnergyLight= 0.0 MeV + ExcitationEnergyHeavy= 1.4 MeV + CrossSectionPath= flat.txt CSR3 + ShootLight= 1 + ShootHeavy= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%GammaDecay 25Na - Cascade - BranchingRatio= 70 - Energies= 2.2 - DifferentialCrossSection= 11Li(d,3He)10He.txt Gamma25Na - Cascade - BranchingRatio= 30 - Energies= 1.0 1.2 diff --git a/Examples/Example2/Reaction/28Mgdp_4.reaction b/Examples/Example2/Reaction/28Mgdp_4.reaction index 6bba2761f731d022ca85d34850e0594bfdc03352..753f7e410ec7f3040b84b4a24b42549c036f8145 100644 --- a/Examples/Example2/Reaction/28Mgdp_4.reaction +++ b/Examples/Example2/Reaction/28Mgdp_4.reaction @@ -2,39 +2,31 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Beam Particle= 28Mg - ExcitationEnergy= 0 - Energy= 224 - SigmaEnergy= 0.448 - SigmaThetaX= 0.01 - SigmaPhiY= 0.01 - SigmaX= 0.5 - SigmaY= 0.5 - MeanThetaX= 0 - MeanPhiY= 0 - MeanX= 0 - MeanY= 0 + ExcitationEnergy= 0 MeV + Energy= 224 MeV + SigmaEnergy= 0.448 MeV + SigmaThetaX= 0.01 deg + SigmaPhiY= 0.01 deg + SigmaX= 0.5 mm + SigmaY= 0.5 mm + MeanThetaX= 0 deg + MeanPhiY= 0 deg + MeanX= 0 mm + MeanY= 0 mm %EnergyProfilePath= %XThetaXProfilePath= %YPhiYProfilePath= %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 28Mg - Target= 2H - Light= 1H - Heavy= 29Mg - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 2.3 - CrossSectionPath= flat.txt CSR - ShootLight= 1 - ShootHeavy= 1 + Beam= 28Mg + Target= 2H + Light= 1H + Heavy= 29Mg + ExcitationEnergyLight= 0.0 MeV + ExcitationEnergyHeavy= 2.3 MeV + CrossSectionPath= flat.txt CSR4 + ShootLight= 1 + ShootHeavy= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%GammaDecay 25Na - Cascade - BranchingRatio= 70 - Energies= 2.2 - DifferentialCrossSection= 11Li(d,3He)10He.txt Gamma25Na - Cascade - BranchingRatio= 30 - Energies= 1.0 1.2 diff --git a/Examples/Example2/Reaction/28Mgdp_5.reaction b/Examples/Example2/Reaction/28Mgdp_5.reaction index 22f27984f3b56e7eb8083a27b137548f6f9dcb6a..ae7a35471d4f2b0a17ef5969819021ce2f4e25f7 100644 --- a/Examples/Example2/Reaction/28Mgdp_5.reaction +++ b/Examples/Example2/Reaction/28Mgdp_5.reaction @@ -2,39 +2,30 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Beam Particle= 28Mg - ExcitationEnergy= 0 - Energy= 224 - SigmaEnergy= 0.448 - SigmaThetaX= 0.01 - SigmaPhiY= 0.01 - SigmaX= 0.5 - SigmaY= 0.5 - MeanThetaX= 0 - MeanPhiY= 0 - MeanX= 0 - MeanY= 0 + ExcitationEnergy= 0 MeV + Energy= 224 MeV + SigmaEnergy= 0.448 MeV + SigmaThetaX= 0.01 deg + SigmaPhiY= 0.01 deg + SigmaX= 0.5 mm + SigmaY= 0.5 mm + MeanThetaX= 0 deg + MeanPhiY= 0 deg + MeanX= 0 mm + MeanY= 0 mm %EnergyProfilePath= %XThetaXProfilePath= %YPhiYProfilePath= %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 28Mg - Target= 2H - Light= 1H - Heavy= 29Mg - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 4.4 - CrossSectionPath= flat.txt CSR - ShootLight= 1 - ShootHeavy= 1 - + Beam= 28Mg + Target= 2H + Light= 1H + Heavy= 29Mg + ExcitationEnergyLight= 0.0 MeV + ExcitationEnergyHeavy= 4.4 MeV + CrossSectionPath= flat.txt CSR5 + ShootLight= 1 + ShootHeavy= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%GammaDecay 25Na - Cascade - BranchingRatio= 70 - Energies= 2.2 - DifferentialCrossSection= 11Li(d,3He)10He.txt Gamma25Na - Cascade - BranchingRatio= 30 - Energies= 1.0 1.2 diff --git a/Inputs/DetectorConfiguration/27Al.target b/Inputs/DetectorConfiguration/27Al.target index 08f2199265cb8df825706729838e9529cbd3e883..708541309b424e31b86bfec09b73e4e23f481858 100644 --- a/Inputs/DetectorConfiguration/27Al.target +++ b/Inputs/DetectorConfiguration/27Al.target @@ -1,10 +1,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Target - THICKNESS= 0.3231 - RADIUS= 7.5 - MATERIAL= Al - X= 0 - Y= 0 - Z= 0 + THICKNESS= 0.3231 micrometer + RADIUS= 7.5 mm + MATERIAL= Al + Angle= 0 deg + X= 0 mm + Y= 0 mm + Z= 0 mm diff --git a/Inputs/DetectorConfiguration/AGATA.detector b/Inputs/DetectorConfiguration/AGATA.detector index cfc3c56d89774b0ea084071f1233db2022a8cf54..2fddf69061feb729e88b48f58c8f99dc4dcc636a 100644 --- a/Inputs/DetectorConfiguration/AGATA.detector +++ b/Inputs/DetectorConfiguration/AGATA.detector @@ -2,40 +2,40 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 10 - RADIUS= 20 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 10 + RADIUS= 20 + MATERIAL= CD2 + ANGLE= 0 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AGATA - THETA= 22.5 + THETA= 22.5 PHI= 45 R= 256.432 Shape= Square %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AGATA - THETA= 22.5 + THETA= 22.5 PHI= 117 R= 256.432 Shape= Square %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AGATA - THETA= 22.5 + THETA= 22.5 PHI= 189 R= 256.432 Shape= Square %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AGATA - THETA= 22.5 + THETA= 22.5 PHI= 261 R= 256.432 Shape= Square %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AGATA - THETA= 22.5 + THETA= 22.5 PHI= 333 R= 256.432 Shape= Square diff --git a/Inputs/DetectorConfiguration/ASTROGAM.detector b/Inputs/DetectorConfiguration/ASTROGAM.detector index be49a6ddcb292b91059d876ace502f6eac12d87c..dbd0ff34d779dbe273b2fb090d7ec83946c7d8c6 100644 --- a/Inputs/DetectorConfiguration/ASTROGAM.detector +++ b/Inputs/DetectorConfiguration/ASTROGAM.detector @@ -1,14 +1,16 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ComptonTelescope - R= 150 - THETA= 0 - PHI= 0 - SIZE_DSSSD= 95.5 - NUMBER_DSSSD= 70 - DISTANCE_INTER_DSSSD= 7.5 - THICKNESS_DSSSD= 0.4 + R= 150 mm + THETA= 0 deg + PHI= 0 deg + BETA= 0 0 0 deg + SIZE_DSSSD= 95.5 mm + NUMBER_DSSSD= 70 + DISTANCE_INTER_DSSSD= 7.5 mm + THICKNESS_DSSSD= 0.4 mm NUMBER_STRIPS= 384 - DISTANCE_TRACKER_CALORIMETER= 2 - THICKNESS_CALORIMETER= 5 + DISTANCE_TRACKER_CALORIMETER= 2 mm + THICKNESS_CALORIMETER= 5 mm TRACKER= 1 CALORIMETER= 0 VIS= 0 diff --git a/Inputs/DetectorConfiguration/AnnularS1.detector b/Inputs/DetectorConfiguration/AnnularS1.detector index 636f8355fa5b5334c0e750d5e80828c4128fe204..e3673019ecdcc8b79a602ff716ccb3327c1b8961 100644 --- a/Inputs/DetectorConfiguration/AnnularS1.detector +++ b/Inputs/DetectorConfiguration/AnnularS1.detector @@ -1,18 +1,15 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Target - THICKNESS= 0.1 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + THICKNESS= 0.1 um + RADIUS= 7.5 mm + MATERIAL= CD2 + Angle= 0 deg + X= 0 mm + Y= 0 mm + Z= 0 mm +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AnnularS1 - Z= 100 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + Z= 100 mm +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AnnularS1 - Z= -100 - VIS= all + Z= -100 mm diff --git a/Inputs/DetectorConfiguration/COCOTE.detector b/Inputs/DetectorConfiguration/COCOTE.detector index 9ca50826de96ffbb178c7e4b287e227ca2cf59b2..bf0904da002dc3369ef90cda93556a2d91b4b948 100644 --- a/Inputs/DetectorConfiguration/COCOTE.detector +++ b/Inputs/DetectorConfiguration/COCOTE.detector @@ -1,14 +1,15 @@ ComptonTelescope - R= 15 - THETA= 0 - PHI= 0 - SIZE_DSSSD= 64 + R= 15 mm + THETA= 0 deg + PHI= 0 deg + BETA= 0 0 0 deg + SIZE_DSSSD= 64 mm NUMBER_DSSSD= 1 - DISTANCE_INTER_DSSSD= 0 - THICKNESS_DSSSD= 1.5 + DISTANCE_INTER_DSSSD= 0 mm + THICKNESS_DSSSD= 1.5 mm NUMBER_STRIPS= 32 - DISTANCE_TRACKER_CALORIMETER= 0 - THICKNESS_CALORIMETER= 0 + DISTANCE_TRACKER_CALORIMETER= 0 mm + THICKNESS_CALORIMETER= 0 mm TRACKER= 1 CALORIMETER= 0 - VIS= 0 + VIS= 1 diff --git a/Inputs/DetectorConfiguration/DUMMYDetector.detector b/Inputs/DetectorConfiguration/DUMMYDetector.detector deleted file mode 100644 index 135a20792d276c041a2fee553bd6cab2a53039a3..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/DUMMYDetector.detector +++ /dev/null @@ -1,25 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -TheDUMMYDetector -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -DUMMYDetector - THETA= 0 - PHI= 0 - R= 150 - Thickness= 20 - Radius= 50 - Material= material1 - LeadThickness= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -DUMMYDetector - THETA= 90 - PHI= 0 - R= 175 - Thickness= 100 - Radius= 50 - Material= material2 - LeadThickness= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% Avaible material: -% material1 -% material2 diff --git a/Inputs/DetectorConfiguration/Example1.detector b/Inputs/DetectorConfiguration/Example1.detector index bd08d12a9223baa8c4f396f445be77f8e4d8b13c..08299c1880580afc4b54374671e184f7cf21c07c 100644 --- a/Inputs/DetectorConfiguration/Example1.detector +++ b/Inputs/DetectorConfiguration/Example1.detector @@ -1,155 +1,151 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 18 - RADIUS= 30 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 - -%%%%%%%%%%%%%%%%%%%%% -MUST2Array -%%%%%%% Telescope 1 %%%%%%% -M2Telescope -X1_Y1= 13.00 102.79 145.98 -X1_Y128= 24.88 10.58 175.20 -X128_Y1= 103.08 102.90 110.06 -X128_Y128= 115.23 10.76 139.14 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all - -%%%%%%% Telescope 2 %%%%%%% -M2Telescope -X1_Y1= -114.05 10.98 138.48 -X1_Y128= -23.81 10.92 174.84 -X128_Y1= -102.23 102.22 109.39 -X128_Y128= -11.95 102.90 145.48 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all - -%%%%%%% Telescope 3 %%%%%%% -M2Telescope -X1_Y1= -11.91 -103.68 146.50 -X1_Y128= -24.30 -10.94 175.00 -X128_Y1= -102.03 -103.39 110.36 -X128_Y128= -114.58 -10.71 138.76 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all - -%%%%%%% Telescope 4 %%%%%%% -M2Telescope -X1_Y1= 115.12 -11.35 138.94 -X1_Y128= 24.33 -11.60 174.81 -X128_Y1= 103.64 -103.42 110.51 -X128_Y128= 12.89 -103.90 146.29 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all -%%%%%%% Telescope 5 %%%%%%% + THICKNESS= 18 micrometer + RADIUS= 30 mm + MATERIAL= CD2 + ANGLE= 0 deg + X= 0 mm + Y= 0 mm + Z= 0 mm +%%%%%%%% MUST 2 %%%%%%%% +%%%%%%% Telescope 1 %%%%%%% +M2Telescope + X1_Y1= 13.00 102.79 145.98 mm + X1_Y128= 24.88 10.58 175.20 mm + X128_Y1= 103.08 102.90 110.06 mm + X128_Y128= 115.23 10.76 139.14 mm + SI= 1.00 + SILI= 0.00 + CSI= 1.00 + VIS= all + +%%%%%%% Telescope 2 %%%%%%% +M2Telescope + X1_Y1= -114.05 10.98 138.48 mm + X1_Y128= -23.81 10.92 174.84 mm + X128_Y1= -102.23 102.22 109.39 mm + X128_Y128= -11.95 102.90 145.48 mm + SI= 1.00 + SILI= 0.00 + CSI= 1.00 + VIS= all + +%%%%%%% Telescope 3 %%%%%%% +M2Telescope + X1_Y1= -11.91 -103.68 146.50 mm + X1_Y128= -24.30 -10.94 175.00 mm + X128_Y1= -102.03 -103.39 110.36 mm + X128_Y128= -114.58 -10.71 138.76 mm + SI= 1.00 + SILI= 0.00 + CSI= 1.00 + VIS= all + +%%%%%%% Telescope 4 %%%%%%% +M2Telescope + X1_Y1= 115.12 -11.35 138.94 mm + X1_Y128= 24.33 -11.60 174.81 mm + X128_Y1= 103.64 -103.42 110.51 mm + X128_Y128= 12.89 -103.90 146.29 mm + SI= 1.00 + SILI= 0.00 + CSI= 1.00 + VIS= all +%%%%%%% Telescope 5 %%%%%%% M2Telescope -X1_Y1= 27.07 50.23 -154.49 -X1_Y128= 116.58 50.23 -108.88 -X128_Y1= 27.07 -50.23 -154.49 -X128_Y128= 116.58 -50.23 -108.88 -SI= 1 -SILI= 1 -CSI= 0 -VIS= all -%%%%%%% Telescope 6 %%%%%%% + X1_Y1= 27.07 50.23 -154.49 mm + X1_Y128= 116.58 50.23 -108.88 mm + X128_Y1= 27.07 -50.23 -154.49 mm + X128_Y128= 116.58 -50.23 -108.88 mm + SI= 1 + SILI= 1 + CSI= 0 + VIS= all +%%%%%%% Telescope 6 %%%%%%% M2Telescope -X1_Y1= -50.23 50.23 365 -X1_Y128= -50.23 -50.23 365 -X128_Y128= 50.23 -50.23 365 -X128_Y1= 50.23 50.23 365 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all - -%%%%%%% Telescope 7 %%%%%%% + X1_Y1= -50.23 50.23 365 mm + X1_Y128= -50.23 -50.23 365 mm + X128_Y128= 50.23 -50.23 365 mm + X128_Y1= 50.23 50.23 365 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all + +%%%%%%% Telescope 7 %%%%%%% M2Telescope -X1_Y1= 157.409 48.006 2.036 -X1_Y128= 126.458 48.227 94.002 -X128_Y1= 157.682 -48.007 1.617 -X128_Y128= 126.757 -49.052 93.510 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all + X1_Y1= 157.409 48.006 2.036 mm + X1_Y128= 126.458 48.227 94.002 mm + X128_Y1= 157.682 -48.007 1.617 mm + X128_Y128= 126.757 -49.052 93.510 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all %%%%%%% Telescope 8 %%%%%%% M2Telescope -X1_Y1= -147.190 50.230 -57.940 -X1_Y128= -82.620 50.230 -134.900 -X128_Y1= -147.190 -50.230 -57.940 -X128_Y128= -82.620 -50.230 -134.900 -SI= 1 -SILI= 1 -CSI= 0 -VIS= all + X1_Y1= -147.190 50.230 -57.940 mm + X1_Y128= -82.620 50.230 -134.900 mm + X128_Y1= -147.190 -50.230 -57.940 mm + X128_Y128= -82.620 -50.230 -134.900 mm + SI= 1 + SILI= 1 + CSI= 0 + VIS= all -%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%% SSSDArray -%%%%%%%%%% Det 1 %%%%%%%% +%%%%%%%%%% Det 1 %%%%%%%% SSSD -A= 17.61 9.85 104.11 -B= 64.48 9.85 85.31 -C= 58.66 56.29 70.79 -D= 11.79 56.29 89.69 -% -%%%%%%%%%% Det 2 %%%%%%%% + A= 17.61 9.85 104.11 mm + B= 64.48 9.85 85.31 mm + C= 58.66 56.29 70.79 mm + D= 11.79 56.29 89.69 mm + % +%%%%%%%%%% Det 2 %%%%%%%% SSSD -A= -11.79 56.29 89.59 -B= -58.66 56.29 70.79 -C= -64.48 9.85 85.31 -D= -17.61 9.85 104.11 -% -%%%%%%%%%% Det 3 %%%%%%%% + A= -11.79 56.29 89.59 mm + B= -58.66 56.29 70.79 mm + C= -64.48 9.85 85.31 mm + D= -17.61 9.85 104.11 mm +% +%%%%%%%%%% Det 3 %%%%%%%% SSSD -A= -17.61 -9.85 104.11 -B= -64.48 -9.85 85.31 -C= -58.66 -56.29 70.79 -D= -11.79 -56.29 89.59 -% -%%%%%%%%%% Det 4 %%%%%%%% + A= -17.61 -9.85 104.11 mm + B= -64.48 -9.85 85.31 mm + C= -58.66 -56.29 70.79 mm + D= -11.79 -56.29 89.59 mm +% +%%%%%%%%%% Det 4 %%%%%%%% SSSD -A= 11.79 -56.29 89.59 -B= 58.66 -56.29 70.79 -C= 64.48 -9.85 85.31 -D= 17.61 -9.85 104.11 + A= 11.79 -56.29 89.59 mm + B= 58.66 -56.29 70.79 mm + C= 64.48 -9.85 85.31 mm + D= 17.61 -9.85 104.11 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ScintillatorPlastic %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plastic - X= 0 - Y= -15 - Z= 318 - Shape= Square - Height= 70 - Width= 40 - Thickness= 20 - Scintillator= BC400 - LeadThickness= 0 + X= 0 mm + Y= -15 mm + Z= 318 mm + Shape= Square + Height= 70 mm + Width= 40 mm + Thickness= 20 mm + Scintillator= BC400 + LeadThickness= 0 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plastic - X= 0 - Y= -15 - Z= 343 - Thickness= 30 - Shape= Square - Height= 70 - Width= 40 - Scintillator= BC400 - LeadThickness= 0 + X= 0 mm + Y= -15 mm + Z= 343 mm + Thickness= 30 mm + Shape= Square + Height= 70 mm + Width= 40 mm + Scintillator= BC400 + LeadThickness= 0 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/Example2.detector b/Inputs/DetectorConfiguration/Example2.detector index 5a66b849e6a1a9e60861637983f52972a27303ac..a2d9678fcda0b98993eac987b4b4121223a86d83 100644 --- a/Inputs/DetectorConfiguration/Example2.detector +++ b/Inputs/DetectorConfiguration/Example2.detector @@ -4,93 +4,91 @@ GeneralTarget %0.2mg/cm2 Target - THICKNESS= 4.5 - RADIUS= 5 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 4.5 micrometer + RADIUS= 5 mm + MATERIAL= CD2 + ANGLE= 0 deg + X= 0 mm + Y= 0 mm + Z= 0 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Sharc -%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - %Upstream CD - SharcQQQ - Z= -71 - R= 0 - Phi= 0 - ThicknessDector= 500 - SharcQQQ - Z= -71 - R= 0 - Phi= 90 - ThicknessDector= 500 - SharcQQQ - Z= -71 - R= 0 - Phi= 180 - ThicknessDector= 500 - SharcQQQ - Z= -71 - R= 0 - Phi= 270 - ThicknessDector= 500 +%Upstream CD +Sharc QQQ + Z= -71 mm + R= 0 mm + Phi= 0 deg + ThicknessDetector= 500 micrometer +Sharc QQQ + Z= -71 mm + R= 0 mm + Phi= 90 deg + ThicknessDetector= 500 micrometer +Sharc QQQ + Z= -71 mm + R= 0 mm + Phi= 180 deg + ThicknessDetector= 500 micrometer +Sharc QQQ + Z= -71 mm + R= 0 mm + Phi= 270 deg + ThicknessDetector= 500 micrometer %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Upstream Box - SharcBOX - Z= -30 - ThicknessDector1= 500 - ThicknessDector2= 500 - ThicknessDector3= 500 - ThicknessDector4= 500 - ThicknessPAD1= 0 - ThicknessPAD2= 0 - ThicknessPAD3= 0 - ThicknessPAD4= 0 +Sharc BOX + Z= -30 mm + ThicknessDetector1= 500 micrometer + ThicknessDetector2= 500 micrometer + ThicknessDetector3= 500 micrometer + ThicknessDetector4= 500 micrometer + ThicknessPAD1= 0 micrometer + ThicknessPAD2= 0 micrometer + ThicknessPAD3= 0 micrometer + ThicknessPAD4= 0 micrometer %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Down Stream Box - SharcBOX - Z= 31.4 - ThicknessDector1= 140 - ThicknessDector2= 140 - ThicknessDector3= 140 - ThicknessDector4= 140 - ThicknessPAD1= 1000 - ThicknessPAD2= 1000 - ThicknessPAD3= 1000 - ThicknessPAD4= 1000 +Sharc BOX + Z= 31.4 mm + ThicknessDetector1= 140 micrometer + ThicknessDetector2= 140 micrometer + ThicknessDetector3= 140 micrometer + ThicknessDetector4= 140 micrometer + ThicknessPAD1= 1 mm + ThicknessPAD2= 1 mm + ThicknessPAD3= 1 mm + ThicknessPAD4= 1 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Downstream CD - SharcQQQ - Z= 67 - R= 0 - Phi= 0 - ThicknessDector= 500 - SharcQQQ - Z= 67 - R= 0 - Phi= 90 - ThicknessDector= 500 - SharcQQQ - Z= 67 - R= 0 - Phi= 180 - ThicknessDector= 500 - SharcQQQ - Z= 67 - R= 0 - Phi= 270 - ThicknessDector= 500 +Sharc QQQ + Z= 67 mm + R= 0 mm + Phi= 0 deg + ThicknessDetector= 500 micrometer +Sharc QQQ + Z= 67 mm + R= 0 mm + Phi= 90 deg + ThicknessDetector= 500 micrometer +Sharc QQQ + Z= 67 mm + R= 0 mm + Phi= 180 deg + ThicknessDetector= 500 micrometer +Sharc QQQ + Z= 67 mm + R= 0 mm + Phi= 270 deg + ThicknessDetector= 500 micrometer %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plastic - X= 0 - Y= 0 - Z= 400 - Thickness= 0.025 - Shape= Square - Height= 40 - Width= 40 - Scintillator= BC400 - LeadThickness= 0.09 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + X= 0 mm + Y= 0 mm + Z= 400 mm + Thickness= 0.025 mm + Shape= Square + Height= 40 mm + Width= 40 mm + Scintillator= BC400 + LeadThickness= 0.09 mm +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/Example3.detector b/Inputs/DetectorConfiguration/Example3.detector new file mode 100644 index 0000000000000000000000000000000000000000..1fae4d5f67e9858eeccb35e6d284ddce7e8a0cd6 --- /dev/null +++ b/Inputs/DetectorConfiguration/Example3.detector @@ -0,0 +1,220 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 10.3 micrometer + ANGLE= 0 deg + RADIUS= 12 mm + MATERIAL= CD2 + X= 0 mm + Y= 0 mm + Z= 0 mm +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1 +Fatima + Theta= 19.02390167 deg + Phi= 319.5114947 deg + R= 182.5428674 mm + Beta= -3.272242219 -3.272242219 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 +Fatima + Theta= 37.70329404 deg + Phi= 340.5573012 deg + R= 189.784275 mm + Beta= -2.75768229 -2.75768229 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3 +Fatima + Theta= 57.52298638 deg + Phi= 346.4393719 deg + R= 195.3169113 mm + Beta= -1.93008888 -1.93008888 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4 +Fatima + Theta= 77.29968198 deg + Phi= 348.489585 deg + R= 198.4676409 mm + Beta= -0.989888226 -0.989888226 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5 +Fatima + Theta= 25.83989928 deg + Phi= 11.03538389 deg + R= 186.4716798 mm + Beta= -3.052133684 3.052133684 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6 +Fatima + Theta= 46.55103678 deg + Phi= 6.372873059 deg + R= 193.0582918 mm + Beta= -2.336257006 2.336257006 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7 +Fatima + Theta= 67.02589098 deg + Phi= 4.906399705 deg + R= 197.5675029 mm + Beta= -1.342490056 1.342490056 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8 +Fatima + Theta= 107.1442293 deg + Phi= 4.707364909 deg + R= 198.3842185 mm + Beta= -1.028278389 1.028278389 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9 +Fatima + Theta= 26.85689097 deg + Phi= 57.83150522 deg + R= 182.3833519 mm + Beta= -3.278549609 3.278549609 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 10 +Fatima + Theta= 41.56673389 deg + Phi= 33.74691678 deg + R= 189.2241657 mm + Beta= -2.815552839 2.815552839 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11 +Fatima + Theta= 59.43554149 deg + Phi= 24.61616818 deg + R= 194.4599021 mm + Beta= -2.099135856 2.099135856 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 12 +Fatima + Theta= 77.97363101 deg + Phi= 21.17191049 deg + R= 197.4448302 mm + Beta= -1.382760452 1.382760452 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 13 +Fatima + Theta= 115.2395483 deg + Phi= 23.21965799 deg + R= 195.5744725 mm + Beta= -1.874825744 1.874825744 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 14 +Fatima + Theta= 46.94600569 deg + Phi= 61.13966047 deg + R= 184.8217039 mm + Beta= -3.160159266 3.160159266 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 15 +Fatima + Theta= 72.54645084 deg + Phi= 39.89896247 deg + R= 193.2944032 mm + Beta= -2.299216098 2.299216098 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 +Fatima + Theta= 103.1039385 deg + Phi= 38.77251614 deg + R= 193.922275 mm + Beta= -2.195219842 2.195219842 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 17 +%Fatima +% Theta= 90 +% Phi= 180 +% R= 21 +% Beta= #DIV/0! #DIV/0! 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 18 +%Fatima +% Theta= 90 deg +% Phi= 180 deg +% R= 21 mm +% Beta= #DIV/0! #DIV/0! 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 19 +%Fatima +% Theta= 90 deg +% Phi= 180 deg +% R= 21 mm +% Beta= #DIV/0! #DIV/0! 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 20 +Fatima + Theta= 19.02390167 deg + Phi= 220.4885053 deg + R= 182.5428674 mm + Beta= -3.272242219 -3.272242219 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 21 +Fatima + Theta= 37.70329404 deg + Phi= 199.4426988 deg + R= 189.784275 mm + Beta= -2.75768229 -2.75768229 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 22 +Fatima + Theta= 57.52298638 deg + Phi= 193.5606281 deg + R= 195.3169113 mm + Beta= -1.93008888 -1.93008888 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 23 +Fatima + Theta= 77.29968198 deg + Phi= 191.510415 deg + R= 198.4676409 mm + Beta= -0.989888226 -0.989888226 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 24 +Fatima + Theta= 25.83989928 deg + Phi= 168.9646161 deg + R= 186.4716798 mm + Beta= -3.052133684 -3.052133684 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 25 +Fatima + Theta= 46.55103678 deg + Phi= 173.6271269 deg + R= 193.0582918 mm + Beta= -2.336257006 -2.336257006 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 26 +Fatima + Theta= 67.02589098 deg + Phi= 175.0936003 deg + R= 197.5675029 mm + Beta= -1.342490056 -1.342490056 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 27 +Fatima + Theta= 107.1442293 deg + Phi= 175.2926351 deg + R= 198.3842185 mm + Beta= -1.028278389 -1.028278389 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 28 +Fatima + Theta= 26.85689097 deg + Phi= 122.1684948 deg + R= 182.3833519 mm + Beta= -3.278549609 -3.278549609 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 29 +Fatima + Theta= 41.56673389 deg + Phi= 146.2530832 deg + R= 189.2241657 mm + Beta= -2.815552839 -2.815552839 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 30 +Fatima + Theta= 59.43554149 deg + Phi= 155.3838318 deg + R= 194.4599021 mm + Beta= -2.099135856 -2.099135856 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 31 +Fatima + Theta= 77.97363101 deg + Phi= 158.8280895 deg + R= 197.4448302 mm + Beta= -1.382760452 -1.382760452 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 32 +Fatima + Theta= 115.2395483 deg + Phi= 156.780342 deg + R= 195.5744725 mm + Beta= -1.874825744 -1.874825744 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 33 +Fatima + Theta= 46.94600569 deg + Phi= 118.8603395 deg + R= 184.8217039 mm + Beta= -3.160159266 -3.160159266 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 34 +Fatima + Theta= 72.54645084 deg + Phi= 140.1010375 deg + R= 193.2944032 mm + Beta= -2.299216098 -2.299216098 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 35 +Fatima + Theta= 103.1039385 deg + Phi= 141.2274839 deg + R= 193.922275 mm + Beta= -2.195219842 -2.195219842 0 deg + diff --git a/Inputs/DetectorConfiguration/FPDTamu.detector b/Inputs/DetectorConfiguration/FPDTamu.detector index 52517d78db5380db05896cdcb7b10efb2b8f4575..8b353270b27ac9f382a0cbc7937a17e24a9416a7 100644 --- a/Inputs/DetectorConfiguration/FPDTamu.detector +++ b/Inputs/DetectorConfiguration/FPDTamu.detector @@ -2,30 +2,30 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 10 - RADIUS= 20 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 10 + RADIUS= 20 + MATERIAL= CD2 + ANGLE= 0 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FPDTamu - X= 0 - Y= 0 - Z= 350 - Shape= Square + X= 0 + Y= 0 + Z= 350 + Shape= Square %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FPDTamu - X= 350 - Y= 350 - Z= 350 - Shape= Square + X= 350 + Y= 350 + Z= 350 + Shape= Square %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FPDTamu - R= 350 - THETA= 90 - PHI= 63 - Shape= Cylindrical + R= 350 + THETA= 90 + PHI= 63 + Shape= Cylindrical %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/Fatima.detector b/Inputs/DetectorConfiguration/Fatima.detector index 6a1289586fbe638b33a500950f53f1acf57660c2..f5a50fbed9abb38e990f7af7726396b2d80172ce 100644 --- a/Inputs/DetectorConfiguration/Fatima.detector +++ b/Inputs/DetectorConfiguration/Fatima.detector @@ -1,277 +1,247 @@ -%Fichier de configuration manip E225 -%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 -%Thickness in micrometer -%Radius in mm -%Temperature in K, Pressure in bar -%Material name according to the target library - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%Target -% THICKNESS= 0.01 -% ANGLE= 0 -% RADIUS= 12 -% MATERIAL= CD2 -% NBLAYERS= 50 -% X= 0 -% Y= 0 -% Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%GeneralChamber -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%GREATChamber -%GREAT-Karl -% Heightmin= 178. -% Heightmax= 181. -% Widthmin= 228. -% Widthmax= 231. -% Depthmin= 200. -% Depthmax= 205. -% MATERIAL= Alu + THICKNESS= 10.3 micrometer + ANGLE= 0 deg + RADIUS= 12 mm + MATERIAL= CD2 + X= 0 mm + Y= 0 mm + Z= 0 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% ################################################# -% ############ At the back of DSSSDs: ############# -% ################################################# -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Fatima -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1 -FatimaDetector - Theta= 19.02390167 - Phi= 319.5114947 - R= 182.5428674 - Beta= -3.272242219 -3.272242219 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 -FatimaDetector - Theta= 37.70329404 - Phi= 340.5573012 - R= 189.784275 - Beta= -2.75768229 -2.75768229 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3 -FatimaDetector - Theta= 57.52298638 - Phi= 346.4393719 - R= 195.3169113 - Beta= -1.93008888 -1.93008888 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4 -FatimaDetector - Theta= 77.29968198 - Phi= 348.489585 - R= 198.4676409 - Beta= -0.989888226 -0.989888226 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5 -FatimaDetector - Theta= 25.83989928 - Phi= 11.03538389 - R= 186.4716798 - Beta= -3.052133684 3.052133684 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6 -FatimaDetector - Theta= 46.55103678 - Phi= 6.372873059 - R= 193.0582918 - Beta= -2.336257006 2.336257006 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7 -FatimaDetector - Theta= 67.02589098 - Phi= 4.906399705 - R= 197.5675029 - Beta= -1.342490056 1.342490056 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8 -FatimaDetector - Theta= 107.1442293 - Phi= 4.707364909 - R= 198.3842185 - Beta= -1.028278389 1.028278389 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9 -FatimaDetector - Theta= 26.85689097 - Phi= 57.83150522 - R= 182.3833519 - Beta= -3.278549609 3.278549609 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 10 -FatimaDetector - Theta= 41.56673389 - Phi= 33.74691678 - R= 189.2241657 - Beta= -2.815552839 2.815552839 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11 -FatimaDetector - Theta= 59.43554149 - Phi= 24.61616818 - R= 194.4599021 - Beta= -2.099135856 2.099135856 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 12 -FatimaDetector - Theta= 77.97363101 - Phi= 21.17191049 - R= 197.4448302 - Beta= -1.382760452 1.382760452 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 13 -FatimaDetector - Theta= 115.2395483 - Phi= 23.21965799 - R= 195.5744725 - Beta= -1.874825744 1.874825744 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 14 -FatimaDetector - Theta= 46.94600569 - Phi= 61.13966047 - R= 184.8217039 - Beta= -3.160159266 3.160159266 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 15 -FatimaDetector - Theta= 72.54645084 - Phi= 39.89896247 - R= 193.2944032 - Beta= -2.299216098 2.299216098 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 -FatimaDetector - Theta= 103.1039385 - Phi= 38.77251614 - R= 193.922275 - Beta= -2.195219842 2.195219842 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 17 -%FatimaDetector -% Theta= 90 -% Phi= 180 -% R= 21 -% Beta= #DIV/0! #DIV/0! 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 18 -%FatimaDetector -% Theta= 90 -% Phi= 180 -% R= 21 -% Beta= #DIV/0! #DIV/0! 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 19 -%FatimaDetector -% Theta= 90 -% Phi= 180 -% R= 21 -% Beta= #DIV/0! #DIV/0! 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 20 -FatimaDetector - Theta= 19.02390167 - Phi= 220.4885053 - R= 182.5428674 - Beta= -3.272242219 -3.272242219 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 21 -FatimaDetector - Theta= 37.70329404 - Phi= 199.4426988 - R= 189.784275 - Beta= -2.75768229 -2.75768229 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 22 -FatimaDetector - Theta= 57.52298638 - Phi= 193.5606281 - R= 195.3169113 - Beta= -1.93008888 -1.93008888 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 23 -FatimaDetector - Theta= 77.29968198 - Phi= 191.510415 - R= 198.4676409 - Beta= -0.989888226 -0.989888226 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 24 -FatimaDetector - Theta= 25.83989928 - Phi= 168.9646161 - R= 186.4716798 - Beta= -3.052133684 -3.052133684 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 25 -FatimaDetector - Theta= 46.55103678 - Phi= 173.6271269 - R= 193.0582918 - Beta= -2.336257006 -2.336257006 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 26 -FatimaDetector - Theta= 67.02589098 - Phi= 175.0936003 - R= 197.5675029 - Beta= -1.342490056 -1.342490056 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 27 -FatimaDetector - Theta= 107.1442293 - Phi= 175.2926351 - R= 198.3842185 - Beta= -1.028278389 -1.028278389 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 28 -FatimaDetector - Theta= 26.85689097 - Phi= 122.1684948 - R= 182.3833519 - Beta= -3.278549609 -3.278549609 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 29 -FatimaDetector - Theta= 41.56673389 - Phi= 146.2530832 - R= 189.2241657 - Beta= -2.815552839 -2.815552839 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 30 -FatimaDetector - Theta= 59.43554149 - Phi= 155.3838318 - R= 194.4599021 - Beta= -2.099135856 -2.099135856 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 31 -FatimaDetector - Theta= 77.97363101 - Phi= 158.8280895 - R= 197.4448302 - Beta= -1.382760452 -1.382760452 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 32 -FatimaDetector - Theta= 115.2395483 - Phi= 156.780342 - R= 195.5744725 - Beta= -1.874825744 -1.874825744 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 33 -FatimaDetector - Theta= 46.94600569 - Phi= 118.8603395 - R= 184.8217039 - Beta= -3.160159266 -3.160159266 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 34 -FatimaDetector - Theta= 72.54645084 - Phi= 140.1010375 - R= 193.2944032 - Beta= -2.299216098 -2.299216098 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 35 -FatimaDetector - Theta= 103.1039385 - Phi= 141.2274839 - R= 193.922275 - Beta= -2.195219842 -2.195219842 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 36 -%FatimaDetector -% Theta= 6.709836808 -% Phi= 180 -% R= 179.7310491 -% Beta= -3.354918404 -3.354918404 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 37 -%FatimaDetector -% Theta= 6.709836808 -% Phi= 180 -% R= 179.7310491 -% Beta= -3.354918404 -3.354918404 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 38 -%FatimaDetector -% Theta= 6.709836808 -% Phi= 180 -% R= 179.7310491 -% Beta= -3.354918404 -3.354918404 0 +Chamber Great-Karl + Heightmin= 178. + Heightmax= 181. + Widthmin= 228. + Widthmax= 231. + Depthmin= 200. + Depthmax= 205. + MATERIAL= Alu +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1 +Fatima + Theta= 19.02390167 deg + Phi= 319.5114947 deg + R= 182.5428674 mm + Beta= -3.272242219 -3.272242219 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 +Fatima + Theta= 37.70329404 deg + Phi= 340.5573012 deg + R= 189.784275 mm + Beta= -2.75768229 -2.75768229 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3 +Fatima + Theta= 57.52298638 deg + Phi= 346.4393719 deg + R= 195.3169113 mm + Beta= -1.93008888 -1.93008888 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4 +Fatima + Theta= 77.29968198 deg + Phi= 348.489585 deg + R= 198.4676409 mm + Beta= -0.989888226 -0.989888226 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5 +Fatima + Theta= 25.83989928 deg + Phi= 11.03538389 deg + R= 186.4716798 mm + Beta= -3.052133684 3.052133684 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6 +Fatima + Theta= 46.55103678 deg + Phi= 6.372873059 deg + R= 193.0582918 mm + Beta= -2.336257006 2.336257006 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7 +Fatima + Theta= 67.02589098 deg + Phi= 4.906399705 deg + R= 197.5675029 mm + Beta= -1.342490056 1.342490056 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8 +Fatima + Theta= 107.1442293 deg + Phi= 4.707364909 deg + R= 198.3842185 mm + Beta= -1.028278389 1.028278389 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9 +Fatima + Theta= 26.85689097 deg + Phi= 57.83150522 deg + R= 182.3833519 mm + Beta= -3.278549609 3.278549609 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 10 +Fatima + Theta= 41.56673389 deg + Phi= 33.74691678 deg + R= 189.2241657 mm + Beta= -2.815552839 2.815552839 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11 +Fatima + Theta= 59.43554149 deg + Phi= 24.61616818 deg + R= 194.4599021 mm + Beta= -2.099135856 2.099135856 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 12 +Fatima + Theta= 77.97363101 deg + Phi= 21.17191049 deg + R= 197.4448302 mm + Beta= -1.382760452 1.382760452 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 13 +Fatima + Theta= 115.2395483 deg + Phi= 23.21965799 deg + R= 195.5744725 mm + Beta= -1.874825744 1.874825744 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 14 +Fatima + Theta= 46.94600569 deg + Phi= 61.13966047 deg + R= 184.8217039 mm + Beta= -3.160159266 3.160159266 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 15 +Fatima + Theta= 72.54645084 deg + Phi= 39.89896247 deg + R= 193.2944032 mm + Beta= -2.299216098 2.299216098 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 +Fatima + Theta= 103.1039385 deg + Phi= 38.77251614 deg + R= 193.922275 mm + Beta= -2.195219842 2.195219842 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 17 +%Fatima +% Theta= 90 +% Phi= 180 +% R= 21 +% Beta= #DIV/0! #DIV/0! 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 18 +%Fatima +% Theta= 90 deg +% Phi= 180 deg +% R= 21 mm +% Beta= #DIV/0! #DIV/0! 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 19 +%Fatima +% Theta= 90 deg +% Phi= 180 deg +% R= 21 mm +% Beta= #DIV/0! #DIV/0! 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 20 +Fatima + Theta= 19.02390167 deg + Phi= 220.4885053 deg + R= 182.5428674 mm + Beta= -3.272242219 -3.272242219 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 21 +Fatima + Theta= 37.70329404 deg + Phi= 199.4426988 deg + R= 189.784275 mm + Beta= -2.75768229 -2.75768229 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 22 +Fatima + Theta= 57.52298638 deg + Phi= 193.5606281 deg + R= 195.3169113 mm + Beta= -1.93008888 -1.93008888 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 23 +Fatima + Theta= 77.29968198 deg + Phi= 191.510415 deg + R= 198.4676409 mm + Beta= -0.989888226 -0.989888226 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 24 +Fatima + Theta= 25.83989928 deg + Phi= 168.9646161 deg + R= 186.4716798 mm + Beta= -3.052133684 -3.052133684 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 25 +Fatima + Theta= 46.55103678 deg + Phi= 173.6271269 deg + R= 193.0582918 mm + Beta= -2.336257006 -2.336257006 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 26 +Fatima + Theta= 67.02589098 deg + Phi= 175.0936003 deg + R= 197.5675029 mm + Beta= -1.342490056 -1.342490056 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 27 +Fatima + Theta= 107.1442293 deg + Phi= 175.2926351 deg + R= 198.3842185 mm + Beta= -1.028278389 -1.028278389 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 28 +Fatima + Theta= 26.85689097 deg + Phi= 122.1684948 deg + R= 182.3833519 mm + Beta= -3.278549609 -3.278549609 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 29 +Fatima + Theta= 41.56673389 deg + Phi= 146.2530832 deg + R= 189.2241657 mm + Beta= -2.815552839 -2.815552839 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 30 +Fatima + Theta= 59.43554149 deg + Phi= 155.3838318 deg + R= 194.4599021 mm + Beta= -2.099135856 -2.099135856 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 31 +Fatima + Theta= 77.97363101 deg + Phi= 158.8280895 deg + R= 197.4448302 mm + Beta= -1.382760452 -1.382760452 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 32 +Fatima + Theta= 115.2395483 deg + Phi= 156.780342 deg + R= 195.5744725 mm + Beta= -1.874825744 -1.874825744 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 33 +Fatima + Theta= 46.94600569 deg + Phi= 118.8603395 deg + R= 184.8217039 mm + Beta= -3.160159266 -3.160159266 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 34 +Fatima + Theta= 72.54645084 deg + Phi= 140.1010375 deg + R= 193.2944032 mm + Beta= -2.299216098 -2.299216098 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 35 +Fatima + Theta= 103.1039385 deg + Phi= 141.2274839 deg + R= 193.922275 mm + Beta= -2.195219842 -2.195219842 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 36 +%Fatima +% Theta= 6.709836808 deg +% Phi= 180 deg +% R= 179.7310491 mm +% Beta= -3.354918404 -3.354918404 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 37 +%Fatima +% Theta= 6.709836808 deg +% Phi= 180 deg +% R= 179.7310491 mm +% Beta= -3.354918404 -3.354918404 0 deg +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 38 +%Fatima +% Theta= 6.709836808 deg +% Phi= 180 deg +% R= 179.7310491 mm +% Beta= -3.354918404 -3.354918404 0 deg diff --git a/Inputs/DetectorConfiguration/GeTAMU.detector b/Inputs/DetectorConfiguration/GeTAMU.detector index 582db53dcd4a6b7c4718c101e3b70288d76ef020..bc04c5e0f9378a383e7fd2d9f21e7dca62cb419e 100644 --- a/Inputs/DetectorConfiguration/GeTAMU.detector +++ b/Inputs/DetectorConfiguration/GeTAMU.detector @@ -1,49 +1,17 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%0.5mg/cm2 Target - THICKNESS= 4.8 - RADIUS= 5 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 4.8 + RADIUS= 5 + MATERIAL= CD2 + ANGLE= 0 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% GeTAMU -% Placing detector in the standard position -%GeTAMUStandard -%CloverId= 1 2 3 4 -%CloverId= 5 7 9 11 -% Free placing of detector at any arbitrary position -GeTAMUClover - CloverId= 1 - R= 100 - Phi= 0 - Theta= 90 - Beta= 0 0 0 -GeTAMUClover - CloverId= 2 - R= 100 - Phi= 90 - Theta= 90 - Beta= 0 0 0 -GeTAMUClover - CloverId= 3 - R= 100 - Phi= 180 - Theta= 90 - Beta= 0 0 0 -GeTAMUClover - CloverId= 4 - R= 100 - Phi= 270 - Theta= 90 - Beta= 0 0 0 - -% Adding the support Frame -GeTAMUFrame - RightFrame= 1 - LeftFrame= 0 + CloverId= 1 + R= 100 + Phi= 0 + Theta= 90 + Beta= 0 0 0 diff --git a/Inputs/DetectorConfiguration/Helios2.detector b/Inputs/DetectorConfiguration/Helios2.detector index 169c380d92307a50abb1e6d2991b17bfc4778c2d..bd4943b160a8978e4154c3cd1f23cf4fbedd837b 100644 --- a/Inputs/DetectorConfiguration/Helios2.detector +++ b/Inputs/DetectorConfiguration/Helios2.detector @@ -2,119 +2,119 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 10 - RADIUS= 20 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 10 + RADIUS= 20 + MATERIAL= CD2 + ANGLE= 0 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - MagneticField= 2 - Z= -412.250 - Face= Up + MagneticField= 2 + Z= -412.250 + Face= Up %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -412.250 - Face= Right + Z= -412.250 + Face= Right %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -412.250 - Face= Down + Z= -412.250 + Face= Down %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -412.250 - Face= Left + Z= -412.250 + Face= Left %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 MagneticField= 2 - Z= -353.850 - Face= Up + Z= -353.850 + Face= Up %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -353.850 - Face= Right + Z= -353.850 + Face= Right %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -353.850 - Face= Down + Z= -353.850 + Face= Down %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -353.850 - Face= Left + Z= -353.850 + Face= Left %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 MagneticField= 2 - Z= -295.450 - Face= Up + Z= -295.450 + Face= Up %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -295.450 - Face= Right + Z= -295.450 + Face= Right %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -295.450 - Face= Down + Z= -295.450 + Face= Down %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -295.450 - Face= Left + Z= -295.450 + Face= Left %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 MagneticField= 2 - Z= -237.05 - Face= Up + Z= -237.05 + Face= Up %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -237.05 - Face= Right + Z= -237.05 + Face= Right %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -237.05 - Face= Down + Z= -237.05 + Face= Down %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -237.05 - Face= Left + Z= -237.05 + Face= Left %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 MagneticField= 2 - Z= -178.65 - Face= Up + Z= -178.65 + Face= Up %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -178.65 - Face= Right + Z= -178.65 + Face= Right %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -178.65 - Face= Down + Z= -178.65 + Face= Down %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -178.65 - Face= Left + Z= -178.65 + Face= Left %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 MagneticField= 2 - Z= -120.25 - Face= Up + Z= -120.25 + Face= Up %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -120.25 - Face= Right + Z= -120.25 + Face= Right %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -120.25 - Face= Down + Z= -120.25 + Face= Down %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Helios2 - Z= -120.25 - Face= Left + Z= -120.25 + Face= Left %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/MUGAST.detector b/Inputs/DetectorConfiguration/MUGAST.detector deleted file mode 100644 index 3f79178b736dab510ff585855d2e444c14a9155c..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/MUGAST.detector +++ /dev/null @@ -1,148 +0,0 @@ -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -Target - THICKNESS= 0.94 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GaspardTracker -GPDChamber= MUGAST - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Annular Back -GPDAnnular - Z= -148.6 - RMIN= 16 - RMAX= 45 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 End-Cap Back -GPDTrapezoid - X128_Y128= 41.963 21.364 -138.589 - X1_Y128= 23.737 39.592 -138.591 - X128_Y1= 122.368 54.712 -71.098 - X1_Y1= 57.084 119.996 -71.098 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDTrapezoid - X128_Y128= -41.963 -21.364 -138.589 - X1_Y128= -23.737 -39.592 -138.591 - X128_Y1= -122.368 -54.712 -71.098 - X1_Y1= -57.084 -119.996 -71.098 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -GPDTrapezoid - X128_Y128= -21.364 41.963 -138.589 - X1_Y128= -39.592 23.737 -138.591 - X128_Y1= -54.712 122.368 -71.098 - X1_Y1= -119.996 57.084 -71.098 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -GPDTrapezoid - X128_Y128= 21.364 -41.963 -138.589 - X1_Y128= 39.592 -23.737 -138.591 - X128_Y1= 54.712 -122.368 -71.098 - X1_Y1= 119.996 -57.084 -71.098 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Barrel -GPDSquare - X1_Y1= -132.251 58.314 53.5 - X128_Y1= -61.823 128.742 53.5 - X1_Y128= -132.251 58.314 -58.5 - X128_Y128= -61.823 128.742 -58.5 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -134.75 -52.319 53.5 - X128_Y1= -134.75 47.281 53.5 - X1_Y128= -134.75 -52.319 -58.5 - X128_Y128= -134.75 47.281 -58.5 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all - - -%%%%%%%%%%%%%%%%%%%%% -MUST2Array -%%%%%%% Telescope 1 %%%%%%% -M2Telescope -X1_Y1= 13.00 102.79 145.98 -X1_Y128= 24.88 10.58 175.20 -X128_Y1= 103.08 102.90 110.06 -X128_Y128= 115.23 10.76 139.14 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all - -%%%%%%% Telescope 2 %%%%%%% -M2Telescope -X1_Y1= -114.05 10.98 138.48 -X1_Y128= -23.81 10.92 174.84 -X128_Y1= -102.23 102.22 109.39 -X128_Y128= -11.95 102.90 145.48 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all - -%%%%%%% Telescope 3 %%%%%%% -M2Telescope -X1_Y1= -11.91 -103.68 146.50 -X1_Y128= -24.30 -10.94 175.00 -X128_Y1= -102.03 -103.39 110.36 -X128_Y128= -114.58 -10.71 138.76 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all - -%%%%%%% Telescope 4 %%%%%%% -M2Telescope -X1_Y1= 115.12 -11.35 138.94 -X1_Y128= 24.33 -11.60 174.81 -X128_Y1= 103.64 -103.42 110.51 -X128_Y128= 12.89 -103.90 146.29 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%Paris -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParisCluster - A= 291.358 -7.734 -38.5 - B= 291 -7.118 129 - C= 246.046 -168.989 129 - D= 246.661 -168.641 -38.5 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParisCluster - A= 243.139 158.516 -38.5 - B= 242.517 158.852 129 - C= 290.527 -2.142 129 - D= 290.863 -1.52 -38.5 diff --git a/Inputs/DetectorConfiguration/MUST2.detector b/Inputs/DetectorConfiguration/MUST2.detector index 92fcd64d3aab6592ad92baedf68f7ef5ec7dd59a..b3165efa07ce096e34a381790057a08b5b2b173f 100644 --- a/Inputs/DetectorConfiguration/MUST2.detector +++ b/Inputs/DetectorConfiguration/MUST2.detector @@ -2,44 +2,42 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 4.8 - RADIUS= 5 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%% -MUST2Array -%%%%%%% Telescope 1 %%%%%%% -M2Telescope -X1_Y1= 10.85 105.03 146.16 -X1_Y128= 22.8 9.84 175.95 -X128_Y1= 104.09 105.03 108.76 -X128_Y128= 116.04 9.84 138.55 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all - -%%%%%%% Telescope 2 %%%%%%% + THICKNESS= 4.8 micrometer + RADIUS= 5 mm + MATERIAL= CD2 + ANGLE= 0 deg + X= 0 deg + Y= 0 deg + Z= 0 deg +%%%%%%% Telescope 1 %%%%%%% +M2Telescope + X1_Y1= 10.85 105.03 146.16 mm + X1_Y128= 22.8 9.84 175.95 mm + X128_Y1= 104.09 105.03 108.76 mm + X128_Y128= 116.04 9.84 138.55 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all + +%%%%%%% Telescope 2 %%%%%%% M2Telescope - THETA= -130 - PHI= 0 - R= 150 - BETA= 0 0 0 - SI= 1 - SILI= 1 - CSI= 0 - VIS= all + THETA= -130 deg + PHI= 0 deg + R= 150 mm + BETA= 0 0 0 deg + SI= 1 + SILI= 1 + CSI= 0 + VIS= all -%%%%%%% Telescope 2 %%%%%%% +%%%%%%% Telescope 2 %%%%%%% M2Telescope - THETA= -40 - PHI= 0 - R= 150 - BETA= 0 0 0 - SI= 1 - SILI= 1 - CSI= 1 - VIS= all + THETA= -40 deg + PHI= 0 deg + R= 150 mm + BETA= 0 0 0 deg + SI= 1 + SILI= 1 + CSI= 1 + VIS= all diff --git a/Inputs/DetectorConfiguration/Microball.detector b/Inputs/DetectorConfiguration/Microball.detector index 9396e699450a39023321c155b9003229140d69ca..aac28bff4bcb0d6504ae975ddbd7d8a04144fb6a 100644 --- a/Inputs/DetectorConfiguration/Microball.detector +++ b/Inputs/DetectorConfiguration/Microball.detector @@ -2,33 +2,24 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 10 - RADIUS= 20 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 10 micrometer + RADIUS= 20 nn + MATERIAL= CD2 + ANGLE= 0 deg + X= 0 mm + Y= 0 mm + Z= 0 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Microball - RING1= 1 - RING2= 1 - RING3= 1 - RING4= 1 - RING5= 1 - RING6= 1 - RING7= 1 - RING8= 1 - RING9= 1 - %DISABLE_CRYSTAL 20 - %DISABLE_CRYSTAL 21 - %DISABLE_CRYSTAL 22 - %DISABLE_CRYSTAL 32 - %DISABLE_CRYSTAL 33 - %DISABLE_CRYSTAL 34 - %DISABLE_CRYSTAL 44 - %DISABLE_CRYSTAL 45 - %DISABLE_CRYSTAL 46 - %DISABLE_CRYSTAL 47 - DETECTOR_FLIP= 0 - INCLUDE_CHAMBER= 0 + RING1= 1 + RING2= 1 + RING3= 1 + RING4= 1 + RING5= 1 + RING6= 1 + RING7= 1 + RING8= 1 + RING9= 1 + %DISABLE_CRYSTAL 20 21 22 32 33 34 44 45 46 47 + DETECTOR_FLIP= 0 + INCLUDE_CHAMBER= 0 diff --git a/Inputs/DetectorConfiguration/Miniball.detector b/Inputs/DetectorConfiguration/Miniball.detector index 9976a96e08f73070186a02fdcf1b506333e82957..d65b4371dc92d20f487766f18b5542828f1a4709 100644 --- a/Inputs/DetectorConfiguration/Miniball.detector +++ b/Inputs/DetectorConfiguration/Miniball.detector @@ -2,60 +2,60 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 10 - RADIUS= 20 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 10 + RADIUS= 20 + MATERIAL= CD2 + ANGLE= 0 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Miniball - R= 110 - THETA= 125 - PHI= 320 - Shape= Square + R= 110 + THETA= 125 + PHI= 320 + Shape= Square %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Miniball - R= 110 - THETA= 125 - PHI= 220 - Shape= Square + R= 110 + THETA= 125 + PHI= 220 + Shape= Square %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Miniball - R= 110 - THETA= 67 - PHI= 320 - Shape= Square + R= 110 + THETA= 67 + PHI= 320 + Shape= Square %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Miniball - R= 110 - THETA= 67 - PHI= 220 - Shape= Square + R= 110 + THETA= 67 + PHI= 220 + Shape= Square %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Miniball - R= 110 - THETA= 67 - PHI= 40 - Shape= Square + R= 110 + THETA= 67 + PHI= 40 + Shape= Square %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Miniball - R= 110 - THETA= 67 - PHI= 140 - Shape= Square + R= 110 + THETA= 67 + PHI= 140 + Shape= Square %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Miniball - R= 110 - THETA= 125 - PHI= 40 - Shape= Square + R= 110 + THETA= 125 + PHI= 40 + Shape= Square %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Miniball - R= 110 - THETA= 125 - PHI= 140 - Shape= Square + R= 110 + THETA= 125 + PHI= 140 + Shape= Square %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/Nana_Lab.detector b/Inputs/DetectorConfiguration/Nana_Lab.detector index 05ce8f2ab559358de066b88df5621019cfbfa371..fceaad260a72a87069e0201b97f1dcad505b4827 100644 --- a/Inputs/DetectorConfiguration/Nana_Lab.detector +++ b/Inputs/DetectorConfiguration/Nana_Lab.detector @@ -1,30 +1,17 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - Target -THICKNESS= 10.3 -ANGLE= 0 -RADIUS= 12 -MATERIAL= CH2 -NBLAYERS= 50 -X= 0 -Y= 0 -Z= 0 - -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and R given in mm -%%Angle given in degree -%%Option: all or sensible for VISualisation - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + THICKNESS= 10.3 micrometer + ANGLE= 0 deg + RADIUS= 12 mm + MATERIAL= CH2 + NBLAYERS= 50 + X= 0 mm + Y= 0 mm + Z= 0 mm +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Nana -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1 -NanaDetector - Theta= 60.000000000000000 - Phi= 0.0000000000000000 - R= 70.000000000000000 - Beta= 0 0 0 - Vis= all - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 + Theta= 60.0 deg + Phi= 0.0 deg + R= 70.0 mm + Beta= 0 0 0 deg + Vis= all diff --git a/Inputs/DetectorConfiguration/NeutronWall.detector b/Inputs/DetectorConfiguration/NeutronWall.detector index ed7ec84331bae0b99a94a697b0450697457d8d4e..d5f1508cb1f086e84a3ba1f68c5e646c28c0a1b7 100644 --- a/Inputs/DetectorConfiguration/NeutronWall.detector +++ b/Inputs/DetectorConfiguration/NeutronWall.detector @@ -1,22 +1,20 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 0.00001 - RADIUS= 20 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 + Thickness= 10 micrometer + Radius= 20 mm + Material= CD2 + Angle= 0 deg + X= 0 mm + Y= 0 mm + Z= 0 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% NeutronWall - THETA= 0 - PHI= 0 - R= 4000 + THETA= 0 deg + PHI= 0 deg + R= 4 m BARS= 25 VETOWALL= 1 - VWDISTANCE= 100 + VWDISTANCE= 100 mm OVERLAP= 3 VWMATERIAL= BC400 NWMATERIAL= NE213 diff --git a/Inputs/DetectorConfiguration/Paris1.detector b/Inputs/DetectorConfiguration/Paris1.detector deleted file mode 100644 index ce08b1f20fb3491be18f3a2880ae15bfa3c3c35c..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/Paris1.detector +++ /dev/null @@ -1,135 +0,0 @@ -%Fichier de configuration manip E225 -%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 -%Thickness in micrometer -%Radius in mm -%Temperature in K, Pressure in bar -%Material name according to the target library - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2 - NBLAYERS= 50 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and R given in mm -%%Angle given in degree -%%Option: 0,1 for Si SiLi and CsI -%%Option: all or sensible for VISualisation - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Paris -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ParisCluster - A= -84.5 -235 84.5 - B= 84.5 -235 84.5 - C= -84.5 -235 -84.5 - D= 84.5 -235 -84.5 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - A= -225.920617 -106.419571 84.5 - B= -106.419571 -225.920617 84.5 - C= -225.920617 -106.419571 -84.5 - D= -106.419571 -225.920617 -84.5 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - A= -235 84.5 84.5 - B= -235 -84.5 84.5 - C= -235 84.5 -84.5 - D= -235 -84.5 -84.5 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -ParisCluster - A= -106.419571 225.920617 84.5 - B= -225.920617 106.419571 84.5 - C= -106.419571 225.920617 -84.5 - D= -225.920617 106.419571 -84.5 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - A= 84.5 235 84.5 - B= -84.5 235 84.5 - C= 84.5 235 -84.5 - D= -84.5 235 -84.5 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - A= 225.920617 106.419571 84.5 - B= 106.419571 225.920617 84.5 - C= 225.920617 106.419571 -84.5 - D= 106.419571 225.920617 -84.5 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - A= 235 -84.5 84.5 - B= 235 84.5 84.5 - C= 235 -84.5 -84.5 - D= 235 84.5 -84.5 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - A= 106.419571 -225.920617 84.5 - B= 225.920617 -106.419571 84.5 - C= 106.419571 -225.920617 -84.5 - D= 225.920617 -106.419571 -84.5 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - A= 84.5 84.5 -235 - B= -84.5 84.5 -235 - C= 84.5 -84.5 -235 - D= -84.5 -84.5 -235 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - A= 225.920617 84.5 -106.419571 - B= 106.419571 84.5 -225.920617 - C= 225.920617 -84.5 -106.419571 - D= 106.419571 -84.5 -225.920617 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - A= 106.419571 84.5 225.920617 - B= 225.920617 84.5 106.419571 - C= 106.419571 -84.5 225.920617 - D= 225.920617 -84.5 106.419571 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - A= -84.5 84.5 235 - B= 84.5 84.5 235 - C= -84.5 -84.5 235 - D= 84.5 -84.5 235 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - A= -225.920617 84.5 106.419571 - B= -106.419571 84.5 225.920617 - C= -225.920617 -84.5 106.419571 - D= -106.419571 -84.5 225.920617 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - A= -106.419571 84.5 -225.920617 - B= -225.920617 84.5 -106.419571 - C= -106.419571 -84.5 -225.920617 - D= -225.920617 -84.5 -106.419571 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - A= -84.5 106.419571 -225.920617 - B= 84.5 106.419571 -225.920617 - C= -84.5 225.920617 -106.419571 - D= 84.5 225.920617 -106.419571 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - A= -84.5 225.920617 106.419571 - B= 84.5 225.920617 106.419571 - C= -84.5 106.419571 225.920617 - D= 84.5 106.419571 225.920617 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - A= -84.5 -106.419571 225.920617 - B= 84.5 -106.419571 225.920617 - C= -84.5 -225.920617 106.419571 - D= 84.5 -225.920617 106.419571 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - A= -84.5 -225.920617 -106.419571 - B= 84.5 -225.920617 -106.419571 - C= -84.5 -106.419571 -225.920617 - D= 84.5 -106.419571 -225.920617 diff --git a/Inputs/DetectorConfiguration/Paris2.detector b/Inputs/DetectorConfiguration/Paris2.detector deleted file mode 100644 index d12ef61ba34625cda5729a056006e7e4800dbddf..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/Paris2.detector +++ /dev/null @@ -1,171 +0,0 @@ -%Fichier de configuration manip E225 -%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 -%Thickness in micrometer -%Radius in mm -%Temperature in K, Pressure in bar -%Material name according to the target library - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2 - NBLAYERS= 50 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and R given in mm -%%Angle given in degree -%%Option: 0,1 for Si SiLi and CsI -%%Option: all or sensible for VISualisation - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Paris -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= -175.9824 135.677313 -95.372227 - B= -199.252552 89.137008 -118.642379 - C= -135.677313 135.677313 -135.677313 - D= -158.947466 89.137008 -158.947466 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= -135.677313 135.677313 -135.677313 - B= -158.947466 89.137008 -158.947466 - C= -95.372227 135.677313 -175.9824 - D= -118.642379 89.137008 -199.252552 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= -132.559704 182.217618 -92.254617 - B= -155.829857 135.677313 -115.52477 - C= -92.254617 182.217618 -132.559704 - D= -115.52477 135.677313 -155.829857 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= -95.372227 135.677313 175.9824 - B= -118.642379 89.137008 199.252552 - C= -135.677313 135.677313 135.677313 - D= -158.947466 89.137008 158.947466 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= -135.677313 135.677313 135.677313 - B= -158.947466 89.137008 158.947466 - C= -175.9824 135.677313 95.372227 - D= -199.252552 89.137008 118.642379 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= -92.254617 182.217618 132.559704 - B= -115.52477 135.677313 155.829857 - C= -132.559704 182.217618 92.254617 - D= -155.829857 135.677313 115.52477 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= 175.9824 135.677313 95.372227 - B= 199.252552 89.137008 118.642379 - C= 135.677313 135.677313 135.677313 - D= 158.947466 89.137008 158.947466 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= 135.677313 135.677313 135.677313 - B= 158.947466 89.137008 158.947466 - C= 95.372227 135.677313 175.9824 - D= 118.642379 89.137008 199.252552 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= 132.559704 182.217618 92.254617 - B= 155.829857 135.677313 115.52477 - C= 92.254617 182.217618 132.559704 - D= 115.52477 135.677313 155.829857 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= 95.372227 135.677313 -175.9824 - B= 118.642379 89.137008 -199.252552 - C= 135.677313 135.677313 -135.677313 - D= 158.947466 89.137008 -158.947466 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= 135.677313 135.677313 -135.677313 - B= 158.947466 89.137008 -158.947466 - C= 175.9824 135.677313 -95.372227 - D= 199.252552 89.137008 -118.642379 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= 92.254617 182.217618 -132.559704 - B= 115.52477 135.677313 -155.829857 - C= 132.559704 182.217618 -92.254617 - D= 155.829857 135.677313 -115.52477 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= -95.372227 -135.677313 -175.9824 - B= -118.642379 -89.137008 -199.252552 - C= -135.677313 -135.677313 -135.677313 - D= -158.947466 -89.137008 -158.947466 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= -135.677313 -135.677313 -135.677313 - B= -158.947466 -89.137008 -158.947466 - C= -175.9824 -135.677313 -95.372227 - D= -199.252552 -89.137008 -118.642379 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= -92.254617 -182.217618 -132.559704 - B= -115.52477 -135.677313 -155.829857 - C= -132.559704 -182.217618 -92.254617 - D= -155.829857 -135.677313 -115.52477 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= 175.9824 -135.677313 -95.372227 - B= 199.252552 -89.137008 -118.642379 - C= 135.677313 -135.677313 -135.677313 - D= 158.947466 -89.137008 -158.947466 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= 135.677313 -135.677313 -135.677313 - B= 158.947466 -89.137008 -158.947466 - C= 95.372227 -135.677313 -175.9824 - D= 118.642379 -89.137008 -199.252552 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= 132.559704 -182.217618 -92.254617 - B= 155.829857 -135.677313 -115.52477 - C= 92.254617 -182.217618 -132.559704 - D= 115.52477 -135.677313 -155.829857 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= 95.372227 -135.677313 175.9824 - B= 118.642379 -89.137008 199.252552 - C= 135.677313 -135.677313 135.677313 - D= 158.947466 -89.137008 158.947466 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= 135.677313 -135.677313 135.677313 - B= 158.947466 -89.137008 158.947466 - C= 175.9824 -135.677313 95.372227 - D= 199.252552 -89.137008 118.642379 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= 92.254617 -182.217618 132.559704 - B= 115.52477 -135.677313 155.829857 - C= 132.559704 -182.217618 92.254617 - D= 155.829857 -135.677313 115.52477 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= -175.9824 -135.677313 95.372227 - B= -199.252552 -89.137008 118.642379 - C= -135.677313 -135.677313 135.677313 - D= -158.947466 -89.137008 158.947466 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= -135.677313 -135.677313 135.677313 - B= -158.947466 -89.137008 158.947466 - C= -95.372227 -135.677313 175.9824 - D= -118.642379 -89.137008 199.252552 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - A= -132.559704 -182.217618 92.254617 - B= -155.829857 -135.677313 115.52477 - C= -92.254617 -182.217618 132.559704 - D= -115.52477 -135.677313 155.829857 diff --git a/Inputs/DetectorConfiguration/Paris3by3_CsIshield.detector b/Inputs/DetectorConfiguration/Paris3by3_CsIshield.detector deleted file mode 100644 index 2d95c3a03c6774f224c968aa07d933adfadbb45b..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/Paris3by3_CsIshield.detector +++ /dev/null @@ -1,124 +0,0 @@ -%Fichier de configuration manip E225 -%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 -%Thickness in micrometer -%Radius in mm -%Temperature in K, Pressure in bar -%Material name according to the target library - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2 - NBLAYERS= 50 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and R given in mm -%%Angle given in degree -%%Option: 0,1 for Si SiLi and CsI -%%Option: all or sensible for VISualisation -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Paris -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ParisCluster - A= -84.5 84.5 0 - B= 84.5 84.5 0 - C= -84.5 -84.5 0 - D= 84.5 -84.5 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -%ParisCluster -% A= -84.5 -235 84.5 -% B= 84.5 -235 84.5 -% C= -84.5 -235 -84.5 -% D= 84.5 -235 -84.5 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 = centre of the volume -%ParisClShield -% X1_Y1= 117.94 31.125 0. -% X1_Y128= 117.94 -31.125 0. -% X128_Y1= -117.94 31.125 0. -% X128_Y128= -117.94 -31.125 0. -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%A one bottom corner -%ParisClShield -% X1_Y1= 31.125 62.25 75. -% X1_Y128= 31.125 0. 75. -% X128_Y1= -204.75 62.25 75. -% X128_Y128= -204.75 0. 75. -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0A on top corner -%ParisClShield -% X1_Y1= -31.125. 62.25 -75. -% X1_Y128= -31.125. 0. -75. -% X128_Y1= -267. 62.25 -75. -% X128_Y128= -267. 0. -75. -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% from bottom corner -ParisClShield - X1_Y1= 151.375 153.75 156. - X128_Y1= -84.5 153.75 156. - X128_Y128= -84.5 91.5 156. - X1_Y128= 151.375 91.5 156. - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% from top corner -%ParisClShield -% X1_Y1= 146.375 153.75 77 -% X128_Y1= -89.5 153.75 77. -% X128_Y128= -89.5 91.5 77. -% X1_Y128= 146.375 91.5 77. -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% from bottom corner -ParisClShield - X1_Y1= 153.75 -151.375 156 - X128_Y1= 153.75 84.5 156. - X128_Y128= 91.5 84.5 156. - X1_Y128= 91.5 -151.375 156. - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% from top corner -%ParisClShield -% X1_Y1= 153.75 -146.625 77 -% X128_Y1= 153.75 89.25 77. -% X128_Y128= 91.5 89.25 77. -% X1_Y128= 91.5 -146.625 77. -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% from bottom corner -ParisClShield - X1_Y1= -151.375 -153.75 156 - X128_Y1= 84.25 -153.75 156. - X128_Y128= 84.25 -91.5 156. - X1_Y128= -151.375 -91.5 156. - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% from top corner -%ParisClShield -% X1_Y1= -146.625 -153.75 77 -% X128_Y1= 89.25 -153.75 77. -% X128_Y128= 89.25 -91.5 77. -% X1_Y128= -146.625 -91.5 77. -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% from bottom corner -ParisClShield - X1_Y1= -153.75 151.375 156 - X128_Y1= -153.75 -84.5 156. - X128_Y128= -91.5 -84.5 156. - X1_Y128= -91.5 151.375 156. - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% from top corner -%ParisClShield -% X1_Y1= -153.75 146.375 77 -% X128_Y1= -153.75 -89.5 77. -% X128_Y128= -91.5 -89.5 77. -% X1_Y128= -91.5 146.375 77. -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0A -%ParisClShield -% THETA= 0. -% PHI= 0. -% R= 150. -% BETA= 0. 0. 0. -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/Paris3by3_CsIshield208.detector b/Inputs/DetectorConfiguration/Paris3by3_CsIshield208.detector deleted file mode 100644 index b551d5d1fdc7277649107425c05741c0f30d6df1..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/Paris3by3_CsIshield208.detector +++ /dev/null @@ -1,674 +0,0 @@ -%Fichier de configuration manip E225 -%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 -%Thickness in micrometer -%Radius in mm -%Temperature in K, Pressure in bar -%Material name according to the target library - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%Target -% THICKNESS= 10.3 -% ANGLE= 0 -% RADIUS= 12 -% MATERIAL= CD2l -% NBLAYERS= 50 -% X= 0 -% Y= 0 -% Z= 0 -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and R given in mm -%%Angle given in degree -%%Option: 0,1 for Si SiLi and CsI -%%Option: all or sensible for VISualisation -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Paris -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -50.418664 -87.327687 -217.661051 - X1_Y128= -188.406586 -87.327687 -120.088856 - X128_Y1= 18.575297 -206.828733 -120.088856 - X128_Y128= -119.412625 -206.828733 -22.51666 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%% 1 -%ShieldClParis -%X1_Y1= -334.9677217 -148.6692001 -211.5267063 -%X1_Y128= -309.5542658 -192.6865973 -175.586652 -%X128_Y1= -142.3765903 -148.6692 -347.7092004 -%X128_Y128= -116.9631343 -192.6865972 -311.7691461 -%VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -212.3401423 -364.4251571 -33.9914984 -X1_Y128= -161.51323 -364.4251571 -69.93155248 -X128_Y1= -308.6357072 -197.6363448 -170.1739932 -X128_Y128= -257.8087949 -197.6363448 -206.1140473 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 37.76296724 -366.1045357 -208.7842915 -X1_Y128= 12.34951131 -322.0871385 -244.7243458 -X128_Y1= -154.8281642 -366.1045357 -72.60179742 -X128_Y128= -180.2416202 -322.0871385 -108.5418517 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -84.86461219 -150.3485787 -386.3194994 -X1_Y128= -135.6915245 -150.3485787 -350.3794453 -X128_Y1= 11.43095278 -317.137391 -250.1370047 -X128_Y128= -39.3959595 -317.137391 -214.1969506 -VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -ParisCluster - X1_Y1= -190.237216 -86.499477 -117.780059 - X1_Y128= -239.023313 -1.999477 20.207863 - X128_Y1= -121.243255 -206.000523 -20.207863 - X128_Y128= -170.029352 -121.500523 117.780059 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 2 -%ShieldClParis -%X1_Y1= -421.6181269 2.264017201 35.81176364 -%X1_Y128= -396.1220195 -41.89653619 71.51689679 -%X128_Y1= -353.971956 -114.9025878 -157.4057249 -%X128_Y128= -328.4758486 -159.0631412 -121.7005917 -%VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -297.3273652 -213.0138971 212.7697599 -X1_Y128= -279.4747986 -243.9354494 161.7775451 -X128_Y1= -393.9361094 -45.68264358 77.47741798 -X128_Y128= -376.0835428 -76.60419594 26.48520322 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -208.848367 -366.2640172 -35.81176364 -X1_Y128= -234.3444744 -322.1034638 -71.51689679 -X128_Y1= -276.494538 -249.0974122 157.4057249 -X128_Y128= -301.9906454 -204.9368588 121.7005917 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -%ShieldClParis -%X1_Y1= -333.1391288 -150.9861029 -212.7697599 -%X1_Y128= -350.9916954 -120.0645506 -161.7775451 -%X128_Y1= -236.5303845 -318.3173564 -77.47741806 -%X128_Y128= -254.3829511 -287.3958041 -26.48520328 -%VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -ParisCluster - X1_Y1= -238.82525 0 22.51666 - X1_Y128= -169.831289 119.501046 120.088856 - X128_Y1= -169.831289 -119.501046 120.088856 - X128_Y128= -100.837328 0 217.661051 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 3 -ShieldClParis -X1_Y1= -298.1743452 215.7559566 208.784291 -X1_Y128= -272.7608891 171.7385595 244.7243453 -X128_Y1= -394.4699107 48.9671447 72.60179615 -X128_Y128= -369.0564547 4.949747549 108.5418504 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -172.637996 1.679378555 386.3194988 -X1_Y128= -198.0514521 -42.33801856 350.3794445 -X128_Y1= -268.9335614 168.4681906 250.1370041 -X128_Y128= -294.3470175 124.4507935 214.1969498 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -296.2351659 -215.7559566 211.5267047 -X1_Y128= -321.6486219 -171.7385595 175.5866504 -X128_Y1= -199.9396004 -48.9671447 347.7091996 -X128_Y128= -225.3530564 -4.949747549 311.7691453 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -421.7715151 -1.679378528 33.99149691 -X1_Y128= -396.358059 42.33801857 69.9315512 -X128_Y1= -325.4759497 -168.4681907 170.1739916 -X128_Y128= -300.0624936 -124.4507936 206.1140459 -VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -ParisCluster - X1_Y1= -167.720555 121.500523 121.045191 - X1_Y128= -21.362262 206.000523 121.045191 - X128_Y1= -98.726594 1.999477 218.617387 - X128_Y128= 47.631699 86.499477 218.617387 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 4 -ShieldClParis -X1_Y1= -35.85246778 366.2640171 208.8413835 -X1_Y128= -10.68804787 322.1034637 244.7810551 -X128_Y1= -240.5683866 249.0974121 208.2129755 -X128_Y128= -215.4039666 204.9368587 244.1526471 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 89.5548772 150.9861028 385.009836 -X1_Y128= 35.52810055 120.0645505 384.8439923 -X128_Y1= -5.797051298 318.3173563 248.8287913 -X128_Y128= -59.82382795 287.395804 248.6629475 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -174.3030301 -2.264017362 385.5681276 -X1_Y128= -199.46745 41.89653603 349.6284561 -X128_Y1= 30.41288869 114.9025876 386.1965356 -X128_Y128= 5.248468782 159.063141 350.256864 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -299.7103751 213.013897 209.399675 -X1_Y128= -245.6835984 243.9354493 209.5655188 -X128_Y1= -204.3584466 45.68264341 345.5807198 -X128_Y128= -150.33167 76.60419575 345.7465636 -VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -ParisCluster - X1_Y1= -18.575297 206.828733 120.088856 - X1_Y128= 119.412625 206.828733 22.51666 - X128_Y1= 50.418664 87.327687 217.661051 - X128_Y128= 188.406586 87.327687 120.088856 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 5 -ShieldClParis -X1_Y1= 209.4313732 366.1045359 33.99149673 -X1_Y128= 234.8448293 322.0871387 69.93155092 -X128_Y1= 16.84024247 366.104536 170.1739919 -X128_Y128= 42.25369861 322.0871388 206.1140461 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 335.9373126 150.3485792 208.7842904 -X1_Y128= 285.1104005 150.3485792 244.7243447 -X128_Y1= 239.6417468 317.1373913 72.60179588 -X128_Y128= 188.8148347 317.1373913 108.5418502 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 87.77338339 148.6692006 386.3194987 -X1_Y128= 62.35992725 192.6865977 350.3794445 -X128_Y1= 280.3645141 148.6692005 250.1370036 -X128_Y128= 254.951058 192.6865977 214.1969494 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -38.73255596 364.4251573 211.5267051 -X1_Y128= 12.09435614 364.4251573 175.5866507 -X128_Y1= 57.56300972 197.6363452 347.7091996 -X128_Y128= 108.3899218 197.6363452 311.7691452 -VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -ParisCluster - X1_Y1= 121.243255 206.000523 20.207863 - X1_Y128= 170.029352 121.500523 -117.780059 - X128_Y1= 190.237216 86.499477 117.780059 - X128_Y128= 239.023313 1.999477 -20.207863 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 6 -ShieldClParis -X1_Y1= 295.6735001 215.8784753 -212.1865178 -X1_Y128= 321.1696075 171.717922 -176.4813846 -X128_Y1= 228.0273291 333.0450805 -18.96902942 -X128_Y128= 253.5234365 288.8845271 16.73610377 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 421.3265059 -1.758914768 -39.11949374 -X1_Y128= 403.4739393 29.16263761 11.87272101 -X128_Y1= 324.7177617 165.5723387 -174.4118357 -X128_Y128= 306.8651951 196.493891 -123.419621 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 334.7929938 148.1215246 212.1865178 -X1_Y128= 309.2968865 192.282078 176.4813846 -X128_Y1= 402.4391648 30.95491952 18.96902942 -X128_Y128= 376.9430575 75.11547288 -16.73610377 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 209.1399881 365.7589148 39.11949372 -X1_Y128= 226.9925547 334.8373624 -11.87272102 -X128_Y1= 305.7487323 198.4276614 174.4118358 -X128_Y128= 323.6012989 167.506109 123.419621 -VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -ParisCluster - X1_Y1= 169.831289 119.501046 -120.088856 - X1_Y128= 100.837328 0 -217.661051 - X128_Y1= 238.82525 0 -22.51666 - X128_Y128= 169.831289 -119.501046 -120.088856 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 7 -ShieldClParis -X1_Y1= 172.6379967 1.679378615 -386.3194985 -X1_Y128= 198.0514528 -42.3380185 -350.3794441 -X128_Y1= 268.9335619 168.4681907 -250.1370035 -X128_Y128= 294.3470179 124.4507935 -214.1969492 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 296.2351663 -215.7559566 -211.5267042 -X1_Y128= 321.6486223 -171.7385595 -175.5866499 -X128_Y1= 199.9396011 -48.96714461 -347.7091992 -X128_Y128= 225.3530571 -4.949747477 -311.7691448 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 421.7715152 -1.679378615 -33.99149608 -X1_Y128= 396.3580592 42.3380185 -69.93155041 -X128_Y1= 325.47595 -168.4681907 -170.173991 -X128_Y128= 300.062494 -124.4507935 -206.1140454 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 298.1743456 215.7559566 -208.7842904 -X1_Y128= 272.7608897 171.7385595 -244.7243447 -X128_Y1= 394.4699109 48.96714468 -72.60179535 -X128_Y128= 369.0564549 4.949747536 -108.5418497 -VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -ParisCluster - X1_Y1= 98.726594 -1.999477 -218.617387 - X1_Y128= -47.631699 -86.499477 -218.617387 - X128_Y1= 167.720555 -121.500523 -121.045191 - X128_Y128= 21.362262 -206.000523 -121.045191 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 8 -ShieldClParis -X1_Y1= -88.45370297 -148.1215245 -386.374701 -X1_Y128= -63.28928301 -192.2820779 -350.4350294 -X128_Y1= 116.2622157 -30.95491938 -385.7462932 -X128_Y128= 141.4266357 -75.11547275 -349.8066216 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 32.83111694 -365.7589147 -210.2189031 -X1_Y128= 86.85789358 -334.8373623 -210.0530594 -X128_Y1= -62.52081164 -198.4276612 -346.3999479 -X128_Y128= -8.494035002 -167.5061088 -346.2341042 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 298.6092008 -215.8784752 -208.0348102 -X1_Y128= 273.4447809 -171.7179219 -243.9744817 -X128_Y1= 93.89328213 -333.0450804 -208.663218 -X128_Y128= 68.72886217 -288.884527 -244.6028895 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 177.3243809 1.758914928 -384.190608 -X1_Y128= 123.2976043 -29.16263747 -384.3564517 -X128_Y1= 272.6763096 -165.5723385 -248.0095632 -X128_Y128= 218.6495329 -196.4938909 -248.175407 -VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 -ParisCluster - X1_Y1= 50.418664 -87.327687 217.661051 - X1_Y128= 188.406586 -87.327687 120.088856 - X128_Y1= -18.575297 -206.828733 120.088856 - X128_Y128= 119.412625 -206.828733 22.51666 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 9 -ShieldClParis -X1_Y1= 334.9677226 -148.6692001 211.5267049 -X1_Y128= 309.5542665 -192.6865973 175.5866508 -X128_Y1= 142.3765917 -148.6692 347.7091998 -X128_Y128= 116.9631356 -192.6865972 311.7691457 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 212.3401425 -364.4251571 33.99149755 -X1_Y128= 161.5132303 -364.4251571 69.93155184 -X128_Y1= 308.6357079 -197.6363448 170.173992 -X128_Y128= 257.8087958 -197.6363448 206.1140463 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -37.7629664 -366.1045357 208.7842917 -X1_Y128= -12.34951033 -322.0871385 244.7243459 -X128_Y1= 154.8281645 -366.1045357 72.6017968 -X128_Y128= 180.2416206 -322.0871385 108.541851 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 84.86461374 -150.3485787 386.3194991 -X1_Y128= 135.6915259 -150.3485787 350.3794448 -X128_Y1= -11.43095178 -317.137391 250.1370047 -X128_Y128= 39.39596036 -317.137391 214.1969504 -VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 -ParisCluster - X1_Y1= 190.237216 -86.499477 117.780059 - X1_Y128= 239.023313 -1.999477 -20.207863 - X128_Y1= 121.243255 -206.000523 20.207863 - X128_Y128= 170.029352 -121.500523 -117.780059 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 10 -ShieldClParis -X1_Y1= 421.6181269 2.264017214 -35.81176364 -X1_Y128= 396.1220195 -41.89653617 -71.51689679 -X128_Y1= 353.971956 -114.9025878 157.4057249 -X128_Y128= 328.4758486 -159.0631412 121.7005917 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 297.3273652 -213.013897 -212.7697599 -X1_Y128= 279.4747986 -243.9354494 -161.7775451 -X128_Y1= 393.9361094 -45.68264357 -77.47741798 -X128_Y128= 376.0835428 -76.60419593 -26.48520322 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 208.8483671 -366.2640172 35.81176364 -X1_Y128= 234.3444744 -322.1034638 71.51689679 -X128_Y1= 276.494538 -249.0974122 -157.4057249 -X128_Y128= 301.9906454 -204.9368588 -121.7005917 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 333.1391288 -150.9861029 212.7697599 -X1_Y128= 350.9916954 -120.0645506 161.7775451 -X128_Y1= 236.5303846 -318.3173564 77.47741806 -X128_Y128= 254.3829511 -287.3958041 26.48520328 -VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 -ParisCluster - X1_Y1= 167.720555 121.500523 -121.045191 - X1_Y128= 21.362262 206.000523 -121.045191 - X128_Y1= 98.726594 1.999477 -218.617387 - X128_Y128= -47.631699 86.499477 -218.617387 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 11 -ShieldClParis -X1_Y1= 35.85246778 366.2640171 -208.8413835 -X1_Y128= 10.68804787 322.1034637 -244.7810551 -X128_Y1= 240.5683866 249.0974121 -208.2129755 -X128_Y128= 215.4039666 204.9368587 -244.1526471 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -89.5548772 150.9861028 -385.009836 -X1_Y128= -35.52810055 120.0645505 -384.8439923 -X128_Y1= 5.797051298 318.3173563 -248.8287913 -X128_Y128= 59.82382795 287.395804 -248.6629475 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 174.3030301 -2.264017362 -385.5681276 -X1_Y128= 199.46745 41.89653603 -349.6284561 -X128_Y1= -30.41288869 114.9025876 -386.1965356 -X128_Y128= -5.248468782 159.063141 -350.256864 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 299.7103751 213.013897 -209.399675 -X1_Y128= 245.6835984 243.9354493 -209.5655188 -X128_Y1= 204.3584466 45.68264341 -345.5807198 -X128_Y128= 150.33167 76.60419575 -345.7465636 -VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 -ParisCluster - X1_Y1= 18.575297 206.828733 -120.088856 - X1_Y128= -119.412625 206.828733 -22.51666 - X128_Y1= -50.418664 87.327687 -217.661051 - X128_Y128= -188.406586 87.327687 -120.088856 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 12 -ShieldClParis -X1_Y1= -209.4313732 366.1045359 -33.99149673 -X1_Y128= -234.8448293 322.0871387 -69.93155092 -X128_Y1= -16.84024247 366.104536 -170.1739919 -X128_Y128= -42.25369861 322.0871388 -206.1140461 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -335.9373126 150.3485792 -208.7842904 -X1_Y128= -285.1104005 150.3485792 -244.7243447 -X128_Y1= -239.6417468 317.1373913 -72.60179588 -X128_Y128= -188.8148347 317.1373913 -108.5418502 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -87.77338339 148.6692006 -386.3194987 -X1_Y128= -62.35992725 192.6865977 -350.3794445 -X128_Y1= -280.3645141 148.6692005 -250.1370036 -X128_Y128= -254.951058 192.6865977 -214.1969494 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 38.73255596 364.4251573 -211.5267051 -X1_Y128= -12.09435614 364.4251573 -175.5866507 -X128_Y1= -57.56300972 197.6363452 -347.7091996 -X128_Y128= -108.3899218 197.6363452 -311.7691452 -VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 -ParisCluster - X1_Y1= -121.243255 206.000523 -20.207863 - X1_Y128= -170.029352 121.500523 117.780059 - X128_Y1= -190.237216 86.499477 -117.780059 - X128_Y128= -239.023313 1.999477 20.207863 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 13 -ShieldClParis -X1_Y1= -295.6735001 215.8784753 212.1865178 -X1_Y128= -321.1696075 171.717922 176.4813846 -X128_Y1= -228.0273291 333.0450805 18.96902942 -X128_Y128= -253.5234365 288.8845271 -16.73610377 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -421.3265059 -1.758914768 39.11949374 -X1_Y128= -403.4739393 29.16263761 -11.87272101 -X128_Y1= -324.7177617 165.5723387 174.4118357 -X128_Y128= -306.8651951 196.493891 123.419621 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -334.7929938 148.1215246 -212.1865178 -X1_Y128= -309.2968865 192.282078 -176.4813846 -X128_Y1= -402.4391648 30.95491952 -18.96902942 -X128_Y128= -376.9430575 75.11547288 16.73610377 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -209.1399881 365.7589148 -39.11949372 -X1_Y128= -226.9925547 334.8373624 11.87272102 -X128_Y1= -305.7487323 198.4276614 -174.4118358 -X128_Y128= -323.6012989 167.506109 -123.419621 -VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 -ParisCluster - X1_Y1= -98.726594 -1.999477 218.617387 - X1_Y128= 47.631699 -86.499477 218.617387 - X128_Y1= -167.720555 -121.500523 121.045191 - X128_Y128= -21.362262 -206.000523 121.045191 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 14 -ShieldClParis -X1_Y1= 88.45370297 -148.1215245 386.374701 -X1_Y128= 63.28928301 -192.2820779 350.4350294 -X128_Y1= -116.2622157 -30.95491938 385.7462932 -X128_Y128= -141.4266357 -75.11547275 349.8066216 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -32.83111694 -365.7589147 210.2189031 -X1_Y128= -86.85789358 -334.8373623 210.0530594 -X128_Y1= 62.52081164 -198.4276612 346.3999479 -X128_Y128= 8.494035002 -167.5061088 346.2341042 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -298.6092008 -215.8784752 208.0348102 -X1_Y128= -273.4447809 -171.7179219 243.9744817 -X128_Y1= -93.89328213 -333.0450804 208.663218 -X128_Y128= -68.72886217 -288.884527 244.6028895 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -177.3243809 1.758914928 384.190608 -X1_Y128= -123.2976043 -29.16263747 384.3564517 -X128_Y1= -272.6763096 -165.5723385 248.0095632 -X128_Y128= -218.6495329 -196.4938909 248.175407 -VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 -ParisCluster - X1_Y1= 189.082817 -84.5 121.045191 - X1_Y128= 51.094895 -84.5 218.617387 - X128_Y1= 189.082817 84.5 121.045191 - X128_Y128= 51.094895 84.5 218.617387 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 15 -ShieldClParis -X1_Y1= 333.7526679 153.75 209.8083586 -X1_Y128= 333.7526678 91.49999999 209.8083586 -X128_Y1= 141.1615368 153.7500001 345.9908533 -X128_Y128= 141.1615367 91.50000008 345.9908533 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 335.6918472 -151.375 208.4371517 -X1_Y128= 284.864935 -151.375 244.377206 -X128_Y1= 335.6918472 84.49999999 208.4371517 -X128_Y128= 284.8649351 84.5 244.3772059 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 86.55832786 -153.75 384.6011525 -X1_Y128= 86.55832788 -91.49999999 384.6011525 -X128_Y1= 279.1494589 -153.7500001 248.4186578 -X128_Y128= 279.149459 -91.50000008 248.4186578 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 84.61914852 151.375 385.9723594 -X1_Y128= 135.4460607 151.375 350.0323051 -X128_Y1= 84.6191484 -84.49999996 385.9723595 -X128_Y128= 135.4460606 -84.5 350.0323052 -VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 -ParisCluster - X1_Y1= 117.780059 208 20.207863 - X1_Y128= -20.207863 208 117.780059 - X128_Y1= 20.207863 208 -117.780059 - X128_Y128= -117.780059 208 -20.207863 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 16 -ShieldClParis -X1_Y1= 35.81176366 364 -212.7697599 -X1_Y128= 71.51689679 364 -161.7775451 -X128_Y1= -157.4057249 364 -77.47741806 -X128_Y128= -121.7005917 364 -26.48520328 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 212.7697599 364 35.81176364 -X1_Y128= 161.7775451 364 71.51689679 -X128_Y1= 77.47741802 364 -157.4057249 -X128_Y128= 26.48520325 364 -121.7005917 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -35.81176363 364 212.7697599 -X1_Y128= -71.51689678 364 161.7775451 -X128_Y1= 157.4057248 364 77.47741798 -X128_Y128= 121.7005917 364 26.48520322 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -212.7697599 364 -35.81176364 -X1_Y128= -161.7775451 364 -71.51689679 -X128_Y1= -77.47741802 364 157.4057249 -X128_Y128= -26.48520325 364 121.7005917 -VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 -ParisCluster - X1_Y1= -51.094895 84.5 -218.617387 - X1_Y128= -189.082817 84.5 -121.045191 - X128_Y1= -51.094895 -84.5 -218.617387 - X128_Y128= -189.082817 -84.5 -121.045191 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 17 -ShieldClParis -X1_Y1= -333.7526679 153.75 -209.8083586 -X1_Y128= -333.7526678 91.49999999 -209.8083586 -X128_Y1= -141.1615368 153.7500001 -345.9908533 -X128_Y128= -141.1615367 91.50000008 -345.9908533 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -335.6918472 -151.375 -208.4371517 -X1_Y128= -284.864935 -151.375 -244.377206 -X128_Y1= -335.6918472 84.49999999 -208.4371517 -X128_Y128= -284.8649351 84.5 -244.3772059 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -86.55832786 -153.75 -384.6011525 -X1_Y128= -86.55832788 -91.49999999 -384.6011525 -X128_Y1= -279.1494589 -153.7500001 -248.4186578 -X128_Y128= -279.149459 -91.50000008 -248.4186578 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -84.61914852 151.375 -385.9723594 -X1_Y128= -135.4460607 151.375 -350.0323051 -X128_Y1= -84.6191484 -84.49999996 -385.9723595 -X128_Y128= -135.4460606 -84.5 -350.0323052 -VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18 -ParisCluster - X1_Y1= 20.207863 -208 -117.780059 - X1_Y128= -117.780059 -208 -20.207863 - X128_Y1= 117.780059 -208 20.207863 - X128_Y128= -20.207863 -208 117.780059 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%% 18 -ShieldClParis -X1_Y1= 212.1865178 -364 39.11949374 -X1_Y128= 176.4813846 -364 -11.87272101 -X128_Y1= 18.96902938 -364 174.4118357 -X128_Y128= -16.73610379 -364 123.419621 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= 39.11949373 -364 -212.1865178 -X1_Y128= -11.87272101 -364 -176.4813846 -X128_Y1= 174.4118357 -364 -18.96902942 -X128_Y128= 123.419621 -364 16.73610377 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -212.1865178 -364 -39.11949372 -X1_Y128= -176.4813846 -364 11.87272102 -X128_Y1= -18.96902945 -364 -174.4118358 -X128_Y128= 16.73610374 -364 -123.419621 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis -X1_Y1= -39.11949373 -364 212.1865178 -X1_Y128= 11.87272101 -364 176.4813846 -X128_Y1= -174.4118357 -364 18.96902942 -X128_Y128= -123.419621 -364 -16.73610377 -VIS=all -%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/ParisAll_208.detector b/Inputs/DetectorConfiguration/ParisAll_208.detector deleted file mode 100644 index 07ea870f2565093d243088375a6c3985825726d4..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/ParisAll_208.detector +++ /dev/null @@ -1,792 +0,0 @@ -%Fichier de configuration manip E225 -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and R given in mm -%%Angle given in degree -%%Option: 0,1 for Si SiLi and CsI -%%Option: all or sensible for VISualisation -%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 -%Thickness in micrometer -%Radius in mm -%Temperature in K, Pressure in bar -%Material name according to the target library - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 - NBLAYERS= 50 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Paris -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ParisCluster - X1_Y1= -84.5 -208 84.5 - X1_Y128= 84.5 -208 84.5 - X128_Y1= -84.5 -208 -84.5 - X128_Y128= 84.5 -208 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -206.8287414 -87.3276796 84.5 - X1_Y128= -87.32769537 -206.8287256 84.5 - X128_Y1= -206.8287414 -87.3276796 -84.5 - X128_Y128= -87.32769537 -206.8287256 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -208 84.50001115 84.5 - X1_Y128= -208 -84.49998885 84.5 - X128_Y1= -208 84.50001115 -84.5 - X128_Y128= -208 -84.49998885 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -87.3276796 206.8287414 84.5 - X1_Y128= -206.8287256 87.32769537 84.5 - X128_Y1= -87.3276796 206.8287414 -84.5 - X128_Y128= -206.8287256 87.32769537 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 84.50000557 208 84.5 - X1_Y128= -84.49999443 208 84.5 - X128_Y1= 84.50000557 208 -84.5 - X128_Y128= -84.49999443 208 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 206.8287335 87.32768749 84.5 - X1_Y128= 87.32768749 206.8287335 84.5 - X128_Y1= 206.8287335 87.32768749 -84.5 - X128_Y128= 87.32768749 206.8287335 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 208 -84.50002229 84.5 - X1_Y128= 208 84.49997771 84.5 - X128_Y1= 208 -84.50002229 -84.5 - X128_Y128= 208 84.49997771 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 87.32767172 -206.8287493 84.5 - X1_Y128= 206.8287177 -87.32770325 84.5 - X128_Y1= 87.32767172 -206.8287493 -84.5 - X128_Y128= 206.8287177 -87.32770325 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 84.5 84.5 -208 - X1_Y128= -84.5 84.5 -208 - X128_Y1= 84.5 -84.5 -208 - X128_Y128= -84.5 -84.5 -208 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 206.8287335 84.49998424 -87.32768749 - X1_Y128= 87.32768749 84.49998424 -206.8287335 - X128_Y1= 206.8287335 -84.50001576 -87.32768749 - X128_Y128= 87.32768749 -84.50001576 -206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 87.32768749 84.49998424 206.8287335 - X1_Y128= 206.8287335 84.49998424 87.32768749 - X128_Y1= 87.32768749 -84.50001576 206.8287335 - X128_Y128= 206.8287335 -84.50001576 87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.5 84.5 208 - X1_Y128= 84.5 84.5 208 - X128_Y1= -84.5 -84.5 208 - X128_Y128= 84.5 -84.5 208 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -206.8287335 84.50000788 87.32768749 - X1_Y128= -87.32768749 84.50000788 206.8287335 - X128_Y1= -206.8287335 -84.49999212 87.32768749 - X128_Y128= -87.32768749 -84.49999212 206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -87.32768749 84.50000788 -206.8287335 - X1_Y128= -206.8287335 84.50000788 -87.32768749 - X128_Y1= -87.32768749 -84.49999212 -206.8287335 - X128_Y128= -206.8287335 -84.49999212 -87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.49999606 87.32768749 -206.8287335 - X1_Y128= 84.50000394 87.32768749 -206.8287335 - X128_Y1= -84.49999606 206.8287335 -87.32768749 - X128_Y128= 84.50000394 206.8287335 -87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.49999606 206.8287335 87.32768749 - X1_Y128= 84.50000394 206.8287335 87.32768749 - X128_Y1= -84.49999606 87.32768749 206.8287335 - X128_Y128= 84.50000394 87.32768749 206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.50001182 -87.32768749 206.8287335 - X1_Y128= 84.49998818 -87.32768749 206.8287335 - X128_Y1= -84.50001182 -206.8287335 87.32768749 - X128_Y128= 84.49998818 -206.8287335 87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.50001182 -206.8287335 -87.32768749 - X1_Y128= 84.49998818 -206.8287335 -87.32768749 - X128_Y1= -84.50001182 -87.32768749 -206.8287335 - X128_Y128= 84.49998818 -87.32768749 -206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -128.6063166 143.3590149 -88.30123599 - X1_Y128= -151.8764696 96.81870993 -111.571389 - X128_Y1= -88.30122956 143.3590149 -128.606323 - X128_Y128= -111.5713826 96.81870993 -151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -88.30122956 143.3590149 128.606323 - X1_Y128= -111.5713826 96.81870993 151.876476 - X128_Y1= -128.6063166 143.3590149 88.30123599 - X128_Y128= -151.8764696 96.81870993 111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 128.606323 143.3590085 88.30123599 - X1_Y128= 151.876476 96.81870349 111.571389 - X128_Y1= 88.30123599 143.3590085 128.606323 - X128_Y128= 111.571389 96.81870349 151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 88.30123599 143.3590085 -128.606323 - X1_Y128= 111.571389 96.81870349 -151.876476 - X128_Y1= 128.606323 143.3590085 -88.30123599 - X128_Y128= 151.876476 96.81870349 -111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -88.30124243 -143.3590021 -128.606323 - X1_Y128= -111.5713954 -96.81869706 -151.876476 - X128_Y1= -128.6063294 -143.3590021 -88.30123599 - X128_Y128= -151.8764824 -96.81869706 -111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 128.6063101 -143.3590214 -88.30123599 - X1_Y128= 151.8764631 -96.81871636 -111.571389 - X128_Y1= 88.30122312 -143.3590214 -128.606323 - X128_Y128= 111.5713761 -96.81871636 -151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 88.30122312 -143.3590214 128.606323 - X1_Y128= 111.5713761 -96.81871636 151.876476 - X128_Y1= 128.6063101 -143.3590214 88.30123599 - X128_Y128= 151.8764631 -96.81871636 111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -128.6063294 -143.3590021 88.30123599 - X1_Y128= -151.8764824 -96.81869706 111.571389 - X128_Y1= -88.30124243 -143.3590021 128.606323 - X128_Y128= -111.5713954 -96.81869706 151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Shield -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ShieldClParis - X1_Y1= 151.375 153.75 364 - X1_Y128= 151.375 91.5 364 - X128_Y1= -84.5 153.75 364 - X128_Y128= -84.5 91.5 364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 -151.375 364 - X1_Y128= 91.49999999 -151.375 364 - X128_Y1= 153.75 84.49999999 364 - X128_Y128= 91.50000004 84.5 364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 -153.75 364 - X1_Y128= -151.375 -91.49999999 364 - X128_Y1= 84.49999997 -153.7500001 364 - X128_Y128= 84.5 -91.50000008 364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 151.375 364 - X1_Y128= -91.49999998 151.375 364 - X128_Y1= -153.7500001 -84.49999996 364 - X128_Y128= -91.50000013 -84.5 364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ShieldClParis - X1_Y1= 151.375 -148.6692007 366.104536 - X1_Y128= 151.375 -192.6865979 322.0871388 - X128_Y1= -84.5 -148.6692007 366.104536 - X128_Y128= -84.5 -192.6865979 322.0871388 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 -364.4251574 150.3485793 - X1_Y128= 91.49999999 -364.4251574 150.3485793 - X128_Y1= 153.75 -197.6363454 317.1373914 - X128_Y128= 91.50000004 -197.6363453 317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 -366.104536 148.6692008 - X1_Y128= -151.375 -322.0871388 192.6865979 - X128_Y1= 84.49999997 -366.104536 148.6692007 - X128_Y128= 84.5 -322.0871389 192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 -150.3485793 364.4251574 - X1_Y128= -91.49999998 -150.3485793 364.4251574 - X128_Y1= -153.7500001 -317.1373913 197.6363454 - X128_Y128= -91.50000013 -317.1373914 197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -ShieldClParis - X1_Y1= 151.375 -364 153.75 - X1_Y128= 151.375 -364 91.5 - X128_Y1= -84.5 -364 153.75 - X128_Y128= -84.5 -364 91.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 -364 -151.375 - X1_Y128= 91.49999999 -364 -151.375 - X128_Y1= 153.75 -364 84.49999999 - X128_Y128= 91.50000004 -364 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 -364 -153.75 - X1_Y128= -151.375 -364 -91.49999999 - X128_Y1= 84.49999997 -364 -153.7500001 - X128_Y128= 84.5 -364 -91.50000008 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 -364 151.375 - X1_Y128= -91.49999998 -364 151.375 - X128_Y1= -153.7500001 -364 -84.49999996 - X128_Y128= -91.50000013 -364 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -ShieldClParis - X1_Y1= 151.375 -366.104536 -148.6692007 - X1_Y128= 151.375 -322.0871388 -192.6865979 - X128_Y1= -84.5 -366.104536 -148.6692007 - X128_Y128= -84.5 -322.0871388 -192.6865979 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 -150.3485793 -364.4251574 - X1_Y128= 91.49999999 -150.3485793 -364.4251574 - X128_Y1= 153.75 -317.1373914 -197.6363454 - X128_Y128= 91.50000004 -317.1373914 -197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 -148.6692008 -366.104536 - X1_Y128= -151.375 -192.6865979 -322.0871388 - X128_Y1= 84.49999997 -148.6692007 -366.104536 - X128_Y128= 84.5 -192.6865978 -322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 -364.4251574 -150.3485793 - X1_Y128= -91.49999998 -364.4251574 -150.3485793 - X128_Y1= -153.7500001 -197.6363454 -317.1373913 - X128_Y128= -91.50000013 -197.6363453 -317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -ShieldClParis - X1_Y1= 151.375 -153.75 -364 - X1_Y128= 151.375 -91.5 -364 - X128_Y1= -84.5 -153.75 -364 - X128_Y128= -84.5 -91.5 -364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 151.375 -364 - X1_Y128= 91.49999999 151.375 -364 - X128_Y1= 153.75 -84.49999999 -364 - X128_Y128= 91.50000004 -84.5 -364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 153.75 -364 - X1_Y128= -151.375 91.49999999 -364 - X128_Y1= 84.49999997 153.7500001 -364 - X128_Y128= 84.5 91.50000008 -364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 -151.375 -364 - X1_Y128= -91.49999998 -151.375 -364 - X128_Y1= -153.7500001 84.49999996 -364 - X128_Y128= -91.50000013 84.5 -364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -ShieldClParis - X1_Y1= 151.375 148.6692007 -366.104536 - X1_Y128= 151.375 192.6865979 -322.0871388 - X128_Y1= -84.5 148.6692007 -366.104536 - X128_Y128= -84.5 192.6865979 -322.0871388 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 364.4251574 -150.3485793 - X1_Y128= 91.49999999 364.4251574 -150.3485793 - X128_Y1= 153.75 197.6363454 -317.1373914 - X128_Y128= 91.50000004 197.6363453 -317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 366.104536 -148.6692008 - X1_Y128= -151.375 322.0871388 -192.6865979 - X128_Y1= 84.49999997 366.104536 -148.6692007 - X128_Y128= 84.5 322.0871389 -192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 150.3485793 -364.4251574 - X1_Y128= -91.49999998 150.3485793 -364.4251574 - X128_Y1= -153.7500001 317.1373913 -197.6363454 - X128_Y128= -91.50000013 317.1373914 -197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -ShieldClParis - X1_Y1= 151.375 364 -153.75 - X1_Y128= 151.375 364 -91.5 - X128_Y1= -84.5 364 -153.75 - X128_Y128= -84.5 364 -91.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 364 151.375 - X1_Y128= 91.49999999 364 151.375 - X128_Y1= 153.75 364 -84.49999999 - X128_Y128= 91.50000004 364 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 364 153.75 - X1_Y128= -151.375 364 91.49999999 - X128_Y1= 84.49999997 364 153.7500001 - X128_Y128= 84.5 364 91.50000008 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 364 -151.375 - X1_Y128= -91.49999998 364 -151.375 - X128_Y1= -153.7500001 364 84.49999996 - X128_Y128= -91.50000013 364 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -ShieldClParis - X1_Y1= 151.375 366.104536 148.6692007 - X1_Y128= 151.375 322.0871388 192.6865979 - X128_Y1= -84.5 366.104536 148.6692007 - X128_Y128= -84.5 322.0871388 192.6865979 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 150.3485793 364.4251574 - X1_Y128= 91.49999999 150.3485793 364.4251574 - X128_Y1= 153.75 317.1373914 197.6363454 - X128_Y128= 91.50000004 317.1373914 197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 148.6692008 366.104536 - X1_Y128= -151.375 192.6865979 322.0871388 - X128_Y1= 84.49999997 148.6692007 366.104536 - X128_Y128= 84.5 192.6865978 322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 364.4251574 150.3485793 - X1_Y128= -91.49999998 364.4251574 150.3485793 - X128_Y1= -153.7500001 197.6363454 317.1373913 - X128_Y128= -91.50000013 197.6363453 317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -ShieldClParis - X1_Y1= -150.3485793 153.75 364.4251574 - X1_Y128= -150.3485793 91.5 364.4251574 - X128_Y1= -317.1373914 153.75 197.6363453 - X128_Y128= -317.1373914 91.5 197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -148.6692007 -151.375 366.104536 - X1_Y128= -192.6865979 -151.375 322.0871388 - X128_Y1= -148.6692007 84.49999999 366.104536 - X128_Y128= -192.6865978 84.5 322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364.4251574 -153.75 150.3485793 - X1_Y128= -364.4251574 -91.49999999 150.3485793 - X128_Y1= -197.6363454 -153.7500001 317.1373913 - X128_Y128= -197.6363453 -91.50000008 317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -366.1045359 151.375 148.6692008 - X1_Y128= -322.0871388 151.375 192.6865979 - X128_Y1= -366.104536 -84.49999996 148.6692007 - X128_Y128= -322.0871389 -84.5 192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 -ShieldClParis - X1_Y1= -364 153.75 151.375 - X1_Y128= -364 91.5 151.375 - X128_Y1= -364 153.75 -84.5 - X128_Y128= -364 91.5 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364 -151.375 153.75 - X1_Y128= -364 -151.375 91.49999999 - X128_Y1= -364 84.49999999 153.75 - X128_Y128= -364 84.5 91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364 -153.75 -151.375 - X1_Y128= -364 -91.49999999 -151.375 - X128_Y1= -364 -153.7500001 84.49999997 - X128_Y128= -364 -91.50000008 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364 151.375 -153.75 - X1_Y128= -364 151.375 -91.49999998 - X128_Y1= -364 -84.49999996 -153.7500001 - X128_Y128= -364 -84.5 -91.50000013 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 -ShieldClParis - X1_Y1= -364.4251574 153.75 -150.3485793 - X1_Y128= -364.4251574 91.5 -150.3485793 - X128_Y1= -197.6363453 153.75 -317.1373914 - X128_Y128= -197.6363453 91.5 -317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -366.104536 -151.375 -148.6692007 - X1_Y128= -322.0871388 -151.375 -192.6865979 - X128_Y1= -366.104536 84.49999999 -148.6692007 - X128_Y128= -322.0871389 84.5 -192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -150.3485793 -153.75 -364.4251574 - X1_Y128= -150.3485793 -91.49999999 -364.4251574 - X128_Y1= -317.1373913 -153.7500001 -197.6363454 - X128_Y128= -317.1373914 -91.50000008 -197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -148.6692008 151.375 -366.1045359 - X1_Y128= -192.6865979 151.375 -322.0871388 - X128_Y1= -148.6692007 -84.49999996 -366.104536 - X128_Y128= -192.6865978 -84.5 -322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 -ShieldClParis - X1_Y1= 150.3485793 153.75 -364.4251574 - X1_Y128= 150.3485793 91.5 -364.4251574 - X128_Y1= 317.1373914 153.75 -197.6363453 - X128_Y128= 317.1373914 91.5 -197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 148.6692007 -151.375 -366.104536 - X1_Y128= 192.6865979 -151.375 -322.0871388 - X128_Y1= 148.6692007 84.49999999 -366.104536 - X128_Y128= 192.6865978 84.5 -322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364.4251574 -153.75 -150.3485793 - X1_Y128= 364.4251574 -91.49999999 -150.3485793 - X128_Y1= 197.6363454 -153.7500001 -317.1373913 - X128_Y128= 197.6363453 -91.50000008 -317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 366.1045359 151.375 -148.6692008 - X1_Y128= 322.0871388 151.375 -192.6865979 - X128_Y1= 366.104536 -84.49999996 -148.6692007 - X128_Y128= 322.0871389 -84.5 -192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 -ShieldClParis - X1_Y1= 364 153.75 -151.375 - X1_Y128= 364 91.5 -151.375 - X128_Y1= 364 153.75 84.5 - X128_Y128= 364 91.5 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364 -151.375 -153.75 - X1_Y128= 364 -151.375 -91.49999999 - X128_Y1= 364 84.49999999 -153.75 - X128_Y128= 364 84.5 -91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364 -153.75 151.375 - X1_Y128= 364 -91.49999999 151.375 - X128_Y1= 364 -153.7500001 -84.49999997 - X128_Y128= 364 -91.50000008 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364 151.375 153.75 - X1_Y128= 364 151.375 91.49999998 - X128_Y1= 364 -84.49999996 153.7500001 - X128_Y128= 364 -84.5 91.50000013 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 -ShieldClParis - X1_Y1= 364.4251574 153.75 150.3485793 - X1_Y128= 364.4251574 91.5 150.3485793 - X128_Y1= 197.6363453 153.75 317.1373914 - X128_Y128= 197.6363453 91.5 317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 366.104536 -151.375 148.6692007 - X1_Y128= 322.0871388 -151.375 192.6865979 - X128_Y1= 366.104536 84.49999999 148.6692007 - X128_Y128= 322.0871389 84.5 192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 150.3485793 -153.75 364.4251574 - X1_Y128= 150.3485793 -91.49999999 364.4251574 - X128_Y1= 317.1373913 -153.7500001 197.6363454 - X128_Y128= 317.1373914 -91.50000008 197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 148.6692008 151.375 366.1045359 - X1_Y128= 192.6865979 151.375 322.0871388 - X128_Y1= 148.6692007 -84.49999996 366.104536 - X128_Y128= 192.6865978 -84.5 322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 -ShieldClParis - X1_Y1= -366.104536 -148.6692007 151.375 - X1_Y128= -322.0871388 -192.6865979 151.375 - X128_Y1= -366.104536 -148.6692007 -84.5 - X128_Y128= -322.0871388 -192.6865979 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -150.3485793 -364.4251574 153.75 - X1_Y128= -150.3485793 -364.4251574 91.49999999 - X128_Y1= -317.1373914 -197.6363454 153.75 - X128_Y128= -317.1373914 -197.6363453 91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -148.6692008 -366.104536 -151.375 - X1_Y128= -192.6865979 -322.0871388 -151.375 - X128_Y1= -148.6692007 -366.104536 84.49999997 - X128_Y128= -192.6865978 -322.0871389 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364.4251574 -150.3485793 -153.75 - X1_Y128= -364.4251574 -150.3485793 -91.49999998 - X128_Y1= -197.6363454 -317.1373913 -153.7500001 - X128_Y128= -197.6363453 -317.1373914 -91.50000013 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 -ShieldClParis - X1_Y1= 366.104536 -148.6692007 -151.375 - X1_Y128= 322.0871388 -192.6865979 -151.375 - X128_Y1= 366.104536 -148.6692007 84.5 - X128_Y128= 322.0871388 -192.6865979 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 150.3485793 -364.4251574 -153.75 - X1_Y128= 150.3485793 -364.4251574 -91.49999999 - X128_Y1= 317.1373914 -197.6363454 -153.75 - X128_Y128= 317.1373914 -197.6363453 -91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 148.6692008 -366.104536 151.375 - X1_Y128= 192.6865979 -322.0871388 151.375 - X128_Y1= 148.6692007 -366.104536 -84.49999997 - X128_Y128= 192.6865978 -322.0871389 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364.4251574 -150.3485793 153.75 - X1_Y128= 364.4251574 -150.3485793 91.49999998 - X128_Y1= 197.6363454 -317.1373913 153.7500001 - X128_Y128= 197.6363453 -317.1373914 91.50000013 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 -ShieldClParis - X1_Y1= -148.6692007 366.104536 151.375 - X1_Y128= -192.6865979 322.0871388 151.375 - X128_Y1= -148.6692007 366.104536 -84.5 - X128_Y128= -192.6865979 322.0871388 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364.4251574 150.3485793 153.75 - X1_Y128= -364.4251574 150.3485793 91.49999999 - X128_Y1= -197.6363454 317.1373914 153.75 - X128_Y128= -197.6363453 317.1373914 91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -366.104536 148.6692008 -151.375 - X1_Y128= -322.0871388 192.6865979 -151.375 - X128_Y1= -366.104536 148.6692007 84.49999997 - X128_Y128= -322.0871389 192.6865978 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -150.3485793 364.4251574 -153.75 - X1_Y128= -150.3485793 364.4251574 -91.49999998 - X128_Y1= -317.1373913 197.6363454 -153.7500001 - X128_Y128= -317.1373914 197.6363453 -91.50000013 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 -ShieldClParis - X1_Y1= 148.6692007 366.104536 -151.375 - X1_Y128= 192.6865979 322.0871388 -151.375 - X128_Y1= 148.6692007 366.104536 84.5 - X128_Y128= 192.6865979 322.0871388 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364.4251574 150.3485793 -153.75 - X1_Y128= 364.4251574 150.3485793 -91.49999999 - X128_Y1= 197.6363454 317.1373914 -153.75 - X128_Y128= 197.6363453 317.1373914 -91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 366.104536 148.6692008 151.375 - X1_Y128= 322.0871388 192.6865979 151.375 - X128_Y1= 366.104536 148.6692007 -84.49999997 - X128_Y128= 322.0871389 192.6865978 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 150.3485793 364.4251574 153.75 - X1_Y128= 150.3485793 364.4251574 91.49999998 - X128_Y1= 317.1373913 197.6363454 153.7500001 - X128_Y128= 317.1373914 197.6363453 91.50000013 - VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ShieldPhParis - THETA= 54.73 - PHI= 45.02 - R= 248 - BETA= 0 0 -30 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ShieldPhParis - THETA= 54.73 - PHI= 134.98 - R= 248 - BETA= 0 0 210 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -ShieldPhParis - THETA= 54.73 - PHI= 225 - R= 248 - BETA= 0 0 -30 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -ShieldPhParis - THETA= 54.73 - PHI= 315 - R= 248 - BETA= 0 0 210 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -ShieldPhParis - THETA= 125.26 - PHI= 45.02 - R= 248 - BETA= 0 0 30 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -ShieldPhParis - THETA= 125.26 - PHI= 134.98 - R= 248 - BETA= 0 0 -210 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -ShieldPhParis - THETA= 125.26 - PHI= 225 - R= 248 - BETA= 0 0 30 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -ShieldPhParis - THETA= 125.26 - PHI= 315 - R= 248 - BETA= 0 0 -210 - VIS= all diff --git a/Inputs/DetectorConfiguration/ParisAll_208pipe1.detector b/Inputs/DetectorConfiguration/ParisAll_208pipe1.detector deleted file mode 100644 index 9ffb23e04771d73c59b6005def959b109ede4371..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/ParisAll_208pipe1.detector +++ /dev/null @@ -1,792 +0,0 @@ -%Fichier de configuration manip E225 -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and R given in mm -%%Angle given in degree -%%Option: 0,1 for Si SiLi and CsI -%%Option: all or sensible for VISualisation -%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 -%Thickness in micrometer -%Radius in mm -%Temperature in K, Pressure in bar -%Material name according to the target library - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 - NBLAYERS= 50 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Paris -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ParisCluster - X1_Y1= -84.5 -208 84.5 - X1_Y128= 84.5 -208 84.5 - X128_Y1= -84.5 -208 -84.5 - X128_Y128= 84.5 -208 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -206.8287414 -87.3276796 84.5 - X1_Y128= -87.32769537 -206.8287256 84.5 - X128_Y1= -206.8287414 -87.3276796 -84.5 - X128_Y128= -87.32769537 -206.8287256 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -208 84.50001115 84.5 - X1_Y128= -208 -84.49998885 84.5 - X128_Y1= -208 84.50001115 -84.5 - X128_Y128= -208 -84.49998885 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -87.3276796 206.8287414 84.5 - X1_Y128= -206.8287256 87.32769537 84.5 - X128_Y1= -87.3276796 206.8287414 -84.5 - X128_Y128= -206.8287256 87.32769537 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 84.50000557 208 84.5 - X1_Y128= -84.49999443 208 84.5 - X128_Y1= 84.50000557 208 -84.5 - X128_Y128= -84.49999443 208 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 206.8287335 87.32768749 84.5 - X1_Y128= 87.32768749 206.8287335 84.5 - X128_Y1= 206.8287335 87.32768749 -84.5 - X128_Y128= 87.32768749 206.8287335 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 208 -84.50002229 84.5 - X1_Y128= 208 84.49997771 84.5 - X128_Y1= 208 -84.50002229 -84.5 - X128_Y128= 208 84.49997771 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 87.32767172 -206.8287493 84.5 - X1_Y128= 206.8287177 -87.32770325 84.5 - X128_Y1= 87.32767172 -206.8287493 -84.5 - X128_Y128= 206.8287177 -87.32770325 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParisCluster -% X1_Y1= 84.5 84.5 -208 -% X1_Y128= -84.5 84.5 -208 -% X128_Y1= 84.5 -84.5 -208 -% X128_Y128= -84.5 -84.5 -208 -% VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 206.8287335 84.49998424 -87.32768749 - X1_Y128= 87.32768749 84.49998424 -206.8287335 - X128_Y1= 206.8287335 -84.50001576 -87.32768749 - X128_Y128= 87.32768749 -84.50001576 -206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 87.32768749 84.49998424 206.8287335 - X1_Y128= 206.8287335 84.49998424 87.32768749 - X128_Y1= 87.32768749 -84.50001576 206.8287335 - X128_Y128= 206.8287335 -84.50001576 87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParisCluster -% X1_Y1= -84.5 84.5 208 -% X1_Y128= 84.5 84.5 208 -% X128_Y1= -84.5 -84.5 208 -% X128_Y128= 84.5 -84.5 208 -% VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -206.8287335 84.50000788 87.32768749 - X1_Y128= -87.32768749 84.50000788 206.8287335 - X128_Y1= -206.8287335 -84.49999212 87.32768749 - X128_Y128= -87.32768749 -84.49999212 206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -87.32768749 84.50000788 -206.8287335 - X1_Y128= -206.8287335 84.50000788 -87.32768749 - X128_Y1= -87.32768749 -84.49999212 -206.8287335 - X128_Y128= -206.8287335 -84.49999212 -87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.49999606 87.32768749 -206.8287335 - X1_Y128= 84.50000394 87.32768749 -206.8287335 - X128_Y1= -84.49999606 206.8287335 -87.32768749 - X128_Y128= 84.50000394 206.8287335 -87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.49999606 206.8287335 87.32768749 - X1_Y128= 84.50000394 206.8287335 87.32768749 - X128_Y1= -84.49999606 87.32768749 206.8287335 - X128_Y128= 84.50000394 87.32768749 206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.50001182 -87.32768749 206.8287335 - X1_Y128= 84.49998818 -87.32768749 206.8287335 - X128_Y1= -84.50001182 -206.8287335 87.32768749 - X128_Y128= 84.49998818 -206.8287335 87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.50001182 -206.8287335 -87.32768749 - X1_Y128= 84.49998818 -206.8287335 -87.32768749 - X128_Y1= -84.50001182 -87.32768749 -206.8287335 - X128_Y128= 84.49998818 -87.32768749 -206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -128.6063166 143.3590149 -88.30123599 - X1_Y128= -151.8764696 96.81870993 -111.571389 - X128_Y1= -88.30122956 143.3590149 -128.606323 - X128_Y128= -111.5713826 96.81870993 -151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -88.30122956 143.3590149 128.606323 - X1_Y128= -111.5713826 96.81870993 151.876476 - X128_Y1= -128.6063166 143.3590149 88.30123599 - X128_Y128= -151.8764696 96.81870993 111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 128.606323 143.3590085 88.30123599 - X1_Y128= 151.876476 96.81870349 111.571389 - X128_Y1= 88.30123599 143.3590085 128.606323 - X128_Y128= 111.571389 96.81870349 151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 88.30123599 143.3590085 -128.606323 - X1_Y128= 111.571389 96.81870349 -151.876476 - X128_Y1= 128.606323 143.3590085 -88.30123599 - X128_Y128= 151.876476 96.81870349 -111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -88.30124243 -143.3590021 -128.606323 - X1_Y128= -111.5713954 -96.81869706 -151.876476 - X128_Y1= -128.6063294 -143.3590021 -88.30123599 - X128_Y128= -151.8764824 -96.81869706 -111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 128.6063101 -143.3590214 -88.30123599 - X1_Y128= 151.8764631 -96.81871636 -111.571389 - X128_Y1= 88.30122312 -143.3590214 -128.606323 - X128_Y128= 111.5713761 -96.81871636 -151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 88.30122312 -143.3590214 128.606323 - X1_Y128= 111.5713761 -96.81871636 151.876476 - X128_Y1= 128.6063101 -143.3590214 88.30123599 - X128_Y128= 151.8764631 -96.81871636 111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -128.6063294 -143.3590021 88.30123599 - X1_Y128= -151.8764824 -96.81869706 111.571389 - X128_Y1= -88.30124243 -143.3590021 128.606323 - X128_Y128= -111.5713954 -96.81869706 151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Shield -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ShieldClParis - X1_Y1= 151.375 153.75 364 - X1_Y128= 151.375 91.5 364 - X128_Y1= -84.5 153.75 364 - X128_Y128= -84.5 91.5 364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 -151.375 364 - X1_Y128= 91.49999999 -151.375 364 - X128_Y1= 153.75 84.49999999 364 - X128_Y128= 91.50000004 84.5 364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 -153.75 364 - X1_Y128= -151.375 -91.49999999 364 - X128_Y1= 84.49999997 -153.7500001 364 - X128_Y128= 84.5 -91.50000008 364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 151.375 364 - X1_Y128= -91.49999998 151.375 364 - X128_Y1= -153.7500001 -84.49999996 364 - X128_Y128= -91.50000013 -84.5 364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ShieldClParis - X1_Y1= 151.375 -148.6692007 366.104536 - X1_Y128= 151.375 -192.6865979 322.0871388 - X128_Y1= -84.5 -148.6692007 366.104536 - X128_Y128= -84.5 -192.6865979 322.0871388 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 -364.4251574 150.3485793 - X1_Y128= 91.49999999 -364.4251574 150.3485793 - X128_Y1= 153.75 -197.6363454 317.1373914 - X128_Y128= 91.50000004 -197.6363453 317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 -366.104536 148.6692008 - X1_Y128= -151.375 -322.0871388 192.6865979 - X128_Y1= 84.49999997 -366.104536 148.6692007 - X128_Y128= 84.5 -322.0871389 192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 -150.3485793 364.4251574 - X1_Y128= -91.49999998 -150.3485793 364.4251574 - X128_Y1= -153.7500001 -317.1373913 197.6363454 - X128_Y128= -91.50000013 -317.1373914 197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -ShieldClParis - X1_Y1= 151.375 -364 153.75 - X1_Y128= 151.375 -364 91.5 - X128_Y1= -84.5 -364 153.75 - X128_Y128= -84.5 -364 91.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 -364 -151.375 - X1_Y128= 91.49999999 -364 -151.375 - X128_Y1= 153.75 -364 84.49999999 - X128_Y128= 91.50000004 -364 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 -364 -153.75 - X1_Y128= -151.375 -364 -91.49999999 - X128_Y1= 84.49999997 -364 -153.7500001 - X128_Y128= 84.5 -364 -91.50000008 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 -364 151.375 - X1_Y128= -91.49999998 -364 151.375 - X128_Y1= -153.7500001 -364 -84.49999996 - X128_Y128= -91.50000013 -364 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -ShieldClParis - X1_Y1= 151.375 -366.104536 -148.6692007 - X1_Y128= 151.375 -322.0871388 -192.6865979 - X128_Y1= -84.5 -366.104536 -148.6692007 - X128_Y128= -84.5 -322.0871388 -192.6865979 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 -150.3485793 -364.4251574 - X1_Y128= 91.49999999 -150.3485793 -364.4251574 - X128_Y1= 153.75 -317.1373914 -197.6363454 - X128_Y128= 91.50000004 -317.1373914 -197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 -148.6692008 -366.104536 - X1_Y128= -151.375 -192.6865979 -322.0871388 - X128_Y1= 84.49999997 -148.6692007 -366.104536 - X128_Y128= 84.5 -192.6865978 -322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 -364.4251574 -150.3485793 - X1_Y128= -91.49999998 -364.4251574 -150.3485793 - X128_Y1= -153.7500001 -197.6363454 -317.1373913 - X128_Y128= -91.50000013 -197.6363453 -317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -ShieldClParis - X1_Y1= 151.375 -153.75 -364 - X1_Y128= 151.375 -91.5 -364 - X128_Y1= -84.5 -153.75 -364 - X128_Y128= -84.5 -91.5 -364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 151.375 -364 - X1_Y128= 91.49999999 151.375 -364 - X128_Y1= 153.75 -84.49999999 -364 - X128_Y128= 91.50000004 -84.5 -364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 153.75 -364 - X1_Y128= -151.375 91.49999999 -364 - X128_Y1= 84.49999997 153.7500001 -364 - X128_Y128= 84.5 91.50000008 -364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 -151.375 -364 - X1_Y128= -91.49999998 -151.375 -364 - X128_Y1= -153.7500001 84.49999996 -364 - X128_Y128= -91.50000013 84.5 -364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -ShieldClParis - X1_Y1= 151.375 148.6692007 -366.104536 - X1_Y128= 151.375 192.6865979 -322.0871388 - X128_Y1= -84.5 148.6692007 -366.104536 - X128_Y128= -84.5 192.6865979 -322.0871388 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 364.4251574 -150.3485793 - X1_Y128= 91.49999999 364.4251574 -150.3485793 - X128_Y1= 153.75 197.6363454 -317.1373914 - X128_Y128= 91.50000004 197.6363453 -317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 366.104536 -148.6692008 - X1_Y128= -151.375 322.0871388 -192.6865979 - X128_Y1= 84.49999997 366.104536 -148.6692007 - X128_Y128= 84.5 322.0871389 -192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 150.3485793 -364.4251574 - X1_Y128= -91.49999998 150.3485793 -364.4251574 - X128_Y1= -153.7500001 317.1373913 -197.6363454 - X128_Y128= -91.50000013 317.1373914 -197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -ShieldClParis - X1_Y1= 151.375 364 -153.75 - X1_Y128= 151.375 364 -91.5 - X128_Y1= -84.5 364 -153.75 - X128_Y128= -84.5 364 -91.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 364 151.375 - X1_Y128= 91.49999999 364 151.375 - X128_Y1= 153.75 364 -84.49999999 - X128_Y128= 91.50000004 364 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 364 153.75 - X1_Y128= -151.375 364 91.49999999 - X128_Y1= 84.49999997 364 153.7500001 - X128_Y128= 84.5 364 91.50000008 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 364 -151.375 - X1_Y128= -91.49999998 364 -151.375 - X128_Y1= -153.7500001 364 84.49999996 - X128_Y128= -91.50000013 364 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -ShieldClParis - X1_Y1= 151.375 366.104536 148.6692007 - X1_Y128= 151.375 322.0871388 192.6865979 - X128_Y1= -84.5 366.104536 148.6692007 - X128_Y128= -84.5 322.0871388 192.6865979 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 150.3485793 364.4251574 - X1_Y128= 91.49999999 150.3485793 364.4251574 - X128_Y1= 153.75 317.1373914 197.6363454 - X128_Y128= 91.50000004 317.1373914 197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 148.6692008 366.104536 - X1_Y128= -151.375 192.6865979 322.0871388 - X128_Y1= 84.49999997 148.6692007 366.104536 - X128_Y128= 84.5 192.6865978 322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 364.4251574 150.3485793 - X1_Y128= -91.49999998 364.4251574 150.3485793 - X128_Y1= -153.7500001 197.6363454 317.1373913 - X128_Y128= -91.50000013 197.6363453 317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -ShieldClParis - X1_Y1= -150.3485793 153.75 364.4251574 - X1_Y128= -150.3485793 91.5 364.4251574 - X128_Y1= -317.1373914 153.75 197.6363453 - X128_Y128= -317.1373914 91.5 197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -148.6692007 -151.375 366.104536 - X1_Y128= -192.6865979 -151.375 322.0871388 - X128_Y1= -148.6692007 84.49999999 366.104536 - X128_Y128= -192.6865978 84.5 322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364.4251574 -153.75 150.3485793 - X1_Y128= -364.4251574 -91.49999999 150.3485793 - X128_Y1= -197.6363454 -153.7500001 317.1373913 - X128_Y128= -197.6363453 -91.50000008 317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -366.1045359 151.375 148.6692008 - X1_Y128= -322.0871388 151.375 192.6865979 - X128_Y1= -366.104536 -84.49999996 148.6692007 - X128_Y128= -322.0871389 -84.5 192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 -ShieldClParis - X1_Y1= -364 153.75 151.375 - X1_Y128= -364 91.5 151.375 - X128_Y1= -364 153.75 -84.5 - X128_Y128= -364 91.5 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364 -151.375 153.75 - X1_Y128= -364 -151.375 91.49999999 - X128_Y1= -364 84.49999999 153.75 - X128_Y128= -364 84.5 91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364 -153.75 -151.375 - X1_Y128= -364 -91.49999999 -151.375 - X128_Y1= -364 -153.7500001 84.49999997 - X128_Y128= -364 -91.50000008 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364 151.375 -153.75 - X1_Y128= -364 151.375 -91.49999998 - X128_Y1= -364 -84.49999996 -153.7500001 - X128_Y128= -364 -84.5 -91.50000013 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 -ShieldClParis - X1_Y1= -364.4251574 153.75 -150.3485793 - X1_Y128= -364.4251574 91.5 -150.3485793 - X128_Y1= -197.6363453 153.75 -317.1373914 - X128_Y128= -197.6363453 91.5 -317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -366.104536 -151.375 -148.6692007 - X1_Y128= -322.0871388 -151.375 -192.6865979 - X128_Y1= -366.104536 84.49999999 -148.6692007 - X128_Y128= -322.0871389 84.5 -192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -150.3485793 -153.75 -364.4251574 - X1_Y128= -150.3485793 -91.49999999 -364.4251574 - X128_Y1= -317.1373913 -153.7500001 -197.6363454 - X128_Y128= -317.1373914 -91.50000008 -197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -148.6692008 151.375 -366.1045359 - X1_Y128= -192.6865979 151.375 -322.0871388 - X128_Y1= -148.6692007 -84.49999996 -366.104536 - X128_Y128= -192.6865978 -84.5 -322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 -ShieldClParis - X1_Y1= 150.3485793 153.75 -364.4251574 - X1_Y128= 150.3485793 91.5 -364.4251574 - X128_Y1= 317.1373914 153.75 -197.6363453 - X128_Y128= 317.1373914 91.5 -197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 148.6692007 -151.375 -366.104536 - X1_Y128= 192.6865979 -151.375 -322.0871388 - X128_Y1= 148.6692007 84.49999999 -366.104536 - X128_Y128= 192.6865978 84.5 -322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364.4251574 -153.75 -150.3485793 - X1_Y128= 364.4251574 -91.49999999 -150.3485793 - X128_Y1= 197.6363454 -153.7500001 -317.1373913 - X128_Y128= 197.6363453 -91.50000008 -317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 366.1045359 151.375 -148.6692008 - X1_Y128= 322.0871388 151.375 -192.6865979 - X128_Y1= 366.104536 -84.49999996 -148.6692007 - X128_Y128= 322.0871389 -84.5 -192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 -ShieldClParis - X1_Y1= 364 153.75 -151.375 - X1_Y128= 364 91.5 -151.375 - X128_Y1= 364 153.75 84.5 - X128_Y128= 364 91.5 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364 -151.375 -153.75 - X1_Y128= 364 -151.375 -91.49999999 - X128_Y1= 364 84.49999999 -153.75 - X128_Y128= 364 84.5 -91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364 -153.75 151.375 - X1_Y128= 364 -91.49999999 151.375 - X128_Y1= 364 -153.7500001 -84.49999997 - X128_Y128= 364 -91.50000008 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364 151.375 153.75 - X1_Y128= 364 151.375 91.49999998 - X128_Y1= 364 -84.49999996 153.7500001 - X128_Y128= 364 -84.5 91.50000013 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 -ShieldClParis - X1_Y1= 364.4251574 153.75 150.3485793 - X1_Y128= 364.4251574 91.5 150.3485793 - X128_Y1= 197.6363453 153.75 317.1373914 - X128_Y128= 197.6363453 91.5 317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 366.104536 -151.375 148.6692007 - X1_Y128= 322.0871388 -151.375 192.6865979 - X128_Y1= 366.104536 84.49999999 148.6692007 - X128_Y128= 322.0871389 84.5 192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 150.3485793 -153.75 364.4251574 - X1_Y128= 150.3485793 -91.49999999 364.4251574 - X128_Y1= 317.1373913 -153.7500001 197.6363454 - X128_Y128= 317.1373914 -91.50000008 197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 148.6692008 151.375 366.1045359 - X1_Y128= 192.6865979 151.375 322.0871388 - X128_Y1= 148.6692007 -84.49999996 366.104536 - X128_Y128= 192.6865978 -84.5 322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 -ShieldClParis - X1_Y1= -366.104536 -148.6692007 151.375 - X1_Y128= -322.0871388 -192.6865979 151.375 - X128_Y1= -366.104536 -148.6692007 -84.5 - X128_Y128= -322.0871388 -192.6865979 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -150.3485793 -364.4251574 153.75 - X1_Y128= -150.3485793 -364.4251574 91.49999999 - X128_Y1= -317.1373914 -197.6363454 153.75 - X128_Y128= -317.1373914 -197.6363453 91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -148.6692008 -366.104536 -151.375 - X1_Y128= -192.6865979 -322.0871388 -151.375 - X128_Y1= -148.6692007 -366.104536 84.49999997 - X128_Y128= -192.6865978 -322.0871389 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364.4251574 -150.3485793 -153.75 - X1_Y128= -364.4251574 -150.3485793 -91.49999998 - X128_Y1= -197.6363454 -317.1373913 -153.7500001 - X128_Y128= -197.6363453 -317.1373914 -91.50000013 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 -ShieldClParis - X1_Y1= 366.104536 -148.6692007 -151.375 - X1_Y128= 322.0871388 -192.6865979 -151.375 - X128_Y1= 366.104536 -148.6692007 84.5 - X128_Y128= 322.0871388 -192.6865979 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 150.3485793 -364.4251574 -153.75 - X1_Y128= 150.3485793 -364.4251574 -91.49999999 - X128_Y1= 317.1373914 -197.6363454 -153.75 - X128_Y128= 317.1373914 -197.6363453 -91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 148.6692008 -366.104536 151.375 - X1_Y128= 192.6865979 -322.0871388 151.375 - X128_Y1= 148.6692007 -366.104536 -84.49999997 - X128_Y128= 192.6865978 -322.0871389 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364.4251574 -150.3485793 153.75 - X1_Y128= 364.4251574 -150.3485793 91.49999998 - X128_Y1= 197.6363454 -317.1373913 153.7500001 - X128_Y128= 197.6363453 -317.1373914 91.50000013 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 -ShieldClParis - X1_Y1= -148.6692007 366.104536 151.375 - X1_Y128= -192.6865979 322.0871388 151.375 - X128_Y1= -148.6692007 366.104536 -84.5 - X128_Y128= -192.6865979 322.0871388 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364.4251574 150.3485793 153.75 - X1_Y128= -364.4251574 150.3485793 91.49999999 - X128_Y1= -197.6363454 317.1373914 153.75 - X128_Y128= -197.6363453 317.1373914 91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -366.104536 148.6692008 -151.375 - X1_Y128= -322.0871388 192.6865979 -151.375 - X128_Y1= -366.104536 148.6692007 84.49999997 - X128_Y128= -322.0871389 192.6865978 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -150.3485793 364.4251574 -153.75 - X1_Y128= -150.3485793 364.4251574 -91.49999998 - X128_Y1= -317.1373913 197.6363454 -153.7500001 - X128_Y128= -317.1373914 197.6363453 -91.50000013 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 -ShieldClParis - X1_Y1= 148.6692007 366.104536 -151.375 - X1_Y128= 192.6865979 322.0871388 -151.375 - X128_Y1= 148.6692007 366.104536 84.5 - X128_Y128= 192.6865979 322.0871388 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364.4251574 150.3485793 -153.75 - X1_Y128= 364.4251574 150.3485793 -91.49999999 - X128_Y1= 197.6363454 317.1373914 -153.75 - X128_Y128= 197.6363453 317.1373914 -91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 366.104536 148.6692008 151.375 - X1_Y128= 322.0871388 192.6865979 151.375 - X128_Y1= 366.104536 148.6692007 -84.49999997 - X128_Y128= 322.0871389 192.6865978 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 150.3485793 364.4251574 153.75 - X1_Y128= 150.3485793 364.4251574 91.49999998 - X128_Y1= 317.1373913 197.6363454 153.7500001 - X128_Y128= 317.1373914 197.6363453 91.50000013 - VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ShieldPhParis - THETA= 54.73 - PHI= 45.02 - R= 248 - BETA= 0 0 -30 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ShieldPhParis - THETA= 54.73 - PHI= 134.98 - R= 248 - BETA= 0 0 210 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -ShieldPhParis - THETA= 54.73 - PHI= 225 - R= 248 - BETA= 0 0 -30 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -ShieldPhParis - THETA= 54.73 - PHI= 315 - R= 248 - BETA= 0 0 210 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -ShieldPhParis - THETA= 125.26 - PHI= 45.02 - R= 248 - BETA= 0 0 30 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -ShieldPhParis - THETA= 125.26 - PHI= 134.98 - R= 248 - BETA= 0 0 -210 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -ShieldPhParis - THETA= 125.26 - PHI= 225 - R= 248 - BETA= 0 0 30 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -ShieldPhParis - THETA= 125.26 - PHI= 315 - R= 248 - BETA= 0 0 -210 - VIS= all diff --git a/Inputs/DetectorConfiguration/ParisAll_208pipe1noshield.detector b/Inputs/DetectorConfiguration/ParisAll_208pipe1noshield.detector deleted file mode 100644 index fbbf2f0a8ebd5b6be600c6fb16f086a96f0a490b..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/ParisAll_208pipe1noshield.detector +++ /dev/null @@ -1,212 +0,0 @@ -%Fichier de configuration manip E225 -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and R given in mm -%%Angle given in degree -%%Option: 0,1 for Si SiLi and CsI -%%Option: all or sensible for VISualisation -%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 -%Thickness in micrometer -%Radius in mm -%Temperature in K, Pressure in bar -%Material name according to the target library - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 - NBLAYERS= 50 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Paris -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ParisCluster - X1_Y1= -84.5 -208 84.5 - X1_Y128= 84.5 -208 84.5 - X128_Y1= -84.5 -208 -84.5 - X128_Y128= 84.5 -208 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -206.8287414 -87.3276796 84.5 - X1_Y128= -87.32769537 -206.8287256 84.5 - X128_Y1= -206.8287414 -87.3276796 -84.5 - X128_Y128= -87.32769537 -206.8287256 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -208 84.50001115 84.5 - X1_Y128= -208 -84.49998885 84.5 - X128_Y1= -208 84.50001115 -84.5 - X128_Y128= -208 -84.49998885 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -87.3276796 206.8287414 84.5 - X1_Y128= -206.8287256 87.32769537 84.5 - X128_Y1= -87.3276796 206.8287414 -84.5 - X128_Y128= -206.8287256 87.32769537 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 84.50000557 208 84.5 - X1_Y128= -84.49999443 208 84.5 - X128_Y1= 84.50000557 208 -84.5 - X128_Y128= -84.49999443 208 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 206.8287335 87.32768749 84.5 - X1_Y128= 87.32768749 206.8287335 84.5 - X128_Y1= 206.8287335 87.32768749 -84.5 - X128_Y128= 87.32768749 206.8287335 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 208 -84.50002229 84.5 - X1_Y128= 208 84.49997771 84.5 - X128_Y1= 208 -84.50002229 -84.5 - X128_Y128= 208 84.49997771 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 87.32767172 -206.8287493 84.5 - X1_Y128= 206.8287177 -87.32770325 84.5 - X128_Y1= 87.32767172 -206.8287493 -84.5 - X128_Y128= 206.8287177 -87.32770325 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParisCluster -% X1_Y1= 84.5 84.5 -208 -% X1_Y128= -84.5 84.5 -208 -% X128_Y1= 84.5 -84.5 -208 -% X128_Y128= -84.5 -84.5 -208 -% VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 206.8287335 84.49998424 -87.32768749 - X1_Y128= 87.32768749 84.49998424 -206.8287335 - X128_Y1= 206.8287335 -84.50001576 -87.32768749 - X128_Y128= 87.32768749 -84.50001576 -206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 87.32768749 84.49998424 206.8287335 - X1_Y128= 206.8287335 84.49998424 87.32768749 - X128_Y1= 87.32768749 -84.50001576 206.8287335 - X128_Y128= 206.8287335 -84.50001576 87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParisCluster -% X1_Y1= -84.5 84.5 208 -% X1_Y128= 84.5 84.5 208 -% X128_Y1= -84.5 -84.5 208 -% X128_Y128= 84.5 -84.5 208 -% VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -206.8287335 84.50000788 87.32768749 - X1_Y128= -87.32768749 84.50000788 206.8287335 - X128_Y1= -206.8287335 -84.49999212 87.32768749 - X128_Y128= -87.32768749 -84.49999212 206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -87.32768749 84.50000788 -206.8287335 - X1_Y128= -206.8287335 84.50000788 -87.32768749 - X128_Y1= -87.32768749 -84.49999212 -206.8287335 - X128_Y128= -206.8287335 -84.49999212 -87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.49999606 87.32768749 -206.8287335 - X1_Y128= 84.50000394 87.32768749 -206.8287335 - X128_Y1= -84.49999606 206.8287335 -87.32768749 - X128_Y128= 84.50000394 206.8287335 -87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.49999606 206.8287335 87.32768749 - X1_Y128= 84.50000394 206.8287335 87.32768749 - X128_Y1= -84.49999606 87.32768749 206.8287335 - X128_Y128= 84.50000394 87.32768749 206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.50001182 -87.32768749 206.8287335 - X1_Y128= 84.49998818 -87.32768749 206.8287335 - X128_Y1= -84.50001182 -206.8287335 87.32768749 - X128_Y128= 84.49998818 -206.8287335 87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.50001182 -206.8287335 -87.32768749 - X1_Y128= 84.49998818 -206.8287335 -87.32768749 - X128_Y1= -84.50001182 -87.32768749 -206.8287335 - X128_Y128= 84.49998818 -87.32768749 -206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -128.6063166 143.3590149 -88.30123599 - X1_Y128= -151.8764696 96.81870993 -111.571389 - X128_Y1= -88.30122956 143.3590149 -128.606323 - X128_Y128= -111.5713826 96.81870993 -151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -88.30122956 143.3590149 128.606323 - X1_Y128= -111.5713826 96.81870993 151.876476 - X128_Y1= -128.6063166 143.3590149 88.30123599 - X128_Y128= -151.8764696 96.81870993 111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 128.606323 143.3590085 88.30123599 - X1_Y128= 151.876476 96.81870349 111.571389 - X128_Y1= 88.30123599 143.3590085 128.606323 - X128_Y128= 111.571389 96.81870349 151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 88.30123599 143.3590085 -128.606323 - X1_Y128= 111.571389 96.81870349 -151.876476 - X128_Y1= 128.606323 143.3590085 -88.30123599 - X128_Y128= 151.876476 96.81870349 -111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -88.30124243 -143.3590021 -128.606323 - X1_Y128= -111.5713954 -96.81869706 -151.876476 - X128_Y1= -128.6063294 -143.3590021 -88.30123599 - X128_Y128= -151.8764824 -96.81869706 -111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 128.6063101 -143.3590214 -88.30123599 - X1_Y128= 151.8764631 -96.81871636 -111.571389 - X128_Y1= 88.30122312 -143.3590214 -128.606323 - X128_Y128= 111.5713761 -96.81871636 -151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 88.30122312 -143.3590214 128.606323 - X1_Y128= 111.5713761 -96.81871636 151.876476 - X128_Y1= 128.6063101 -143.3590214 88.30123599 - X128_Y128= 151.8764631 -96.81871636 111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -128.6063294 -143.3590021 88.30123599 - X1_Y128= -151.8764824 -96.81869706 111.571389 - X128_Y1= -88.30124243 -143.3590021 128.606323 - X128_Y128= -111.5713954 -96.81869706 151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/ParisAll_208pipe2.detector b/Inputs/DetectorConfiguration/ParisAll_208pipe2.detector deleted file mode 100644 index c7165ff81b301aa4ebe457d27fc062bfbfdd5b13..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/ParisAll_208pipe2.detector +++ /dev/null @@ -1,792 +0,0 @@ -%Fichier de configuration manip E225 -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and R given in mm -%%Angle given in degree -%%Option: 0,1 for Si SiLi and CsI -%%Option: all or sensible for VISualisation -%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 -%Thickness in micrometer -%Radius in mm -%Temperature in K, Pressure in bar -%Material name according to the target library - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 - NBLAYERS= 50 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Paris -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ParisCluster - X1_Y1= -84.5 -208 84.5 - X1_Y128= 84.5 -208 84.5 - X128_Y1= -84.5 -208 -84.5 - X128_Y128= 84.5 -208 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -206.8287414 -87.3276796 84.5 - X1_Y128= -87.32769537 -206.8287256 84.5 - X128_Y1= -206.8287414 -87.3276796 -84.5 - X128_Y128= -87.32769537 -206.8287256 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -208 84.50001115 84.5 - X1_Y128= -208 -84.49998885 84.5 - X128_Y1= -208 84.50001115 -84.5 - X128_Y128= -208 -84.49998885 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -87.3276796 206.8287414 84.5 - X1_Y128= -206.8287256 87.32769537 84.5 - X128_Y1= -87.3276796 206.8287414 -84.5 - X128_Y128= -206.8287256 87.32769537 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 84.50000557 208 84.5 - X1_Y128= -84.49999443 208 84.5 - X128_Y1= 84.50000557 208 -84.5 - X128_Y128= -84.49999443 208 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 206.8287335 87.32768749 84.5 - X1_Y128= 87.32768749 206.8287335 84.5 - X128_Y1= 206.8287335 87.32768749 -84.5 - X128_Y128= 87.32768749 206.8287335 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 208 -84.50002229 84.5 - X1_Y128= 208 84.49997771 84.5 - X128_Y1= 208 -84.50002229 -84.5 - X128_Y128= 208 84.49997771 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 87.32767172 -206.8287493 84.5 - X1_Y128= 206.8287177 -87.32770325 84.5 - X128_Y1= 87.32767172 -206.8287493 -84.5 - X128_Y128= 206.8287177 -87.32770325 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 84.5 84.5 -208 - X1_Y128= -84.5 84.5 -208 - X128_Y1= 84.5 -84.5 -208 - X128_Y128= -84.5 -84.5 -208 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 206.8287335 84.49998424 -87.32768749 - X1_Y128= 87.32768749 84.49998424 -206.8287335 - X128_Y1= 206.8287335 -84.50001576 -87.32768749 - X128_Y128= 87.32768749 -84.50001576 -206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 87.32768749 84.49998424 206.8287335 - X1_Y128= 206.8287335 84.49998424 87.32768749 - X128_Y1= 87.32768749 -84.50001576 206.8287335 - X128_Y128= 206.8287335 -84.50001576 87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.5 84.5 208 - X1_Y128= 84.5 84.5 208 - X128_Y1= -84.5 -84.5 208 - X128_Y128= 84.5 -84.5 208 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -206.8287335 84.50000788 87.32768749 - X1_Y128= -87.32768749 84.50000788 206.8287335 - X128_Y1= -206.8287335 -84.49999212 87.32768749 - X128_Y128= -87.32768749 -84.49999212 206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -87.32768749 84.50000788 -206.8287335 - X1_Y128= -206.8287335 84.50000788 -87.32768749 - X128_Y1= -87.32768749 -84.49999212 -206.8287335 - X128_Y128= -206.8287335 -84.49999212 -87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.49999606 87.32768749 -206.8287335 - X1_Y128= 84.50000394 87.32768749 -206.8287335 - X128_Y1= -84.49999606 206.8287335 -87.32768749 - X128_Y128= 84.50000394 206.8287335 -87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.49999606 206.8287335 87.32768749 - X1_Y128= 84.50000394 206.8287335 87.32768749 - X128_Y1= -84.49999606 87.32768749 206.8287335 - X128_Y128= 84.50000394 87.32768749 206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.50001182 -87.32768749 206.8287335 - X1_Y128= 84.49998818 -87.32768749 206.8287335 - X128_Y1= -84.50001182 -206.8287335 87.32768749 - X128_Y128= 84.49998818 -206.8287335 87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.50001182 -206.8287335 -87.32768749 - X1_Y128= 84.49998818 -206.8287335 -87.32768749 - X128_Y1= -84.50001182 -87.32768749 -206.8287335 - X128_Y128= 84.49998818 -87.32768749 -206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -128.6063166 143.3590149 -88.30123599 - X1_Y128= -151.8764696 96.81870993 -111.571389 - X128_Y1= -88.30122956 143.3590149 -128.606323 - X128_Y128= -111.5713826 96.81870993 -151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -88.30122956 143.3590149 128.606323 - X1_Y128= -111.5713826 96.81870993 151.876476 - X128_Y1= -128.6063166 143.3590149 88.30123599 - X128_Y128= -151.8764696 96.81870993 111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 128.606323 143.3590085 88.30123599 - X1_Y128= 151.876476 96.81870349 111.571389 - X128_Y1= 88.30123599 143.3590085 128.606323 - X128_Y128= 111.571389 96.81870349 151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParisPhoswich -% X1_Y1= 88.30123599 143.3590085 -128.606323 -% X1_Y128= 111.571389 96.81870349 -151.876476 -% X128_Y1= 128.606323 143.3590085 -88.30123599 -% X128_Y128= 151.876476 96.81870349 -111.571389 -% VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -88.30124243 -143.3590021 -128.606323 - X1_Y128= -111.5713954 -96.81869706 -151.876476 - X128_Y1= -128.6063294 -143.3590021 -88.30123599 - X128_Y128= -151.8764824 -96.81869706 -111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 128.6063101 -143.3590214 -88.30123599 - X1_Y128= 151.8764631 -96.81871636 -111.571389 - X128_Y1= 88.30122312 -143.3590214 -128.606323 - X128_Y128= 111.5713761 -96.81871636 -151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 88.30122312 -143.3590214 128.606323 - X1_Y128= 111.5713761 -96.81871636 151.876476 - X128_Y1= 128.6063101 -143.3590214 88.30123599 - X128_Y128= 151.8764631 -96.81871636 111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParisPhoswich -% X1_Y1= -128.6063294 -143.3590021 88.30123599 -% X1_Y128= -151.8764824 -96.81869706 111.571389 -% X128_Y1= -88.30124243 -143.3590021 128.606323 -% X128_Y128= -111.5713954 -96.81869706 151.876476 -% VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Shield -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ShieldClParis - X1_Y1= 151.375 153.75 364 - X1_Y128= 151.375 91.5 364 - X128_Y1= -84.5 153.75 364 - X128_Y128= -84.5 91.5 364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 -151.375 364 - X1_Y128= 91.49999999 -151.375 364 - X128_Y1= 153.75 84.49999999 364 - X128_Y128= 91.50000004 84.5 364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 -153.75 364 - X1_Y128= -151.375 -91.49999999 364 - X128_Y1= 84.49999997 -153.7500001 364 - X128_Y128= 84.5 -91.50000008 364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 151.375 364 - X1_Y128= -91.49999998 151.375 364 - X128_Y1= -153.7500001 -84.49999996 364 - X128_Y128= -91.50000013 -84.5 364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ShieldClParis - X1_Y1= 151.375 -148.6692007 366.104536 - X1_Y128= 151.375 -192.6865979 322.0871388 - X128_Y1= -84.5 -148.6692007 366.104536 - X128_Y128= -84.5 -192.6865979 322.0871388 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 -364.4251574 150.3485793 - X1_Y128= 91.49999999 -364.4251574 150.3485793 - X128_Y1= 153.75 -197.6363454 317.1373914 - X128_Y128= 91.50000004 -197.6363453 317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 -366.104536 148.6692008 - X1_Y128= -151.375 -322.0871388 192.6865979 - X128_Y1= 84.49999997 -366.104536 148.6692007 - X128_Y128= 84.5 -322.0871389 192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 -150.3485793 364.4251574 - X1_Y128= -91.49999998 -150.3485793 364.4251574 - X128_Y1= -153.7500001 -317.1373913 197.6363454 - X128_Y128= -91.50000013 -317.1373914 197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -ShieldClParis - X1_Y1= 151.375 -364 153.75 - X1_Y128= 151.375 -364 91.5 - X128_Y1= -84.5 -364 153.75 - X128_Y128= -84.5 -364 91.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 -364 -151.375 - X1_Y128= 91.49999999 -364 -151.375 - X128_Y1= 153.75 -364 84.49999999 - X128_Y128= 91.50000004 -364 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 -364 -153.75 - X1_Y128= -151.375 -364 -91.49999999 - X128_Y1= 84.49999997 -364 -153.7500001 - X128_Y128= 84.5 -364 -91.50000008 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 -364 151.375 - X1_Y128= -91.49999998 -364 151.375 - X128_Y1= -153.7500001 -364 -84.49999996 - X128_Y128= -91.50000013 -364 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -ShieldClParis - X1_Y1= 151.375 -366.104536 -148.6692007 - X1_Y128= 151.375 -322.0871388 -192.6865979 - X128_Y1= -84.5 -366.104536 -148.6692007 - X128_Y128= -84.5 -322.0871388 -192.6865979 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 -150.3485793 -364.4251574 - X1_Y128= 91.49999999 -150.3485793 -364.4251574 - X128_Y1= 153.75 -317.1373914 -197.6363454 - X128_Y128= 91.50000004 -317.1373914 -197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 -148.6692008 -366.104536 - X1_Y128= -151.375 -192.6865979 -322.0871388 - X128_Y1= 84.49999997 -148.6692007 -366.104536 - X128_Y128= 84.5 -192.6865978 -322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 -364.4251574 -150.3485793 - X1_Y128= -91.49999998 -364.4251574 -150.3485793 - X128_Y1= -153.7500001 -197.6363454 -317.1373913 - X128_Y128= -91.50000013 -197.6363453 -317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -ShieldClParis - X1_Y1= 151.375 -153.75 -364 - X1_Y128= 151.375 -91.5 -364 - X128_Y1= -84.5 -153.75 -364 - X128_Y128= -84.5 -91.5 -364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 151.375 -364 - X1_Y128= 91.49999999 151.375 -364 - X128_Y1= 153.75 -84.49999999 -364 - X128_Y128= 91.50000004 -84.5 -364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 153.75 -364 - X1_Y128= -151.375 91.49999999 -364 - X128_Y1= 84.49999997 153.7500001 -364 - X128_Y128= 84.5 91.50000008 -364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 -151.375 -364 - X1_Y128= -91.49999998 -151.375 -364 - X128_Y1= -153.7500001 84.49999996 -364 - X128_Y128= -91.50000013 84.5 -364 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -ShieldClParis - X1_Y1= 151.375 148.6692007 -366.104536 - X1_Y128= 151.375 192.6865979 -322.0871388 - X128_Y1= -84.5 148.6692007 -366.104536 - X128_Y128= -84.5 192.6865979 -322.0871388 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 364.4251574 -150.3485793 - X1_Y128= 91.49999999 364.4251574 -150.3485793 - X128_Y1= 153.75 197.6363454 -317.1373914 - X128_Y128= 91.50000004 197.6363453 -317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 366.104536 -148.6692008 - X1_Y128= -151.375 322.0871388 -192.6865979 - X128_Y1= 84.49999997 366.104536 -148.6692007 - X128_Y128= 84.5 322.0871389 -192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 150.3485793 -364.4251574 - X1_Y128= -91.49999998 150.3485793 -364.4251574 - X128_Y1= -153.7500001 317.1373913 -197.6363454 - X128_Y128= -91.50000013 317.1373914 -197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -ShieldClParis - X1_Y1= 151.375 364 -153.75 - X1_Y128= 151.375 364 -91.5 - X128_Y1= -84.5 364 -153.75 - X128_Y128= -84.5 364 -91.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 364 151.375 - X1_Y128= 91.49999999 364 151.375 - X128_Y1= 153.75 364 -84.49999999 - X128_Y128= 91.50000004 364 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 364 153.75 - X1_Y128= -151.375 364 91.49999999 - X128_Y1= 84.49999997 364 153.7500001 - X128_Y128= 84.5 364 91.50000008 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 364 -151.375 - X1_Y128= -91.49999998 364 -151.375 - X128_Y1= -153.7500001 364 84.49999996 - X128_Y128= -91.50000013 364 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -ShieldClParis - X1_Y1= 151.375 366.104536 148.6692007 - X1_Y128= 151.375 322.0871388 192.6865979 - X128_Y1= -84.5 366.104536 148.6692007 - X128_Y128= -84.5 322.0871388 192.6865979 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 153.75 150.3485793 364.4251574 - X1_Y128= 91.49999999 150.3485793 364.4251574 - X128_Y1= 153.75 317.1373914 197.6363454 - X128_Y128= 91.50000004 317.1373914 197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -151.375 148.6692008 366.104536 - X1_Y128= -151.375 192.6865979 322.0871388 - X128_Y1= 84.49999997 148.6692007 366.104536 - X128_Y128= 84.5 192.6865978 322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -153.75 364.4251574 150.3485793 - X1_Y128= -91.49999998 364.4251574 150.3485793 - X128_Y1= -153.7500001 197.6363454 317.1373913 - X128_Y128= -91.50000013 197.6363453 317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -ShieldClParis - X1_Y1= -150.3485793 153.75 364.4251574 - X1_Y128= -150.3485793 91.5 364.4251574 - X128_Y1= -317.1373914 153.75 197.6363453 - X128_Y128= -317.1373914 91.5 197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -148.6692007 -151.375 366.104536 - X1_Y128= -192.6865979 -151.375 322.0871388 - X128_Y1= -148.6692007 84.49999999 366.104536 - X128_Y128= -192.6865978 84.5 322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364.4251574 -153.75 150.3485793 - X1_Y128= -364.4251574 -91.49999999 150.3485793 - X128_Y1= -197.6363454 -153.7500001 317.1373913 - X128_Y128= -197.6363453 -91.50000008 317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -366.1045359 151.375 148.6692008 - X1_Y128= -322.0871388 151.375 192.6865979 - X128_Y1= -366.104536 -84.49999996 148.6692007 - X128_Y128= -322.0871389 -84.5 192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 -ShieldClParis - X1_Y1= -364 153.75 151.375 - X1_Y128= -364 91.5 151.375 - X128_Y1= -364 153.75 -84.5 - X128_Y128= -364 91.5 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364 -151.375 153.75 - X1_Y128= -364 -151.375 91.49999999 - X128_Y1= -364 84.49999999 153.75 - X128_Y128= -364 84.5 91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364 -153.75 -151.375 - X1_Y128= -364 -91.49999999 -151.375 - X128_Y1= -364 -153.7500001 84.49999997 - X128_Y128= -364 -91.50000008 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364 151.375 -153.75 - X1_Y128= -364 151.375 -91.49999998 - X128_Y1= -364 -84.49999996 -153.7500001 - X128_Y128= -364 -84.5 -91.50000013 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 -ShieldClParis - X1_Y1= -364.4251574 153.75 -150.3485793 - X1_Y128= -364.4251574 91.5 -150.3485793 - X128_Y1= -197.6363453 153.75 -317.1373914 - X128_Y128= -197.6363453 91.5 -317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -366.104536 -151.375 -148.6692007 - X1_Y128= -322.0871388 -151.375 -192.6865979 - X128_Y1= -366.104536 84.49999999 -148.6692007 - X128_Y128= -322.0871389 84.5 -192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -150.3485793 -153.75 -364.4251574 - X1_Y128= -150.3485793 -91.49999999 -364.4251574 - X128_Y1= -317.1373913 -153.7500001 -197.6363454 - X128_Y128= -317.1373914 -91.50000008 -197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -148.6692008 151.375 -366.1045359 - X1_Y128= -192.6865979 151.375 -322.0871388 - X128_Y1= -148.6692007 -84.49999996 -366.104536 - X128_Y128= -192.6865978 -84.5 -322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 -ShieldClParis - X1_Y1= 150.3485793 153.75 -364.4251574 - X1_Y128= 150.3485793 91.5 -364.4251574 - X128_Y1= 317.1373914 153.75 -197.6363453 - X128_Y128= 317.1373914 91.5 -197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 148.6692007 -151.375 -366.104536 - X1_Y128= 192.6865979 -151.375 -322.0871388 - X128_Y1= 148.6692007 84.49999999 -366.104536 - X128_Y128= 192.6865978 84.5 -322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364.4251574 -153.75 -150.3485793 - X1_Y128= 364.4251574 -91.49999999 -150.3485793 - X128_Y1= 197.6363454 -153.7500001 -317.1373913 - X128_Y128= 197.6363453 -91.50000008 -317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 366.1045359 151.375 -148.6692008 - X1_Y128= 322.0871388 151.375 -192.6865979 - X128_Y1= 366.104536 -84.49999996 -148.6692007 - X128_Y128= 322.0871389 -84.5 -192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 -ShieldClParis - X1_Y1= 364 153.75 -151.375 - X1_Y128= 364 91.5 -151.375 - X128_Y1= 364 153.75 84.5 - X128_Y128= 364 91.5 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364 -151.375 -153.75 - X1_Y128= 364 -151.375 -91.49999999 - X128_Y1= 364 84.49999999 -153.75 - X128_Y128= 364 84.5 -91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364 -153.75 151.375 - X1_Y128= 364 -91.49999999 151.375 - X128_Y1= 364 -153.7500001 -84.49999997 - X128_Y128= 364 -91.50000008 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364 151.375 153.75 - X1_Y128= 364 151.375 91.49999998 - X128_Y1= 364 -84.49999996 153.7500001 - X128_Y128= 364 -84.5 91.50000013 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 -ShieldClParis - X1_Y1= 364.4251574 153.75 150.3485793 - X1_Y128= 364.4251574 91.5 150.3485793 - X128_Y1= 197.6363453 153.75 317.1373914 - X128_Y128= 197.6363453 91.5 317.1373914 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 366.104536 -151.375 148.6692007 - X1_Y128= 322.0871388 -151.375 192.6865979 - X128_Y1= 366.104536 84.49999999 148.6692007 - X128_Y128= 322.0871389 84.5 192.6865978 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 150.3485793 -153.75 364.4251574 - X1_Y128= 150.3485793 -91.49999999 364.4251574 - X128_Y1= 317.1373913 -153.7500001 197.6363454 - X128_Y128= 317.1373914 -91.50000008 197.6363453 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 148.6692008 151.375 366.1045359 - X1_Y128= 192.6865979 151.375 322.0871388 - X128_Y1= 148.6692007 -84.49999996 366.104536 - X128_Y128= 192.6865978 -84.5 322.0871389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 -ShieldClParis - X1_Y1= -366.104536 -148.6692007 151.375 - X1_Y128= -322.0871388 -192.6865979 151.375 - X128_Y1= -366.104536 -148.6692007 -84.5 - X128_Y128= -322.0871388 -192.6865979 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -150.3485793 -364.4251574 153.75 - X1_Y128= -150.3485793 -364.4251574 91.49999999 - X128_Y1= -317.1373914 -197.6363454 153.75 - X128_Y128= -317.1373914 -197.6363453 91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -148.6692008 -366.104536 -151.375 - X1_Y128= -192.6865979 -322.0871388 -151.375 - X128_Y1= -148.6692007 -366.104536 84.49999997 - X128_Y128= -192.6865978 -322.0871389 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364.4251574 -150.3485793 -153.75 - X1_Y128= -364.4251574 -150.3485793 -91.49999998 - X128_Y1= -197.6363454 -317.1373913 -153.7500001 - X128_Y128= -197.6363453 -317.1373914 -91.50000013 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 -ShieldClParis - X1_Y1= 366.104536 -148.6692007 -151.375 - X1_Y128= 322.0871388 -192.6865979 -151.375 - X128_Y1= 366.104536 -148.6692007 84.5 - X128_Y128= 322.0871388 -192.6865979 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 150.3485793 -364.4251574 -153.75 - X1_Y128= 150.3485793 -364.4251574 -91.49999999 - X128_Y1= 317.1373914 -197.6363454 -153.75 - X128_Y128= 317.1373914 -197.6363453 -91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 148.6692008 -366.104536 151.375 - X1_Y128= 192.6865979 -322.0871388 151.375 - X128_Y1= 148.6692007 -366.104536 -84.49999997 - X128_Y128= 192.6865978 -322.0871389 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364.4251574 -150.3485793 153.75 - X1_Y128= 364.4251574 -150.3485793 91.49999998 - X128_Y1= 197.6363454 -317.1373913 153.7500001 - X128_Y128= 197.6363453 -317.1373914 91.50000013 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 -ShieldClParis - X1_Y1= -148.6692007 366.104536 151.375 - X1_Y128= -192.6865979 322.0871388 151.375 - X128_Y1= -148.6692007 366.104536 -84.5 - X128_Y128= -192.6865979 322.0871388 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -364.4251574 150.3485793 153.75 - X1_Y128= -364.4251574 150.3485793 91.49999999 - X128_Y1= -197.6363454 317.1373914 153.75 - X128_Y128= -197.6363453 317.1373914 91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -366.104536 148.6692008 -151.375 - X1_Y128= -322.0871388 192.6865979 -151.375 - X128_Y1= -366.104536 148.6692007 84.49999997 - X128_Y128= -322.0871389 192.6865978 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= -150.3485793 364.4251574 -153.75 - X1_Y128= -150.3485793 364.4251574 -91.49999998 - X128_Y1= -317.1373913 197.6363454 -153.7500001 - X128_Y128= -317.1373914 197.6363453 -91.50000013 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 -ShieldClParis - X1_Y1= 148.6692007 366.104536 -151.375 - X1_Y128= 192.6865979 322.0871388 -151.375 - X128_Y1= 148.6692007 366.104536 84.5 - X128_Y128= 192.6865979 322.0871388 84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 364.4251574 150.3485793 -153.75 - X1_Y128= 364.4251574 150.3485793 -91.49999999 - X128_Y1= 197.6363454 317.1373914 -153.75 - X128_Y128= 197.6363453 317.1373914 -91.50000004 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 366.104536 148.6692008 151.375 - X1_Y128= 322.0871388 192.6865979 151.375 - X128_Y1= 366.104536 148.6692007 -84.49999997 - X128_Y128= 322.0871389 192.6865978 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ShieldClParis - X1_Y1= 150.3485793 364.4251574 153.75 - X1_Y128= 150.3485793 364.4251574 91.49999998 - X128_Y1= 317.1373913 197.6363454 153.7500001 - X128_Y128= 317.1373914 197.6363453 91.50000013 - VIS=all - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ShieldPhParis - THETA= 54.73 - PHI= 45.02 - R= 248 - BETA= 0 0 -30 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ShieldPhParis - THETA= 54.73 - PHI= 134.98 - R= 248 - BETA= 0 0 210 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -%ShieldPhParis -% THETA= 54.73 -% PHI= 225 -% R= 248 -% BETA= 0 0 -30 -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -ShieldPhParis - THETA= 54.73 - PHI= 315 - R= 248 - BETA= 0 0 210 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -%ShieldPhParis -% THETA= 125.26 -% PHI= 45.02 -% R= 248 -% BETA= 0 0 30 -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -ShieldPhParis - THETA= 125.26 - PHI= 134.98 - R= 248 - BETA= 0 0 -210 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -ShieldPhParis - THETA= 125.26 - PHI= 225 - R= 248 - BETA= 0 0 30 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -ShieldPhParis - THETA= 125.26 - PHI= 315 - R= 248 - BETA= 0 0 -210 - VIS= all diff --git a/Inputs/DetectorConfiguration/ParisAll_208pipe2noshield.detector b/Inputs/DetectorConfiguration/ParisAll_208pipe2noshield.detector deleted file mode 100644 index ea1aeb30bc796bed50dff1666e066e72b34df191..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/ParisAll_208pipe2noshield.detector +++ /dev/null @@ -1,211 +0,0 @@ -%Fichier de configuration manip E225 -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and R given in mm -%%Angle given in degree -%%Option: 0,1 for Si SiLi and CsI -%%Option: all or sensible for VISualisation -%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 -%Thickness in micrometer -%Radius in mm -%Temperature in K, Pressure in bar -%Material name according to the target library - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 - NBLAYERS= 50 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Paris -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ParisCluster - X1_Y1= -84.5 -208 84.5 - X1_Y128= 84.5 -208 84.5 - X128_Y1= -84.5 -208 -84.5 - X128_Y128= 84.5 -208 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -206.8287414 -87.3276796 84.5 - X1_Y128= -87.32769537 -206.8287256 84.5 - X128_Y1= -206.8287414 -87.3276796 -84.5 - X128_Y128= -87.32769537 -206.8287256 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -208 84.50001115 84.5 - X1_Y128= -208 -84.49998885 84.5 - X128_Y1= -208 84.50001115 -84.5 - X128_Y128= -208 -84.49998885 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -87.3276796 206.8287414 84.5 - X1_Y128= -206.8287256 87.32769537 84.5 - X128_Y1= -87.3276796 206.8287414 -84.5 - X128_Y128= -206.8287256 87.32769537 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 84.50000557 208 84.5 - X1_Y128= -84.49999443 208 84.5 - X128_Y1= 84.50000557 208 -84.5 - X128_Y128= -84.49999443 208 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 206.8287335 87.32768749 84.5 - X1_Y128= 87.32768749 206.8287335 84.5 - X128_Y1= 206.8287335 87.32768749 -84.5 - X128_Y128= 87.32768749 206.8287335 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 208 -84.50002229 84.5 - X1_Y128= 208 84.49997771 84.5 - X128_Y1= 208 -84.50002229 -84.5 - X128_Y128= 208 84.49997771 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 87.32767172 -206.8287493 84.5 - X1_Y128= 206.8287177 -87.32770325 84.5 - X128_Y1= 87.32767172 -206.8287493 -84.5 - X128_Y128= 206.8287177 -87.32770325 -84.5 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 84.5 84.5 -208 - X1_Y128= -84.5 84.5 -208 - X128_Y1= 84.5 -84.5 -208 - X128_Y128= -84.5 -84.5 -208 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 206.8287335 84.49998424 -87.32768749 - X1_Y128= 87.32768749 84.49998424 -206.8287335 - X128_Y1= 206.8287335 -84.50001576 -87.32768749 - X128_Y128= 87.32768749 -84.50001576 -206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= 87.32768749 84.49998424 206.8287335 - X1_Y128= 206.8287335 84.49998424 87.32768749 - X128_Y1= 87.32768749 -84.50001576 206.8287335 - X128_Y128= 206.8287335 -84.50001576 87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.5 84.5 208 - X1_Y128= 84.5 84.5 208 - X128_Y1= -84.5 -84.5 208 - X128_Y128= 84.5 -84.5 208 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -206.8287335 84.50000788 87.32768749 - X1_Y128= -87.32768749 84.50000788 206.8287335 - X128_Y1= -206.8287335 -84.49999212 87.32768749 - X128_Y128= -87.32768749 -84.49999212 206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -87.32768749 84.50000788 -206.8287335 - X1_Y128= -206.8287335 84.50000788 -87.32768749 - X128_Y1= -87.32768749 -84.49999212 -206.8287335 - X128_Y128= -206.8287335 -84.49999212 -87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.49999606 87.32768749 -206.8287335 - X1_Y128= 84.50000394 87.32768749 -206.8287335 - X128_Y1= -84.49999606 206.8287335 -87.32768749 - X128_Y128= 84.50000394 206.8287335 -87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.49999606 206.8287335 87.32768749 - X1_Y128= 84.50000394 206.8287335 87.32768749 - X128_Y1= -84.49999606 87.32768749 206.8287335 - X128_Y128= 84.50000394 87.32768749 206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.50001182 -87.32768749 206.8287335 - X1_Y128= 84.49998818 -87.32768749 206.8287335 - X128_Y1= -84.50001182 -206.8287335 87.32768749 - X128_Y128= 84.49998818 -206.8287335 87.32768749 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisCluster - X1_Y1= -84.50001182 -206.8287335 -87.32768749 - X1_Y128= 84.49998818 -206.8287335 -87.32768749 - X128_Y1= -84.50001182 -87.32768749 -206.8287335 - X128_Y128= 84.49998818 -87.32768749 -206.8287335 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -128.6063166 143.3590149 -88.30123599 - X1_Y128= -151.8764696 96.81870993 -111.571389 - X128_Y1= -88.30122956 143.3590149 -128.606323 - X128_Y128= -111.5713826 96.81870993 -151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -88.30122956 143.3590149 128.606323 - X1_Y128= -111.5713826 96.81870993 151.876476 - X128_Y1= -128.6063166 143.3590149 88.30123599 - X128_Y128= -151.8764696 96.81870993 111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 128.606323 143.3590085 88.30123599 - X1_Y128= 151.876476 96.81870349 111.571389 - X128_Y1= 88.30123599 143.3590085 128.606323 - X128_Y128= 111.571389 96.81870349 151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParisPhoswich -% X1_Y1= 88.30123599 143.3590085 -128.606323 -% X1_Y128= 111.571389 96.81870349 -151.876476 -% X128_Y1= 128.606323 143.3590085 -88.30123599 -% X128_Y128= 151.876476 96.81870349 -111.571389 -% VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -88.30124243 -143.3590021 -128.606323 - X1_Y128= -111.5713954 -96.81869706 -151.876476 - X128_Y1= -128.6063294 -143.3590021 -88.30123599 - X128_Y128= -151.8764824 -96.81869706 -111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 128.6063101 -143.3590214 -88.30123599 - X1_Y128= 151.8764631 -96.81871636 -111.571389 - X128_Y1= 88.30122312 -143.3590214 -128.606323 - X128_Y128= 111.5713761 -96.81871636 -151.876476 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 88.30122312 -143.3590214 128.606323 - X1_Y128= 111.5713761 -96.81871636 151.876476 - X128_Y1= 128.6063101 -143.3590214 88.30123599 - X128_Y128= 151.8764631 -96.81871636 111.571389 - VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParisPhoswich -% X1_Y1= -128.6063294 -143.3590021 88.30123599 -% X1_Y128= -151.8764824 -96.81869706 111.571389 -% X128_Y1= -88.30124243 -143.3590021 128.606323 -% X128_Y128= -111.5713954 -96.81869706 151.876476 -% VIS=all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/ParisAll_208tilt.detector b/Inputs/DetectorConfiguration/ParisAll_208tilt.detector deleted file mode 100644 index 6ba61696cbb2336e204cd1f01ea941546ae0493c..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/ParisAll_208tilt.detector +++ /dev/null @@ -1,220 +0,0 @@ -%Fichier de configuration manip E225 -%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 -%Thickness in micrometer -%Radius in mm -%Temperature in K, Pressure in bar -%Material name according to the target library - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2 - NBLAYERS= 50 - X= 0 - Y= 0 - Z= 0 - - -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and R given in mm -%%Angle given in degree -%%Option: 0,1 for Si SiLi and CsI -%%Option: all or sensible for VISualisation - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Paris -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ParisCluster - X1_Y1= -50.418664 -87.327687 -217.661051 - X1_Y128= -188.406586 -87.327687 -120.088856 - X128_Y1= 18.575297 -206.828733 -120.088856 - X128_Y128= -119.412625 -206.828733 -22.51666 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisClShield - X1_Y1= 151.375 153.75 364 - X1_Y128= 151.375 91.5 364 - X128_Y1= -84.5 153.75 364 - X128_Y128= -84.5 91.5 364 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -190.237216 -86.499477 -117.780059 - X1_Y128= -239.023313 -1.999477 20.207863 - X128_Y1= -121.243255 -206.000523 -20.207863 - X128_Y128= -170.029352 -121.500523 117.780059 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -ParisCluster - X1_Y1= -238.82525 0 22.51666 - X1_Y128= -169.831289 119.501046 120.088856 - X128_Y1= -169.831289 -119.501046 120.088856 - X128_Y128= -100.837328 0 217.661051 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -ParisCluster - X1_Y1= -167.720555 121.500523 121.045191 - X1_Y128= -21.362262 206.000523 121.045191 - X128_Y1= -98.726594 1.999477 218.617387 - X128_Y128= 47.631699 86.499477 218.617387 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -ParisCluster - X1_Y1= -18.575297 206.828733 120.088856 - X1_Y128= 119.412625 206.828733 22.51666 - X128_Y1= 50.418664 87.327687 217.661051 - X128_Y128= 188.406586 87.327687 120.088856 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -ParisCluster - X1_Y1= 121.243255 206.000523 20.207863 - X1_Y128= 170.029352 121.500523 -117.780059 - X128_Y1= 190.237216 86.499477 117.780059 - X128_Y128= 239.023313 1.999477 -20.207863 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -ParisCluster - X1_Y1= 169.831289 119.501046 -120.088856 - X1_Y128= 100.837328 0 -217.661051 - X128_Y1= 238.82525 0 -22.51666 - X128_Y128= 169.831289 -119.501046 -120.088856 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -ParisCluster - X1_Y1= 98.726594 -1.999477 -218.617387 - X1_Y128= -47.631699 -86.499477 -218.617387 - X128_Y1= 167.720555 -121.500523 -121.045191 - X128_Y128= 21.362262 -206.000523 -121.045191 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -ParisCluster - X1_Y1= 50.418664 -87.327687 217.661051 - X1_Y128= 188.406586 -87.327687 120.088856 - X128_Y1= -18.575297 -206.828733 120.088856 - X128_Y128= 119.412625 -206.828733 22.51666 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 -ParisCluster - X1_Y1= 190.237216 -86.499477 117.780059 - X1_Y128= 239.023313 -1.999477 -20.207863 - X128_Y1= 121.243255 -206.000523 20.207863 - X128_Y128= 170.029352 -121.500523 -117.780059 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 -ParisCluster - X1_Y1= 167.720555 121.500523 -121.045191 - X1_Y128= 21.362262 206.000523 -121.045191 - X128_Y1= 98.726594 1.999477 -218.617387 - X128_Y128= -47.631699 86.499477 -218.617387 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 -ParisCluster - X1_Y1= 18.575297 206.828733 -120.088856 - X1_Y128= -119.412625 206.828733 -22.51666 - X128_Y1= -50.418664 87.327687 -217.661051 - X128_Y128= -188.406586 87.327687 -120.088856 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 -ParisCluster - X1_Y1= -121.243255 206.000523 -20.207863 - X1_Y128= -170.029352 121.500523 117.780059 - X128_Y1= -190.237216 86.499477 -117.780059 - X128_Y128= -239.023313 1.999477 20.207863 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 -ParisCluster - X1_Y1= -98.726594 -1.999477 218.617387 - X1_Y128= 47.631699 -86.499477 218.617387 - X128_Y1= -167.720555 -121.500523 121.045191 - X128_Y128= -21.362262 -206.000523 121.045191 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 -ParisCluster - X1_Y1= 189.082817 -84.5 121.045191 - X1_Y128= 51.094895 -84.5 218.617387 - X128_Y1= 189.082817 84.5 121.045191 - X128_Y128= 51.094895 84.5 218.617387 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 -ParisCluster - X1_Y1= 117.780059 208 20.207863 - X1_Y128= -20.207863 208 117.780059 - X128_Y1= 20.207863 208 -117.780059 - X128_Y128= -117.780059 208 -20.207863 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 -ParisCluster - X1_Y1= -51.094895 84.5 -218.617387 - X1_Y128= -189.082817 84.5 -121.045191 - X128_Y1= -51.094895 -84.5 -218.617387 - X128_Y128= -189.082817 -84.5 -121.045191 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 -ParisCluster - X1_Y1= 20.207863 -208 -117.780059 - X1_Y128= -117.780059 -208 -20.207863 - X128_Y1= 117.780059 -208 20.207863 - X128_Y128= -20.207863 -208 117.780059 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ParisPhoswich - X1_Y1= -130.029382 -147.354047 79.168457 - X1_Y128= -82.529382 -163.80853 106.038515 - X128_Y1= -113.574899 -175.854047 32.628152 - X128_Y128= -66.074899 -192.30853 59.49821 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisPhoswich - X1_Y1= 68.620416 -175.854047 -96.203391 - X1_Y128= 78.120416 -192.30853 -42.463276 - X128_Y1= 117.983864 -147.354047 -96.203391 - X128_Y128= 127.483864 -163.80853 -42.463276 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -ParisPhoswich - X1_Y1= 209.081522 10.431724 32.628152 - X1_Y128= 199.581522 -38.931724 59.49821 - X128_Y1= 192.627039 38.931724 79.168457 - X128_Y128= 183.127039 -10.431724 106.038515 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -%ParisPhoswich -% X1_Y1= 10.431724 38.931724 208 -% X1_Y128= 38.931724 -10.431724 208 -% X128_Y1= -38.931724 10.431724 208 -% X128_Y128= -10.431724 -38.931724 208 -% VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -%ParisPhoswich -% X1_Y1= -38.931724 10.431724 -208.000012 -% X1_Y128= -10.431724 -38.931724 -208.000012 -% X128_Y1= 10.431724 38.931724 -208.000012 -% X128_Y128= 38.931724 -10.431724 -208.000012 -% VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -ParisPhoswich - X1_Y1= 82.529387 163.80854 -106.038519 - X1_Y128= 130.029387 147.354057 -79.168461 - X128_Y1= 66.074904 192.30854 -59.498213 - X128_Y128= 113.574904 175.854057 -32.628156 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -ParisPhoswich - X1_Y1= -78.120422 192.30854 42.46328 - X1_Y128= -68.620422 175.854057 96.203395 - X128_Y1= -127.48387 163.80854 42.46328 - X128_Y128= -117.98387 147.354057 96.203395 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -ParisPhoswich - X1_Y1= -199.581533 38.931724 -59.498213 - X1_Y128= -209.081533 -10.431724 -32.628156 - X128_Y1= -183.12705 10.431724 -106.038519 - X128_Y128= -192.62705 -38.931724 -79.168461 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/ParisAll_235.detector b/Inputs/DetectorConfiguration/ParisAll_235.detector deleted file mode 100644 index c4c2e3e5d3c981376fd429abbdc5f4281dcf8bf9..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/ParisAll_235.detector +++ /dev/null @@ -1,340 +0,0 @@ -%Fichier de configuration manip E225 -%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 -%Thickness in micrometer -%Radius in mm -%Temperature in K, Pressure in bar -%Material name according to the target library - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2 - NBLAYERS= 50 - X= 0 - Y= 0 - Z= 0 - - -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and R given in mm -%%Angle given in degree -%%Option: 0,1 for Si SiLi and CsI -%%Option: all or sensible for VISualisation - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralChamber -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Chamber - Rmin= 200 - Rmax= 201 - PhiMin= 0. - PhiMax= 6.14318 - ThetaMin= 0. - ThetaMax= 3.14159 - MATERIAL= Cu - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Paris -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ParisCluster - X1_Y1= -84.5 -235 84.5 - X1_Y128= 84.5 -235 84.5 - X128_Y1= -84.5 -235 -84.5 - X128_Y128= 84.5 -235 -84.5 - VIS= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -225.920617 -106.419571 84.5 - X1_Y128= -106.419571 -225.920617 84.5 - X128_Y1= -225.920617 -106.419571 -84.5 - X128_Y128= -106.419571 -225.920617 -84.5 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -ParisCluster - X1_Y1= -235 84.5 84.5 - X1_Y128= -235 -84.5 84.5 - X128_Y1= -235 84.5 -84.5 - X128_Y128= -235 -84.5 -84.5 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -ParisCluster - X1_Y1= -106.419571 225.920617 84.5 - X1_Y128= -225.920617 106.419571 84.5 - X128_Y1= -106.419571 225.920617 -84.5 - X128_Y128= -225.920617 106.419571 -84.5 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -ParisCluster - X1_Y1= 84.5 235 84.5 - X1_Y128= -84.5 235 84.5 - X128_Y1= 84.5 235 -84.5 - X128_Y128= -84.5 235 -84.5 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -ParisCluster - X1_Y1= 225.920617 106.419571 84.5 - X1_Y128= 106.419571 225.920617 84.5 - X128_Y1= 225.920617 106.419571 -84.5 - X128_Y128= 106.419571 225.920617 -84.5 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -ParisCluster - X1_Y1= 235 -84.5 84.5 - X1_Y128= 235 84.5 84.5 - X128_Y1= 235 -84.5 -84.5 - X128_Y128= 235 84.5 -84.5 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -ParisCluster - X1_Y1= 106.419571 -225.920617 84.5 - X1_Y128= 225.920617 -106.419571 84.5 - X128_Y1= 106.419571 -225.920617 -84.5 - X128_Y128= 225.920617 -106.419571 -84.5 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -ParisCluster - X1_Y1= 84.5 84.5 -235 - X1_Y128= -84.5 84.5 -235 - X128_Y1= 84.5 -84.5 -235 - X128_Y128= -84.5 -84.5 -235 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 -ParisCluster - X1_Y1= 225.920617 84.5 -106.419571 - X1_Y128= 106.419571 84.5 -225.920617 - X128_Y1= 225.920617 -84.5 -106.419571 - X128_Y128= 106.419571 -84.5 -225.920617 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 -ParisCluster - X1_Y1= 106.419571 84.5 225.920617 - X1_Y128= 225.920617 84.5 106.419571 - X128_Y1= 106.419571 -84.5 225.920617 - X128_Y128= 225.920617 -84.5 106.419571 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 -ParisCluster - X1_Y1= -84.5 84.5 235 - X1_Y128= 84.5 84.5 235 - X128_Y1= -84.5 -84.5 235 - X128_Y128= 84.5 -84.5 235 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 -ParisCluster - X1_Y1= -225.920617 84.5 106.419571 - X1_Y128= -106.419571 84.5 225.920617 - X128_Y1= -225.920617 -84.5 106.419571 - X128_Y128= -106.419571 -84.5 225.920617 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 -ParisCluster - X1_Y1= -106.419571 84.5 -225.920617 - X1_Y128= -225.920617 84.5 -106.419571 - X128_Y1= -106.419571 -84.5 -225.920617 - X128_Y128= -225.920617 -84.5 -106.419571 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 -ParisCluster - X1_Y1= -84.5 106.419571 -225.920617 - X1_Y128= 84.5 106.419571 -225.920617 - X128_Y1= -84.5 225.920617 -106.419571 - X128_Y128= 84.5 225.920617 -106.419571 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 -ParisCluster - X1_Y1= -84.5 225.920617 106.419571 - X1_Y128= 84.5 225.920617 106.419571 - X128_Y1= -84.5 106.419571 225.920617 - X128_Y128= 84.5 106.419571 225.920617 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 -ParisCluster - X1_Y1= -84.5 -106.419571 225.920617 - X1_Y128= 84.5 -106.419571 225.920617 - X128_Y1= -84.5 -225.920617 106.419571 - X128_Y128= 84.5 -225.920617 106.419571 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 -ParisCluster - X1_Y1= -84.5 -225.920617 -106.419571 - X1_Y128= 84.5 -225.920617 -106.419571 - X128_Y1= -84.5 -106.419571 -225.920617 - X128_Y128= 84.5 -106.419571 -225.920617 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ParisPhoswich - X1_Y1= -175.9824 135.677313 -95.372227 - X1_Y128= -199.252552 89.137008 -118.642379 - X128_Y1= -135.677313 135.677313 -135.677313 - X128_Y128= -158.947466 89.137008 -158.947466 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisPhoswich - X1_Y1= -135.677313 135.677313 -135.677313 - X1_Y128= -158.947466 89.137008 -158.947466 - X128_Y1= -95.372227 135.677313 -175.9824 - X128_Y128= -118.642379 89.137008 -199.252552 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -ParisPhoswich - X1_Y1= -132.559704 182.217618 -92.254617 - X1_Y128= -155.829857 135.677313 -115.52477 - X128_Y1= -92.254617 182.217618 -132.559704 - X128_Y128= -115.52477 135.677313 -155.829857 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -ParisPhoswich - X1_Y1= -95.372227 135.677313 175.9824 - X1_Y128= -118.642379 89.137008 199.252552 - X128_Y1= -135.677313 135.677313 135.677313 - X128_Y128= -158.947466 89.137008 158.947466 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -ParisPhoswich - X1_Y1= -135.677313 135.677313 135.677313 - X1_Y128= -158.947466 89.137008 158.947466 - X128_Y1= -175.9824 135.677313 95.372227 - X128_Y128= -199.252552 89.137008 118.642379 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -ParisPhoswich - X1_Y1= -92.254617 182.217618 132.559704 - X1_Y128= -115.52477 135.677313 155.829857 - X128_Y1= -132.559704 182.217618 92.254617 - X128_Y128= -155.829857 135.677313 115.52477 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -%ParisPhoswich -% X1_Y1= 175.9824 135.677313 95.372227 -% X1_Y128= 199.252552 89.137008 118.642379 -% X128_Y1= 135.677313 135.677313 135.677313 -% X128_Y128= 158.947466 89.137008 158.947466 -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -%ParisPhoswich -% X1_Y1= 135.677313 135.677313 135.677313 -% X1_Y128= 158.947466 89.137008 158.947466 -% X128_Y1= 95.372227 135.677313 175.9824 -% X128_Y128= 118.642379 89.137008 199.252552 -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -%ParisPhoswich -% X1_Y1= 132.559704 182.217618 92.254617 -% X1_Y128= 155.829857 135.677313 115.52477 -% X128_Y1= 92.254617 182.217618 132.559704 -% X128_Y128= 115.52477 135.677313 155.829857 -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 -ParisPhoswich - X1_Y1= 95.372227 135.677313 -175.9824 - X1_Y128= 118.642379 89.137008 -199.252552 - X128_Y1= 135.677313 135.677313 -135.677313 - X128_Y128= 158.947466 89.137008 -158.947466 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 -ParisPhoswich - X1_Y1= 135.677313 135.677313 -135.677313 - X1_Y128= 158.947466 89.137008 -158.947466 - X128_Y1= 175.9824 135.677313 -95.372227 - X128_Y128= 199.252552 89.137008 -118.642379 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 -ParisPhoswich - X1_Y1= 92.254617 182.217618 -132.559704 - X1_Y128= 115.52477 135.677313 -155.829857 - X128_Y1= 132.559704 182.217618 -92.254617 - X128_Y128= 155.829857 135.677313 -115.52477 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 -%ParisPhoswich -% X1_Y1= -95.372227 -135.677313 -175.9824 -% X1_Y128= -118.642379 -89.137008 -199.252552 -% X128_Y1= -135.677313 -135.677313 -135.677313 -% X128_Y128= -158.947466 -89.137008 -158.947466 -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 -%ParisPhoswich -% X1_Y1= -135.677313 -135.677313 -135.677313 -% X1_Y128= -158.947466 -89.137008 -158.947466 -% X128_Y1= -175.9824 -135.677313 -95.372227 -% X128_Y128= -199.252552 -89.137008 -118.642379 -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 -%ParisPhoswich -% X1_Y1= -92.254617 -182.217618 -132.559704 -% X1_Y128= -115.52477 -135.677313 -155.829857 -% X128_Y1= -132.559704 -182.217618 -92.254617 -% X128_Y128= -155.829857 -135.677313 -115.52477 -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 -ParisPhoswich - X1_Y1= 175.9824 -135.677313 -95.372227 - X1_Y128= 199.252552 -89.137008 -118.642379 - X128_Y1= 135.677313 -135.677313 -135.677313 - X128_Y128= 158.947466 -89.137008 -158.947466 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 -ParisPhoswich - X1_Y1= 135.677313 -135.677313 -135.677313 - X1_Y128= 158.947466 -89.137008 -158.947466 - X128_Y1= 95.372227 -135.677313 -175.9824 - X128_Y128= 118.642379 -89.137008 -199.252552 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 -ParisPhoswich - X1_Y1= 132.559704 -182.217618 -92.254617 - X1_Y128= 155.829857 -135.677313 -115.52477 - X128_Y1= 92.254617 -182.217618 -132.559704 - X128_Y128= 115.52477 -135.677313 -155.829857 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18 -ParisPhoswich - X1_Y1= 95.372227 -135.677313 175.9824 - X1_Y128= 118.642379 -89.137008 199.252552 - X128_Y1= 135.677313 -135.677313 135.677313 - X128_Y128= 158.947466 -89.137008 158.947466 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%19 -ParisPhoswich - X1_Y1= 135.677313 -135.677313 135.677313 - X1_Y128= 158.947466 -89.137008 158.947466 - X128_Y1= 175.9824 -135.677313 95.372227 - X128_Y128= 199.252552 -89.137008 118.642379 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%20 -ParisPhoswich - X1_Y1= 92.254617 -182.217618 132.559704 - X1_Y128= 115.52477 -135.677313 155.829857 - X128_Y1= 132.559704 -182.217618 92.254617 - X128_Y128= 155.829857 -135.677313 115.52477 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%21 -ParisPhoswich - X1_Y1= -175.9824 -135.677313 95.372227 - X1_Y128= -199.252552 -89.137008 118.642379 - X128_Y1= -135.677313 -135.677313 135.677313 - X128_Y128= -158.947466 -89.137008 158.947466 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22 -ParisPhoswich - X1_Y1= -135.677313 -135.677313 135.677313 - X1_Y128= -158.947466 -89.137008 158.947466 - X128_Y1= -95.372227 -135.677313 175.9824 - X128_Y128= -118.642379 -89.137008 199.252552 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%23 -ParisPhoswich - X1_Y1= -132.559704 -182.217618 92.254617 - X1_Y128= -155.829857 -135.677313 115.52477 - X128_Y1= -92.254617 -182.217618 132.559704 - X128_Y128= -115.52477 -135.677313 155.829857 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/ParisAll_278.detector b/Inputs/DetectorConfiguration/ParisAll_278.detector deleted file mode 100644 index 49a8d1f136eba180627448403e20f13d1d1f53e8..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/ParisAll_278.detector +++ /dev/null @@ -1,213 +0,0 @@ -%Fichier de configuration manip E225 -%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 -%Thickness in micrometer -%Radius in mm -%Temperature in K, Pressure in bar -%Material name according to the target library - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2 - NBLAYERS= 50 - X= 0 - Y= 0 - Z= 0 - - -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and R given in mm -%%Angle given in degree -%%Option: 0,1 for Si SiLi and CsI -%%Option: all or sensible for VISualisation - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Paris -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ParisCluster - X1_Y1= -87.401156 -247.587661 -124.767336 - X1_Y128= -224.125028 -149.474941 -109.227808 - X128_Y1= -87.401156 -274.025085 42.151993 - X128_Y128= -224.125028 -175.912365 57.691522 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -225.918041 -147.037454 -108.841748 - X1_Y128= -278.141913 11.712262 -83.698263 - X128_Y1= -225.918041 -173.474878 58.077582 - X128_Y128= -278.141913 -14.725162 83.221067 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -ParisCluster - X1_Y1= -278.141913 14.725162 -83.221067 - X1_Y128= -225.918041 173.474878 -58.077582 - X128_Y1= -278.141913 -11.712262 83.698263 - X128_Y128= -225.918041 147.037454 108.841748 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -ParisCluster - X1_Y1= -224.125028 175.912365 -57.691522 - X1_Y128= -87.401156 274.025085 -42.151993 - X128_Y1= -224.125028 149.474941 109.227808 - X128_Y128= -87.401156 247.587661 124.767336 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -ParisCluster - X1_Y1= 87.401156 274.025085 -42.151993 - X1_Y128= 224.125028 175.912365 -57.691522 - X128_Y1= 87.401156 247.587661 124.767336 - X128_Y128= 224.125028 149.474941 109.227808 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -ParisCluster - X1_Y1= 225.918041 173.474878 -58.077582 - X1_Y128= 278.141913 14.725162 -83.221067 - X128_Y1= 225.918041 147.037454 108.841748 - X128_Y128= 278.141913 -11.712262 83.698263 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -ParisCluster - X1_Y1= 278.141913 11.712262 -83.698263 - X1_Y128= 225.918041 -147.037454 -108.841748 - X128_Y1= 278.141913 -14.725162 83.221067 - X128_Y128= 225.918041 -173.474878 58.077582 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -ParisCluster - X1_Y1= 224.125028 -149.474941 -109.227808 - X1_Y128= 87.401156 -247.587661 -124.767336 - X128_Y1= 224.125028 -175.912365 57.691522 - X128_Y128= 87.401156 -274.025085 42.151993 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8ok -ParisCluster - X1_Y1= 84.5 87.401156 264.057357 - X1_Y128= -84.5 87.401156 264.057357 - X128_Y1= 84.5 224.125028 164.72165 - X128_Y128= -84.5 224.125028 164.72165 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9ok -ParisCluster - X1_Y1= 84.5 225.918041 162.253779 - X1_Y128= -84.5 225.918041 162.253779 - X128_Y1= 84.5 278.141913 1.525228 - X128_Y128= -84.5 278.141913 1.525228 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10ok -ParisCluster - X1_Y1= 84.5 278.141913 -1.525228 - X1_Y128= -84.5 278.141913 -1.525228 - X128_Y1= 84.5 225.918041 -162.253779 - X128_Y128= -84.5 225.918041 -162.253779 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11ok -ParisCluster - X1_Y1= 84.5 224.125028 -164.72165 - X1_Y128= -84.5 224.125028 -164.72165 - X128_Y1= 84.5 87.401156 -264.057357 - X128_Y128= -84.5 87.401156 -264.057357 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12ok -ParisCluster - X1_Y1= 84.5 84.5 -265 - X1_Y128= -84.5 84.5 -265 - X128_Y1= 84.5 -84.5 -265 - X128_Y128= -84.5 -84.5 -265 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13ok -ParisCluster - X1_Y1= 84.5 -87.401156 -264.057357 - X1_Y128= -84.5 -87.401156 -264.057357 - X128_Y1= 84.5 -224.125028 -164.72165 - X128_Y128= -84.5 -224.125028 -164.72165 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14ok -ParisCluster - X1_Y1= 84.5 -225.918041 -162.253779 - X1_Y128= -84.5 -225.918041 -162.253779 - X128_Y1= 84.5 -278.141913 -1.525228 - X128_Y128= -84.5 -278.141913 -1.525228 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15ok -ParisCluster - X1_Y1= 84.5 -278.141913 1.525228 - X1_Y128= -84.5 -278.141913 1.525228 - X128_Y1= 84.5 -225.918041 162.253779 - X128_Y128= -84.5 -225.918041 162.253779 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16ok -ParisCluster - X1_Y1= 84.5 -224.125028 164.72165 - X1_Y128= -84.5 -224.125028 164.72165 - X128_Y1= 84.5 -87.401156 264.057357 - X128_Y128= -84.5 -87.401156 264.057357 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17OK -ParisCluster - X1_Y1= 84.5 -84.5 265 - X1_Y128= -84.5 -84.5 265 - X128_Y1= 84.5 84.5 265 - X128_Y128= -84.5 84.5 265 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18ok -ParisCluster - X1_Y1= -256.780109 22.871011 -134.651931 - X1_Y128= -137.279063 41.565093 -252.681721 - X128_Y1= -219.852255 175.843938 -73.035235 - X128_Y128= -100.351209 194.53802 -191.065025 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%19ok -ParisCluster - X1_Y1= -99.997656 -125.919004 -242.178392 - X1_Y128= -136.92551 38.607501 -253.508118 - X128_Y1= -219.498702 -144.613086 -124.148602 - X128_Y128= -256.426556 19.913419 -135.478328 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%20ok -ParisCluster - X1_Y1= -136.571956 -38.662809 253.857318 - X1_Y128= -256.073002 -19.968727 135.827528 - X128_Y1= -99.644102 125.863696 242.527592 - X128_Y128= -219.145148 144.557778 124.497802 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%21ok -ParisCluster - X1_Y1= -219.498702 -175.899246 73.384435 - X1_Y128= -256.426556 -22.926319 135.001131 - X128_Y1= -99.997656 -194.593328 191.414225 - X128_Y128= -136.92551 -41.620401 253.030921 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22ok -ParisCluster - X1_Y1= 256.780109 -19.858111 135.129127 - X1_Y128= 137.279063 -38.552193 253.158917 - X128_Y1= 219.852255 144.668394 123.799401 - X128_Y128= 100.351209 125.974312 241.829191 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%23ok -ParisCluster - X1_Y1= 99.997656 -194.593328 191.414225 - X1_Y128= 136.92551 -41.620401 253.030921 - X128_Y1= 219.498702 -175.899246 73.384435 - X128_Y128= 256.426556 -22.926319 135.001131 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24ok -ParisCluster - X1_Y1= 136.571956 41.675709 -253.380122 - X1_Y128= 256.073002 22.981627 -135.350332 - X128_Y1= 99.644102 194.648636 -191.763426 - X128_Y128= 219.145148 175.954554 -73.733636 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%25ok -ParisCluster - X1_Y1= 219.498702 -144.613086 -124.148602 - X1_Y128= 256.426556 19.913419 -135.478328 - X128_Y1= 99.997656 -125.919004 -242.178392 - X128_Y128= 136.92551 38.607501 -253.508118 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/RRC66.detector b/Inputs/DetectorConfiguration/RRC66.detector index 619da4e0099c6bd43e194a421b7df21ec4d8d8c3..0f6a3389aa86374ac26da601ae531a7b66c0d8dc 100644 --- a/Inputs/DetectorConfiguration/RRC66.detector +++ b/Inputs/DetectorConfiguration/RRC66.detector @@ -1,191 +1,149 @@ -%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 -%Thickness in micrometer -%Radius in mm -%Temperature in K, Pressure in bar -%Material name according to the target library - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 18 - RADIUS= 30 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 - -%%CryoTarget -% THICKNESS= 3 -% RADIUS= 45 -% TEMPERATURE= 26 -% PRESSURE= 1 -% MATERIAL= D2 -% WINDOWSTHICKNESS= 0 -% WINDOWSMATERIAL= Mylar -% X= 0 -% Y= 0 -% Z= 0 -% -%%%%%%%%%%%%%%%%%%%%% -MUST2Array -%%%%%%% Telescope 1 %%%%%%% -M2Telescope -X1_Y1= 13.00 102.79 145.98 -X1_Y128= 24.88 10.58 175.20 -X128_Y1= 103.08 102.90 110.06 -X128_Y128= 115.23 10.76 139.14 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all - -%%%%%%% Telescope 2 %%%%%%% -M2Telescope -X1_Y1= -114.05 10.98 138.48 -X1_Y128= -23.81 10.92 174.84 -X128_Y1= -102.23 102.22 109.39 -X128_Y128= -11.95 102.90 145.48 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all - -%%%%%%% Telescope 3 %%%%%%% -M2Telescope -X1_Y1= -11.91 -103.68 146.50 -X1_Y128= -24.30 -10.94 175.00 -X128_Y1= -102.03 -103.39 110.36 -X128_Y128= -114.58 -10.71 138.76 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all - -%%%%%%% Telescope 4 %%%%%%% -M2Telescope -X1_Y1= 115.12 -11.35 138.94 -X1_Y128= 24.33 -11.60 174.81 -X128_Y1= 103.64 -103.42 110.51 -X128_Y128= 12.89 -103.90 146.29 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all -%%%%%%% Telescope 5 %%%%%%% + THICKNESS= 18 micrometer + RADIUS= 30 mm + MATERIAL= CD2 + ANGLE= 0 deg + X= 0 mm + Y= 0 mm + Z= 0 mm + +%%%%%%% Telescope 1 %%%%%%% +M2Telescope + X1_Y1= 13.00 102.79 145.98 + X1_Y128= 24.88 10.58 175.20 + X128_Y1= 103.08 102.90 110.06 + X128_Y128= 115.23 10.76 139.14 + SI= 1.00 + SILI= 0.00 + CSI= 1.00 + VIS= all + +%%%%%%% Telescope 2 %%%%%%% +M2Telescope + X1_Y1= -114.05 10.98 138.48 + X1_Y128= -23.81 10.92 174.84 + X128_Y1= -102.23 102.22 109.39 + X128_Y128= -11.95 102.90 145.48 + SI= 1.00 + SILI= 0.00 + CSI= 1.00 + VIS= all + +%%%%%%% Telescope 3 %%%%%%% +M2Telescope + X1_Y1= -11.91 -103.68 146.50 + X1_Y128= -24.30 -10.94 175.00 + X128_Y1= -102.03 -103.39 110.36 + X128_Y128= -114.58 -10.71 138.76 + SI= 1.00 + SILI= 0.00 + CSI= 1.00 + VIS= all + +%%%%%%% Telescope 4 %%%%%%% +M2Telescope + X1_Y1= 115.12 -11.35 138.94 + X1_Y128= 24.33 -11.60 174.81 + X128_Y1= 103.64 -103.42 110.51 + X128_Y128= 12.89 -103.90 146.29 + SI= 1.00 + SILI= 0.00 + CSI= 1.00 + VIS= all +%%%%%%% Telescope 5 %%%%%%% M2Telescope -X1_Y1= 27.07 50.23 -154.49 -X1_Y128= 116.58 50.23 -108.88 -X128_Y1= 27.07 -50.23 -154.49 -X128_Y128= 116.58 -50.23 -108.88 -SI= 1 -SILI= 1 -CSI= 0 -VIS= all -%%%%%%% Telescope 6 %%%%%%% + X1_Y1= 27.07 50.23 -154.49 + X1_Y128= 116.58 50.23 -108.88 + X128_Y1= 27.07 -50.23 -154.49 + X128_Y128= 116.58 -50.23 -108.88 + SI= 1 + SILI= 1 + CSI= 0 + VIS= all +%%%%%%% Telescope 6 %%%%%%% M2Telescope -X1_Y1= -50.23 50.23 365 -X1_Y128= -50.23 -50.23 365 -X128_Y128= 50.23 -50.23 365 -X128_Y1= 50.23 50.23 365 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all - -%%%%%%% Telescope 7 %%%%%%% + X1_Y1= -50.23 50.23 365 + X1_Y128= -50.23 -50.23 365 + X128_Y128= 50.23 -50.23 365 + X128_Y1= 50.23 50.23 365 + SI= 1 + SILI= 0 + CSI= 1 + VIS= all + +%%%%%%% Telescope 7 %%%%%%% M2Telescope -X1_Y1= 157.409 48.006 2.036 -X1_Y128= 126.458 48.227 94.002 -X128_Y1= 157.682 -48.007 1.617 -X128_Y128= 126.757 -49.052 93.510 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all + X1_Y1= 157.409 48.006 2.036 + X1_Y128= 126.458 48.227 94.002 + X128_Y1= 157.682 -48.007 1.617 + X128_Y128= 126.757 -49.052 93.510 + SI= 1 + SILI= 0 + CSI= 1 + VIS= all %%%%%%% Telescope 8 %%%%%%% M2Telescope -X1_Y1= -147.190 50.230 -57.940 -X1_Y128= -82.620 50.230 -134.900 -X128_Y1= -147.190 -50.230 -57.940 -X128_Y128= -82.620 -50.230 -134.900 -SI= 1 -SILI= 1 -CSI= 0 -VIS= all + X1_Y1= -147.190 50.230 -57.940 + X1_Y128= -82.620 50.230 -134.900 + X128_Y1= -147.190 -50.230 -57.940 + X128_Y128= -82.620 -50.230 -134.900 + SI= 1 + SILI= 1 + CSI= 0 + VIS= all -%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%% SSSDArray -%%%%%%%%%% Det 1 %%%%%%%% +%%%%%%%%%% Det 1 %%%%%%%% SSSD -A= 17.61 9.85 104.11 -B= 64.48 9.85 85.31 -C= 58.66 56.29 70.79 -D= 11.79 56.29 89.69 -% -%%%%%%%%%% Det 2 %%%%%%%% + A= 17.61 9.85 104.11 + B= 64.48 9.85 85.31 + C= 58.66 56.29 70.79 + D= 11.79 56.29 89.69 +% +%%%%%%%%%% Det 2 %%%%%%%% SSSD -A= -11.79 56.29 89.59 -B= -58.66 56.29 70.79 -C= -64.48 9.85 85.31 -D= -17.61 9.85 104.11 -% -%%%%%%%%%% Det 3 %%%%%%%% + A= -11.79 56.29 89.59 + B= -58.66 56.29 70.79 + C= -64.48 9.85 85.31 + D= -17.61 9.85 104.11 +% +%%%%%%%%%% Det 3 %%%%%%%% SSSD -A= -17.61 -9.85 104.11 -B= -64.48 -9.85 85.31 -C= -58.66 -56.29 70.79 -D= -11.79 -56.29 89.59 -% -%%%%%%%%%% Det 4 %%%%%%%% + A= -17.61 -9.85 104.11 + B= -64.48 -9.85 85.31 + C= -58.66 -56.29 70.79 + D= -11.79 -56.29 89.59 +% +%%%%%%%%%% Det 4 %%%%%%%% SSSD -A= 11.79 -56.29 89.59 -B= 58.66 -56.29 70.79 -C= 64.48 -9.85 85.31 -D= 17.61 -9.85 104.11 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ScintillatorPlastic + A= 11.79 -56.29 89.59 + B= 58.66 -56.29 70.79 + C= 64.48 -9.85 85.31 + D= 17.61 -9.85 104.11 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plastic - X= 0 - Y= -15 - Z= 318 - Shape= Square - Height= 70 - Width= 40 - Thickness= 20 - Scintillator= BC400 - LeadThickness= 0 + X= 0 + Y= -15 + Z= 318 + Shape= Square + Height= 70 + Width= 40 + Thickness= 20 + Scintillator= BC400 + LeadThickness= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plastic - X= 0 - Y= -15 - Z= 343 - Thickness= 30 - Shape= Square - Height= 70 - Width= 40 - Scintillator= BC400 - LeadThickness= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%Plastic -% THETA= 0 -% PHI= 0 -% R= 318 -% Thickness= 20 -% Radius= 20 -% Scintillator= BC400 -% LeadThickness= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%Plastic -% THETA= 0 -% PHI= 0 -% R= 343 -% Thickness= 30 -% Radius= 20 -% Scintillator= BC400 -% LeadThickness= 2 + X= 0 + Y= -15 + Z= 343 + Thickness= 30 + Shape= Square + Height= 70 + Width= 40 + Scintillator= BC400 + LeadThickness= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/Riken_65mm.detector b/Inputs/DetectorConfiguration/Riken_65mm.detector deleted file mode 100644 index 272195c59b4cf4582119e0a0efe56b586a0f933a..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/Riken_65mm.detector +++ /dev/null @@ -1,203 +0,0 @@ -%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 -%Thickness in micrometer -%Radius in mm -%Temperature in K, Pressure in bar -%Material name according to the target library - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Target -THICKNESS= 20 -RADIUS= 45 -MATERIAL= CD2 -ANGLE= 0 -X= 0 -Y= 0 -Z= 0 - -%CryoTarget -%THICKNESS= 250000 -%RADIUS= 45 -%TEMPERATURE= 300 -%PRESSURE= 1 -%MATERIAL= D2 -%WINDOWSTHICKNESS= 0 -%WINDOWSMATERIAL= Mylar -%X= 0 -%Y= 0 -%Z= 0 - -%%%%%%%%%%%%%%%%%%%%% -MUST2Array -%%%%%%% Telescope 1 %%%%%%% -M2Telescope -X1_Y1= 10.85 105.03 146.16 -X1_Y128= 22.8 9.84 175.95 -X128_Y1= 104.09 105.03 108.76 -X128_Y128= 116.04 9.84 138.55 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all - -%%%%%%% Telescope 2 %%%%%%% -M2Telescope -X1_Y1= -116.04 9.84 138.55 -X1_Y128= -22.8 9.84 175.95 -X128_Y1= -104.09 105.03 108.76 -X128_Y128= -10.85 105.03 146.16 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all - -%%%%%%% Telescope 3 %%%%%%% -M2Telescope -X1_Y1= -10.85 -105.03 146.16 -X1_Y128= -22.8 -9.84 175.95 -X128_Y1= -104.09 -105.03 108.76 -X128_Y128= -116.04 -9.84 138.55 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all - -%%%%%%% Telescope 4 %%%%%%% -M2Telescope -X1_Y1= 116.04 -9.84 138.55 -X1_Y128= 22.8 -9.84 175.95 -X128_Y1= 104.09 -105.03 108.76 -X128_Y128= 10.85 -105.03 146.16 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all - -%%%%%%% Telescope 5 %%%%%%% -M2Telescope -X1_Y1= -50.23 -50.23 365 -X1_Y128= 50.23 -50.23 365 -X128_Y1= -50.23 50.23 365 -X128_Y128= 50.23 50.23 365 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all -%%%%%%% Telescope 6 %%%%%%% -M2Telescope -X1_Y1= 155.77 50.23 8.18 -X1_Y128= 155.77 -50.23 8.18 -X128_Y1= 133.17 50.23 -89.7 -X128_Y128= 133.17 -50.23 -89.7 -SI= 1 -SILI= 1 -CSI= 0 -VIS= all -%% Alternate Telescope 6 %% -%M2Telescope -% THETA= -130 -% PHI= 0 -% R= 150 -% BETA= 0 0 0 -% SI= 1 -% SILI= 1 -% CSI= 0 -% VIS= all -%%%%%%% Telescope 7 %%%%%%% -M2Telescope -X1_Y1= 27.07 50.23 -154.49 -X1_Y128= 116.58 50.23 -108.88 -X128_Y1= 27.07 -50.23 -154.49 -X128_Y128= 116.58 -50.23 -108.88 -SI= 1 -SILI= 1 -CSI= 0 -VIS= all - -%%%%%%% Telescope 8 %%%%%%% -M2Telescope -X1_Y1= 27.07 50.23 -154.49 -X1_Y128= 116.58 50.23 -108.88 -X128_Y1= 27.07 -50.23 -154.49 -X128_Y128= 116.58 -50.23 -108.88 -SI= 1 -SILI= 1 -CSI= 0 -VIS= all - - -%%%%%%%%%%%%%%%%%%%%% -%SSSDArray -%%%%%%%%%% Det 1 %%%%%%%% -SSSD -A= 17.61 9.85 104.11 -B= 64.48 9.85 85.31 -C= 58.66 56.29 70.79 -D= 11.79 56.29 89.69 -% -%%%%%%%%%% Det 2 %%%%%%%% -SSSD -A= -11.79 56.29 89.59 -B= -58.66 56.29 70.79 -C= -64.48 9.85 85.31 -D= -17.61 9.85 104.11 -% -%%%%%%%%%% Det 3 %%%%%%%% -SSSD -A= -17.61 -9.85 104.11 -B= -64.48 -9.85 85.31 -C= -58.66 -56.29 70.79 -D= -11.79 -56.29 89.59 -% -%%%%%%%%%% Det 4 %%%%%%%% -SSSD -A= 11.79 -56.29 89.59 -B= 58.66 -56.29 70.79 -C= 64.48 -9.85 85.31 -D= 17.61 -9.85 104.11 -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%ScintillatorPlastic -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%Plastic -% X= 0 -% Y= -15 -% Z= 318 -% Shape= Square -% Height= 70 -% Width= 40 -% Thickness= 20 -% Scintillator= BC400 -% LeadThickness= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%Plastic -% X= 0 -% Y= -15 -% Z= 343 -% Thickness= 30 -% Shape= Square -% Height= 70 -% Width= 40 -% Scintillator= BC400 -% LeadThickness= 2 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%Plastic -% THETA= 0 -% PHI= 0 -% R= 318 -% Thickness= 20 -% Radius= 20 -% Scintillator= BC400 -% LeadThickness= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%Plastic -% THETA= 0 -% PHI= 0 -% R= 343 -% Thickness= 30 -% Radius= 20 -% Scintillator= BC400 -% LeadThickness= 2 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - diff --git a/Inputs/DetectorConfiguration/S1107.detector b/Inputs/DetectorConfiguration/S1107.detector index b89dd6c0c8b76e7972189646e396e5bfa6a96d45..aa3643488cf27e3f663e9a9552aa7766a023484a 100644 --- a/Inputs/DetectorConfiguration/S1107.detector +++ b/Inputs/DetectorConfiguration/S1107.detector @@ -2,71 +2,68 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 10.1469 - RADIUS= 5 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Sharc + THICKNESS= 10.1469 + RADIUS= 5 + MATERIAL= CD2 + ANGLE= 0 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Upstream CD - SharcQQQ - Z= -67 - R= 0 - Phi= 2 - ThicknessDector= 500 - SharcQQQ - Z= -67 - R= 0 - Phi= 92 - ThicknessDector= 500 - SharcQQQ - Z= -67 - R= 0 - Phi= 182 - ThicknessDector= 500 - SharcQQQ - Z= -67 - R= 0 - Phi= 272 - ThicknessDector= 500 +Sharc QQQ + Z= -67 + R= 0 + Phi= 2 + ThicknessDetector= 500 +Sharc QQQ + Z= -67 + R= 0 + Phi= 92 + ThicknessDetector= 500 +Sharc QQQ + Z= -67 + R= 0 + Phi= 182 + ThicknessDetector= 500 +Sharc QQQ + Z= -67 + R= 0 + Phi= 272 + ThicknessDetector= 500 %%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Upstream Box - SharcBOX - Z= -26.2466785 - ThicknessDector1= 500 - ThicknessDector2= 500 - ThicknessDector3= 500 - ThicknessDector4= 500 - ThicknessPAD1= 0 - ThicknessPAD2= 0 - ThicknessPAD3= 0 - ThicknessPAD4= 0 +Sharc BOX + Z= -26.2466785 + ThicknessDetector1= 500 + ThicknessDetector2= 500 + ThicknessDetector3= 500 + ThicknessDetector4= 500 + ThicknessPAD1= 0 + ThicknessPAD2= 0 + ThicknessPAD3= 0 + ThicknessPAD4= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % Down Stream Box - SharcBOX - Z= 29.943595 - ThicknessDector1= 140 - ThicknessDector2= 140 - ThicknessDector3= 140 - ThicknessDector4= 140 - ThicknessPAD1= 1500 - ThicknessPAD2= 1500 - ThicknessPAD3= 1500 - ThicknessPAD4= 1500 + % Down Stream Box +Sharc BOX + Z= 29.943595 + ThicknessDetector1= 140 + ThicknessDetector2= 140 + ThicknessDetector3= 140 + ThicknessDetector4= 140 + ThicknessPAD1= 1500 + ThicknessPAD2= 1500 + ThicknessPAD3= 1500 + ThicknessPAD4= 1500 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plastic - X= 0 - Y= 0 - Z= 400 - Thickness= 0.010 - Shape= Square - Height= 40 - Width= 40 - Scintillator= BC400 - LeadThickness= 0.005 + X= 0 + Y= 0 + Z= 400 + Thickness= 0.010 + Shape= Square + Height= 40 + Width= 40 + Scintillator= BC400 + LeadThickness= 0.005 diff --git a/Inputs/DetectorConfiguration/S1554.detector b/Inputs/DetectorConfiguration/S1554.detector index 18e25fcf17d1113d4369ee1d3333ceee292081d4..bfd23cef8d7db964a72630ddf83e8a3b7d695ded 100644 --- a/Inputs/DetectorConfiguration/S1554.detector +++ b/Inputs/DetectorConfiguration/S1554.detector @@ -4,13 +4,13 @@ GeneralTarget %0.2mg/cm2 Target - THICKNESS= 5.1 - RADIUS= 5 - MATERIAL= CD2 - ANGLE= 0 - X= 0.1635909 - Y= 0.910980 - Z= 0 + THICKNESS= 5.1 + RADIUS= 5 + MATERIAL= CD2 + ANGLE= 0 + X= 0.1635909 + Y= 0.910980 + Z= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%% Sharc @@ -61,7 +61,7 @@ Sharc ThicknessPAD3= 1500 ThicknessPAD4= 1500 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%% %Tigress Array Tigress %%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/SPcoincW1.detector b/Inputs/DetectorConfiguration/SPcoincW1.detector index ee60cd86468922148d09f9ab4233040167a94a00..940bbd2ef821cb1c3daff0e010897b7ea3548abd 100644 --- a/Inputs/DetectorConfiguration/SPcoincW1.detector +++ b/Inputs/DetectorConfiguration/SPcoincW1.detector @@ -1,61 +1,55 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 10 - RADIUS= 7.5 + THICKNESS= 10 micrometer + RADIUS= 7.5 mm MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 - - + Angle= 0 deg + X= 0 mm + Y= 0 mm + Z= 0 mm - -%%%%%%% Detector 1 %%%%%%% +%%%%%%% Detector 1 %%%%%%% W1 - THETA= 150 - PHI= 0 - R= 150 - BETA= 0 0 0 - VIS= all -%%%%%%% Detector 2 %%%%%%% + THETA= 150 deg + PHI= 0 deg + R= 150 mm + BETA= 0 0 0 deg + VIS= all +%%%%%%% Detector 2 %%%%%%% W1 - THETA= 150 - PHI= 0 - R= 150 - BETA= 0 0 0 - VIS= all -%%%%%%% Detector 3 %%%%%%% + THETA= 150 deg + PHI= 0 deg + R= 150 mm + BETA= 0 0 0 deg + VIS= all +%%%%%%% Detector 3 %%%%%%% W1 - THETA= 150 - PHI= 0 - R= 150 - BETA= 0 0 0 - VIS= all -%%%%%%% Detector 4 %%%%%%% + THETA= 150 deg + PHI= 0 deg + R= 150 mm + BETA= 0 0 0 deg + VIS= all +%%%%%%% Detector 4 %%%%%%% W1 - THETA= 150 - PHI= 0 - R= 150 - BETA= 0 0 0 - VIS= all -%%%%%%% Detector 5 %%%%%%% + THETA= 150 deg + PHI= 0 deg + R= 150 mm + BETA= 0 0 0 deg + VIS= all +%%%%%%% Detector 5 %%%%%%% W1 - THETA= 150 - PHI= 0 - R= 150 - BETA= 0 0 0 - VIS= all -%%%%%%% Detector 6 %%%%%%% + THETA= 150 deg + PHI= 0 deg + R= 150 mm + BETA= 0 0 0 deg + VIS= all +%%%%%%% Detector 6 %%%%%%% W1 - THETA= 150 - PHI= 0 - R= 150 - BETA= 0 0 0 - VIS= all - - + THETA= 150 deg + PHI= 0 deg + R= 150 mm + BETA= 0 0 0 deg + VIS= all %%%%%%% Splitpole %%%%%%% SplitPole diff --git a/Inputs/DetectorConfiguration/Sharc.detector b/Inputs/DetectorConfiguration/Sharc.detector index f1146d2767c6573384f1d78c2cd8c1a7fa81f5f6..5e8f9b58c2b43e680a03ad7c9b66e2d1aaffb058 100644 --- a/Inputs/DetectorConfiguration/Sharc.detector +++ b/Inputs/DetectorConfiguration/Sharc.detector @@ -4,13 +4,13 @@ GeneralTarget %0.2mg/cm2 Target - THICKNESS= 0.01 - RADIUS= 5 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 0.01 + RADIUS= 5 + MATERIAL= CD2 + ANGLE= 0 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%% Sharc @@ -84,13 +84,13 @@ Sharc ThicknessDector= 500 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plastic - X= 0 - Y= 0 - Z= 400 - Thickness= 0.025 - Shape= Square - Height= 40 - Width= 40 - Scintillator= BC400 - LeadThickness= 0.09 + X= 0 + Y= 0 + Z= 400 + Thickness= 0.025 + Shape= Square + Height= 40 + Width= 40 + Scintillator= BC400 + LeadThickness= 0.09 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/Spice.detector b/Inputs/DetectorConfiguration/Spice.detector index a3ce8e7f0a6cfb4fe67d4fcca77c2d4b04fe9459..fd6b30cc4d6e2317f6df4541f05f96bd250c74c7 100644 --- a/Inputs/DetectorConfiguration/Spice.detector +++ b/Inputs/DetectorConfiguration/Spice.detector @@ -4,26 +4,26 @@ GeneralTarget %0.2mg/cm2 Target - THICKNESS= 4.5 - RADIUS= 5 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 4.5 + RADIUS= 5 + MATERIAL= CD2 + ANGLE= 0 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Spice %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -MUST2Array -%%%%%%% Telescope 1 %%%%%%% +MUST2Array +%%%%%%% Telescope 1 %%%%%%% M2Telescope - THETA= 0 - PHI= 0 - R= 400 - BETA= 0 0 0 - SI= 1 - SILI= 1 - CSI= 1 - VIS= all + THETA= 0 + PHI= 0 + R= 400 + BETA= 0 0 0 + SI= 1 + SILI= 1 + CSI= 1 + VIS= all diff --git a/Inputs/DetectorConfiguration/TRex.detector b/Inputs/DetectorConfiguration/TRex.detector index a8fef0aa1e4a113a6ca195e08c67329c6b6764f6..add0c987fed5e88e48f85ed0da761dc7fa97ac5a 100644 --- a/Inputs/DetectorConfiguration/TRex.detector +++ b/Inputs/DetectorConfiguration/TRex.detector @@ -2,63 +2,55 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 5 - RADIUS= 5 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 5 + RADIUS= 5 + MATERIAL= CD2 + ANGLE= 0 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRex - Chamber= 1 + Chamber= 1 X= 0 - Y= 29 - Z= 33 - Shape= Square + Y= 29 + Z= 33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRex - X= 0 - Y= -29 - Z= 33 - Shape= Square + X= 0 + Y= -29 + Z= 33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRex - X= 29 - Y= 0 - Z= 33 - Shape= Square + X= 29 + Y= 0 + Z= 33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRex - X= -29 - Y= 0 - Z= 33 - Shape= Square + X= -29 + Y= 0 + Z= 33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRex - X= 0 - Y= 29 - Z= -33 - Shape= Square + X= 0 + Y= 29 + Z= -33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRex - X= 0 - Y= -29 - Z= -33 - Shape= Square + X= 0 + Y= -29 + Z= -33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRex - X= 29 - Y= 0 - Z= -33 - Shape= Square + X= 29 + Y= 0 + Z= -33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TRex - X= -29 - Y= 0 - Z= -33 - Shape= Square + X= -29 + Y= 0 + Z= -33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Sharc %%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/Tiara.detector b/Inputs/DetectorConfiguration/Tiara.detector index 72b911acab428b3c66d944ea8bd0b587af0c63cc..af6a05d500fb6539a648f859900405cda2d4d998 100644 --- a/Inputs/DetectorConfiguration/Tiara.detector +++ b/Inputs/DetectorConfiguration/Tiara.detector @@ -4,13 +4,13 @@ GeneralTarget %0.5mg/cm2 Target - THICKNESS= 4.8 - RADIUS= 5 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 4.8 + RADIUS= 5 + MATERIAL= CD2 + ANGLE= 0 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Tiara diff --git a/Inputs/DetectorConfiguration/Tigress.detector b/Inputs/DetectorConfiguration/Tigress.detector index 09f73a18a72e33fc639e6468072f5199a7b84184..aadf0f6e4141c65a0718c19155dc33fd1a08a215 100644 --- a/Inputs/DetectorConfiguration/Tigress.detector +++ b/Inputs/DetectorConfiguration/Tigress.detector @@ -2,28 +2,20 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 0.001 - RADIUS= 5 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 0.001 micrometer + RADIUS= 5 mm + MATERIAL= CD2 + ANGLE= 0 deg + X= 0 mm + Y= 0 mm + Z= 0 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Tigress -% Placing detector in the standard position -TigressStandard -%CloverId= 1 2 3 4 +Tigres sStandard CloverId= 5 6 7 8 9 10 11 12 13 14 15 16 % Free placing of detector at any arbitrary position -%TigressClover - CloverId= 19 - R= 150 - Phi= 0 - Theta= 0 - Beta= 0 0 0 - -% Adding the support Frame -TigressFrame - RightFrame= 1 - LeftFrame= 0 +Tigress Clover + CloverId= 19 + R= 150 + Phi= 0 + Theta= 0 + Beta= 0 0 0 diff --git a/Inputs/DetectorConfiguration/W1.detector b/Inputs/DetectorConfiguration/W1.detector index 6359de1cb3ea6a9c75a623124b9d70fff3a44c5a..ab72ff1ed33df3db8c5e2ed5f46c91d3acdfa57f 100644 --- a/Inputs/DetectorConfiguration/W1.detector +++ b/Inputs/DetectorConfiguration/W1.detector @@ -13,47 +13,47 @@ Target -%%%%%%% Detector 1 %%%%%%% +%%%%%%% Detector 1 %%%%%%% W1 - THETA= 150 - PHI= 0 - R= 150 - BETA= 0 0 0 - VIS= all -%%%%%%% Detector 2 %%%%%%% + THETA= 150 + PHI= 0 + R= 150 + BETA= 0 0 0 + VIS= all +%%%%%%% Detector 2 %%%%%%% W1 - THETA= 150 - PHI= 0 - R= 150 - BETA= 0 0 0 - VIS= all -%%%%%%% Detector 3 %%%%%%% + THETA= 150 + PHI= 0 + R= 150 + BETA= 0 0 0 + VIS= all +%%%%%%% Detector 3 %%%%%%% W1 - THETA= 150 - PHI= 0 - R= 150 - BETA= 0 0 0 - VIS= all -%%%%%%% Detector 4 %%%%%%% + THETA= 150 + PHI= 0 + R= 150 + BETA= 0 0 0 + VIS= all +%%%%%%% Detector 4 %%%%%%% W1 - THETA= 150 - PHI= 0 - R= 150 - BETA= 0 0 0 - VIS= all -%%%%%%% Detector 5 %%%%%%% + THETA= 150 + PHI= 0 + R= 150 + BETA= 0 0 0 + VIS= all +%%%%%%% Detector 5 %%%%%%% W1 - THETA= 150 - PHI= 0 - R= 150 - BETA= 0 0 0 - VIS= all -%%%%%%% Detector 6 %%%%%%% + THETA= 150 + PHI= 0 + R= 150 + BETA= 0 0 0 + VIS= all +%%%%%%% Detector 6 %%%%%%% W1 - THETA= 150 - PHI= 0 - R= 150 - BETA= 0 0 0 - VIS= all + THETA= 150 + PHI= 0 + R= 150 + BETA= 0 0 0 + VIS= all diff --git a/Inputs/DetectorConfiguration/csi.detector b/Inputs/DetectorConfiguration/csi.detector index bd499a276c04e17084f4806485279ae6eaf58423..771f5f7a1da777cff2ab39857503baa4d1841875 100644 --- a/Inputs/DetectorConfiguration/csi.detector +++ b/Inputs/DetectorConfiguration/csi.detector @@ -1,69 +1,61 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% Thickness in micrometer -% Radius in mm -% Temperature in K, Pressure in bar Target - THICKNESS= 0.1 - ANGLE= 0 - RADIUS= 10 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 0.1 micrometer + ANGLE= 0 deg + RADIUS= 10 mm + MATERIAL= CD2 + X= 0 mm + Y= 0 mm + Z= 0 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ScintillatorCsI -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%CsI - THETA= 0 - PHI= 0 - R= 0 - X= 0 - Y= 0 - Z= 15 - Thickness= 0.0001 - Shape= Trapezoidal - FaceFront= 1000 - FaceBack= 1000 - Radius= 0 - Scintillator= CsI - LeadThickness= 0 +CsI + THETA= 0 deg + PHI= 0 deg + R= 0 mm + X= 0 mm + Y= 0 mm + Z= 15 mm + Thickness= 1 mm + Shape= Trapezoidal + FaceFront= 100 mm + FaceBack= 100 mm + Radius= 0 mm + Scintillator= CsI + LeadThickness= 0 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ScintillatorPlastic %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plastic - THETA= 0 - PHI= 0 - R= 0 - X= 0 - Y= 0 - Z= 1 - Thickness= 1.0 - Shape= Square - Height= 10 - Width= 10 - Radius= 0 - Scintillator= Pb - LeadThickness= 0 + THETA= 0 deg + PHI= 0 deg + R= 0 mm + X= 0 mm + Y= 0 mm + Z= 100 mm + Thickness= 10.0 mm + Shape= Square + Height= 10 mm + Width= 10 mm + Scintillator= Pb + LeadThickness= 0 mm + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plastic - THETA= 0 - PHI= 0 - R= 0 - X= 0 - Y= 0 - Z= 250 - Thickness= 200 - Shape= Square - Height= 300 - Width= 300 - Radius= 0 - Scintillator= CsI - LeadThickness= 0 + THETA= 0 deg + PHI= 0 deg + R= 0 mm + X= 0 mm + Y= 0 mm + Z= 250 mm + Thickness= 20 mm + Shape= Square + Height= 20 mm + Width= 20 mm + Scintillator= CsI + LeadThickness= 0 mm + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Avaible material: % BC400 diff --git a/Inputs/DetectorConfiguration/e530.detector b/Inputs/DetectorConfiguration/e530.detector index 6bc7d415c1370e9fef03bce9845eb029eed8fe06..81bb6d593bec98e152d9c9b40680f03e7a298f9c 100644 --- a/Inputs/DetectorConfiguration/e530.detector +++ b/Inputs/DetectorConfiguration/e530.detector @@ -1,91 +1,68 @@ -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and distance given in mm -%%Angle given in degree -%% using the data from the experimental mesurement -%% special care is given for the X Y direction -%% NOTATTION USED IN THE FOLLOWING: -%% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 -%%Option: 0,1 for Si SiLi and CSI -%%Option: all or sensible for VISualisation -% 1.2 12.371134021 -% 2 20.618556701 -% 30 309.278350515 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Target - THICKNESS= 0.94 - RADIUS= 5 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + THICKNESS= 0.94 micrometer + RADIUS= 5 mm + MATERIAL= CD2 + ANGLE= 0 deg + X= 0 mm + Y= 0 mm + Z= 0 mm +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AnnularS1 - Z= -158.7 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -CATSArray + Z= -158.7 mm + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CATSDetector - X1_Y1= -34.36 -34.96 -962.5 - X28_Y1= 36.76 -34.96 -962.5 - X1_Y28= -34.36 36.16 -962.5 - X28_Y28= 36.76 36.16 -962.5 + X1_Y1= -34.36 -34.96 -962.5 mm + X28_Y1= 36.76 -34.96 -962.5 mm + X1_Y28= -34.36 36.16 -962.5 mm + X28_Y28= 36.76 36.16 -962.5 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 CATSDetector - X1_Y1= 34.26 -35.46 -562.5 - X28_Y1= -36.86 -35.46 -562.5 - X1_Y28= 34.26 35.66 -562.5 - X28_Y28= -36.86 35.66 -562.5 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -MUST2Array + X1_Y1= 34.26 -35.46 -562.5 mm + X28_Y1= -36.86 -35.46 -562.5 mm + X1_Y28= 34.26 35.66 -562.5 mm + X28_Y28= -36.86 35.66 -562.5 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 M2Telescope - X128_Y1= -49.00 126.15 -80.75 - X1_Y1= 48.32 125.69 -80.58 - X1_Y128= 48.11 63.19 -155.17 - X128_Y128= -49.17 63.68 -155.31 - SI= 1 - SILI= 1 - CSI= 0 - VIS= all + X128_Y1= -49.00 126.15 -80.75 mm + X1_Y1= 48.32 125.69 -80.58 mm + X1_Y128= 48.11 63.19 -155.17 mm + X128_Y128= -49.17 63.68 -155.31 mm + SI= 1 + SILI= 1 + CSI= 0 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 M2Telescope - X128_Y1= 127.24 47.54 -80.42 - X1_Y1= 127.19 -49.76 -80.60 - X1_Y128= 64.63 -49.65 -155.09 - X128_Y128= 64.67 47.67 -154.91 - SI= 1 - SILI= 1 - CSI= 0 - VIS= all + X128_Y1= 127.24 47.54 -80.42 mm + X1_Y1= 127.19 -49.76 -80.60 mm + X1_Y128= 64.63 -49.65 -155.09 mm + X128_Y128= 64.67 47.67 -154.91 mm + SI= 1 + SILI= 1 + CSI= 0 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 M2Telescope - X128_Y1= 48.56 -127.58 -80.30 - X1_Y1= -48.76 -127.60 -80.49 - X1_Y128= -48.61 -65.05 -154.94 - X128_Y128= 48.70 -65.06 -154.73 - SI= 1 - SILI= 1 - CSI= 0 - VIS= all + X128_Y1= 48.56 -127.58 -80.30 mm + X1_Y1= -48.76 -127.60 -80.49 mm + X1_Y128= -48.61 -65.05 -154.94 mm + X128_Y128= 48.70 -65.06 -154.73 mm + SI= 1 + SILI= 1 + CSI= 0 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 M2Telescope - X128_Y1= -127.11 -49.83 -81.11 - X1_Y1= -126.80 47.43 -80.86 - X1_Y128= -64.02 47.43 -155.13 - X128_Y128= -64.31 -49.84 -155.39 - SI= 1 - SILI= 1 - CSI= 0 - VIS= all + X128_Y1= -127.11 -49.83 -81.11 mm + X1_Y1= -126.80 47.43 -80.86 mm + X1_Y128= -64.02 47.43 -155.13 mm + X128_Y128= -64.31 -49.84 -155.39 mm + SI= 1 + SILI= 1 + CSI= 0 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Tiara TiaraChamber= 1 @@ -93,14 +70,14 @@ Tiara EXOGAMArray %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 EXOGAMClover - ANGLES_FILE= angles_exogam_clover0.txt + ANGLES_FILE= angles_exogam_clover0.txt %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 EXOGAMClover - ANGLES_FILE= angles_exogam_clover1.txt + ANGLES_FILE= angles_exogam_clover1.txt %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 EXOGAMClover - ANGLES_FILE= angles_exogam_clover2.txt + ANGLES_FILE= angles_exogam_clover2.txt %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 EXOGAMClover - ANGLES_FILE= angles_exogam_clover3.txt + ANGLES_FILE= angles_exogam_clover3.txt %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 diff --git a/Inputs/DetectorConfiguration/e552.detector b/Inputs/DetectorConfiguration/e552.detector index 1bd9618f816b02da893c340f04845e8aaeb1fc71..7861d1791123aaa609918fb351bba0c335f6e061 100755 --- a/Inputs/DetectorConfiguration/e552.detector +++ b/Inputs/DetectorConfiguration/e552.detector @@ -1,172 +1,149 @@ - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% Thickness in micrometer -% Radius in mm -% Temperature in K, Pressure in bar +%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 3.2 - ANGLE= 20 - RADIUS= 24 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 - -%%%%%%%%%%%%%%%%%%%%% -MUST2Array -%%%%%%%%%%%%%%%%%%%%% - -%%%%%%% Telescope 1 = mechanics2.pdf no1 with y<>z %%%%%%% -M2Telescope -X1_Y1= 13.38 102.64 146.39 -X1_Y128= 25.14 10.62 175.69 -X128_Y1= 103.73 102.64 110.42 -X128_Y128= 115.54 10.70 139.68 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all - -%%%%%%% Telescope 2 = mechanics2.pdf no2 with y<>z %%%%%%% -M2Telescope -X1_Y1= -114.11 10.23 138.88 -X1_Y128= -23.89 10.34 175.22 -X128_Y1= -102.56 102.33 109.73 -X128_Y128= -12.33 102.47 146.06 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all - -%%%%%%% Telescope 3 = mechanics2.pdf no3 with y<>z & -x %%%%%%% -M2Telescope -X1_Y1= -12.42 -103.75 146.62 -X1_Y128= -24.17 -11.63 175.45 -X128_Y1= -102.70 -103.88 110.29 -X128_Y128= -114.44 -11.78 139.11 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all - -%%%%%%% Telescope 4 = mechanics2.pdf no4 with y<>z %%%%%%% -M2Telescope -X1_Y1= 115.22 -11.58 139.29 -X1_Y128= 24.87 -11.54 175.28 -X128_Y1= 103.79 -103.89 110.54 -X128_Y128= 13.44 -103.84 146.53 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all + THICKNESS= 3.2 micrometer + ANGLE= 20 deg + RADIUS= 24 mm + MATERIAL= CD2 + X= 0 mm + Y= 0 mm + Z= 0 mm +%%%%%%% Telescope 1 = mechanics2.pdf no1 with y<>z %%%%%%% +M2Telescope + X1_Y1= 13.38 102.64 146.39 mm + X1_Y128= 25.14 10.62 175.69 mm + X128_Y1= 103.73 102.64 110.42 mm + X128_Y128= 115.54 10.70 139.68 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all + +%%%%%%% Telescope 2 = mechanics2.pdf no2 with y<>z %%%%%%% +M2Telescope + X1_Y1= -114.11 10.23 138.88 mm + X1_Y128= -23.89 10.34 175.22 mm + X128_Y1= -102.56 102.33 109.73 mm + X128_Y128= -12.33 102.47 146.06 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all + +%%%%%%% Telescope 3 = mechanics2.pdf no3 with y<>z & -x %%%%%%% +M2Telescope + X1_Y1= -12.42 -103.75 146.62 mm + X1_Y128= -24.17 -11.63 175.45 mm + X128_Y1= -102.70 -103.88 110.29 mm + X128_Y128= -114.44 -11.78 139.11 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all + +%%%%%%% Telescope 4 = mechanics2.pdf no4 with y<>z %%%%%%% +M2Telescope + X1_Y1= 115.22 -11.58 139.29 mm + X1_Y128= 24.87 -11.54 175.28 mm + X128_Y1= 103.79 -103.89 110.54 mm + X128_Y128= 13.44 -103.84 146.53 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all %%%%%%% Telescope 5 = mechanics2.pdf no7 with y<>z & -x %%%%%%% M2Telescope -X1_Y1= 173.26 -2.56 -65.31 -X1_Y128= 116.26 -3.01 -144.1 -X128_Y1= 149.29 90.19 -48.48 -X128_Y128= 92.28 89.75 -127.29 -SI= 1 -SILI= 1 -CSI= 0 -VIS= all - -%%%%%%% Telescope 6 = mechanics2.pdf no5 with y<>z %%%%%%% -M2Telescope -X1_Y1= -139.15 108.71 -35.67 -X128_Y1= -130.34 108.76 61.22 -X1_Y128= -181.05 20.86 -31.71 -X128_Y128= -172.23 20.92 65.41 - -SI= 1 -SILI= 0 -CSI= 1 -VIS= all - -%%%%%%% Telescope 7 = mechanics2.pdf no6 with y<>z & -x %%%%%%% -M2Telescope -X1_Y1= -174.31 1.39 65.07 -X128_Y1= -145.33 -91.15 62.71 -X1_Y128= -182.91 1.17 -32.05 -X128_Y128= -153.93 -91.63 -34.41 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all - -%%%%%%% Telescope 8 = mechanics2.pdf no8 with y<>z & -x %%%%%%% -M2Telescope -X1_Y1= 80.72 -109.73 -118.89 -X128_Y1= 138.0 -109.34 -40.61 -X1_Y128= 114.34 -21.77 -143.95 -X128_Y128= 171.66 -21.34 -65.46 -SI= 1 -SILI= 1 -CSI= 0 -VIS= all - -%%%%%%%%%%%%%%%%%%%% -SSSDArray -%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%% Det 1 %%%%%%%% + X1_Y1= 173.26 -2.56 -65.31 mm + X1_Y128= 116.26 -3.01 -144.1 mm + X128_Y1= 149.29 90.19 -48.48 mm + X128_Y128= 92.28 89.75 -127.29 mm + SI= 1 + SILI= 1 + CSI= 0 + VIS= all + +%%%%%%% Telescope 6 = mechanics2.pdf no5 with y<>z %%%%%%% +M2Telescope + X1_Y1= -139.15 108.71 -35.67 mm + X128_Y1= -130.34 108.76 61.22 mm + X1_Y128= -181.05 20.86 -31.71 mm + X128_Y128= -172.23 20.92 65.41 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all + +%%%%%%% Telescope 7 = mechanics2.pdf no6 with y<>z & -x %%%%%%% +M2Telescope + X1_Y1= -174.31 1.39 65.07 mm + X128_Y1= -145.33 -91.15 62.71 mm + X1_Y128= -182.91 1.17 -32.05 mm + X128_Y128= -153.93 -91.63 -34.41 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all + +%%%%%%% Telescope 8 = mechanics2.pdf no8 with y<>z & -x %%%%%%% +M2Telescope + X1_Y1= 80.72 -109.73 -118.89 mm + X128_Y1= 138.0 -109.34 -40.61 mm + X1_Y128= 114.34 -21.77 -143.95 mm + X128_Y128= 171.66 -21.34 -65.46 mm + SI= 1 + SILI= 1 + CSI= 0 + VIS= all + +%%%%%%%%% Det 1 %%%%%%%% SSSD -A= 18.23 11.03 101.17 -B= 65.10 11.03 82.37 -C= 59.28 57.46 67.84 -D= 12.41 57.46 86.64 - -%%%%%%%%% Det 2 %%%%%%%% -SSSD -A= -12.41 57.46 86.64 -B= -59.28 57.46 67.84 -C= -65.10 11.03 82.37 -D= -18.23 11.03 101.17 - -%%%%%%%%% Det 3 %%%%%%%% -SSSD -A= -18.23 -11.03 101.17 -B= -65.10 -11.03 82.37 -C= -59.28 -57.46 67.84 -D= -12.41 -57.46 86.64 - -%%%%%%%%% Det 4 %%%%%%%% -SSSD -A= 12.41 -57.46 86.64 -B= 59.28 -57.46 67.84 -C= 65.10 -11.03 82.37 -D= 18.23 -11.03 101.17 - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -CATSArray + A= 18.23 11.03 101.17 mm + B= 65.10 11.03 82.37 mm + C= 59.28 57.46 67.84 mm + D= 12.41 57.46 86.64 mm + +%%%%%%%%% Det 2 %%%%%%%% +SSSD + A= -12.41 57.46 86.64 mm + B= -59.28 57.46 67.84 mm + C= -65.10 11.03 82.37 mm + D= -18.23 11.03 101.17 mm + +%%%%%%%%% Det 3 %%%%%%%% +SSSD + A= -18.23 -11.03 101.17 mm + B= -65.10 -11.03 82.37 mm + C= -59.28 -57.46 67.84 mm + D= -12.41 -57.46 86.64 mm + +%%%%%%%%% Det 4 %%%%%%%% +SSSD + A= 12.41 -57.46 86.64 mm + B= 59.28 -57.46 67.84 mm + C= 65.10 -11.03 82.37 mm + D= 18.23 -11.03 101.17 mm + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CATSDetector - X1_Y1= -34.39 -34.39 -960.6 - X28_Y1= 34.39 -34.39 -960.6 - X1_Y28= -34.39 34.39 -960.6 - X28_Y28= 34.39 34.39 -960.6 + X1_Y1= -34.39 -34.39 -960.6 mm + X28_Y1= 34.39 -34.39 -960.6 mm + X1_Y28= -34.39 34.39 -960.6 mm + X28_Y28= 34.39 34.39 -960.6 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CATSDetector - X1_Y1= 34.39 -34.39 -145.6 - X28_Y1= -34.39 -34.39 -145.6 - X1_Y28= 34.39 34.39 -145.6 - X28_Y28= -34.39 34.39 -145.6 + X1_Y1= 34.39 -34.39 -145.6 mm + X28_Y1= -34.39 -34.39 -145.6 mm + X1_Y28= 34.39 34.39 -145.6 mm + X28_Y28= -34.39 34.39 -145.6 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -IonisationChamber -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - Chio -A= -30. -30. 600. -B= 30. -30. 600. -C= -30. 30. 600. -D= 30. 30. 600. + A= -30. -30. 600. mm + B= 30. -30. 600. mm + C= -30. 30. 600. mm + D= 30. 30. 600. mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ScintillatorPlastic @@ -174,19 +151,15 @@ ScintillatorPlastic %% warning all parameters need to be there for routine to exit %Plastic - THETA= 0 - PHI= 0 - R= 0 - X= 0 - Y= 0 - Z= 800 - Thickness= 20 - Shape= Square - Height= 30 - Width= 30 - Radius= 0 - Scintillator= BC400 - LeadThickness= 0 + THETA= 0 deg + PHI= 0 deg + R= 0 mm + Thickness= 20 mm + Shape= Square + Height= 30 mm + Width= 30 mm + Scintillator= BC400 + LeadThickness= 0 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/e582.detector b/Inputs/DetectorConfiguration/e582.detector index 6e3ac44b8ced8854715e8aab25e53c4e199c348f..336857ddea2259a9bb4b8e3fadf92722d69511d5 100644 --- a/Inputs/DetectorConfiguration/e582.detector +++ b/Inputs/DetectorConfiguration/e582.detector @@ -1,156 +1,169 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Target - THICKNESS= 1.29870130 - RADIUS= 30 - MATERIAL= Ca - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -MUST2Array -%%%%%%% Bloc Telescope 1 %%%%%%% -M2Telescope -X1_Y1= -122.76 105.03 34.29 -X1_Y128= -149.81 9.84 51.57 -X128_Y1= -68.67 105.03 118.94 -X128_Y128= -95.71 9.84 136.22 -SI= 1 -SILI= 1 -CSI= 1 -VIS= all -%%%%%%% Bloc Telescope 2 %%%%%%% -M2Telescope -X1_Y1= -138.89 9.84 -91.8 -X1_Y128= -158.29 9.84 6.77 -X128_Y1= -107.4 105.03 -85.6 -X128_Y128= -126.8 105.03 12.97 -SI= 1 -SILI= 1 -CSI= 1 -VIS= all -%%%%%%% Bloc Telescope 3 %%%%%%% -M2Telescope -X1_Y1= -126.8 -105.03 12.97 -X1_Y128= -158.29 -9.84 6.77 -X128_Y1= -107.4 -105.03 -85.6 -X128_Y128= -138.89 -9.84 -91.8 -SI= 1 -SILI= 1 -CSI= 1 -VIS= all -%%%%%%% Bloc Telescope 4 %%%%%%% -M2Telescope -X1_Y1= -95.71 -9.84 136.22 -X1_Y128= -149.81 -9.84 51.57 -X128_Y1= -68.67 -105.03 118.94 -X128_Y128= -122.76 -105.03 34.29 -SI= 1 -SILI= 1 -CSI= 1 -VIS= all -%%%%%%% Telescope 5 à l'arrière côté gauche du faisceau %%%%%%% -M2Telescope -X1_Y1= 19.24 -50.23 -157.01 -X1_Y128= 19.24 50.23 -157.01 -X128_Y1= 109.91 -50.23 -113.76 -X128_Y128= 109.91 50.23 -113.76 -SI= 1 -SILI= 1 -CSI= 0 -VIS= all -%%%%%%% Telescope 6 collé à l'arrière du bloc %%%%%%% -M2Telescope -X1_Y1= -108 50.23 -115.58 -X1_Y128= -16.62 50.23 -157.31 -X128_Y1= -108 -50.23 -115.58 -X128_Y128= -16.62 -50.23 -157.31 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all -%%%%%%% Telescope 7 à l'avant côté gauche du faisceau %%%%%%% -M2Telescope -X1_Y1= 145.63 50.23 61.77 -X1_Y128= 79.06 50.23 137.01 -X128_Y1= 145.63 -50.23 61.77 -X128_Y128= 79.06 -50.23 137.01 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all -%%%%%%% Telescope 8 en face du bloc %%%%%%% -M2Telescope -X1_Y1= 157.58 -50.23 13.83 -X1_Y128= 134.13 -50.23 -83.86 -X128_Y1= 157.58 50.23 13.83 -X128_Y128= 134.13 50.23 -83.86 -SI= 1 -SILI= 1 -CSI= 0 -VIS= all + THICKNESS= 1.29870130 micrometer + RADIUS= 30 mm + MATERIAL= Ca + ANGLE= 0 deg + X= 0 deg + Y= 0 deg + Z= 0 deg +%%%%%%% Bloc Telescope 1 %%%%%%% +M2Telescope + X1_Y1= -122.76 105.03 34.29 mm + X1_Y128= -149.81 9.84 51.57 mm + X128_Y1= -68.67 105.03 118.94 mm + X128_Y128= -95.71 9.84 136.22 mm + SI= 1 + SILI= 1 + CSI= 1 + VIS= all +%%%%%%% Bloc Telescope 2 %%%%%%% +M2Telescope + X1_Y1= -138.89 9.84 -91.8 mm + X1_Y128= -158.29 9.84 6.77 mm + X128_Y1= -107.4 105.03 -85.6 mm + X128_Y128= -126.8 105.03 12.97 mm + SI= 1 + SILI= 1 + CSI= 1 + VIS= all +%%%%%%% Bloc Telescope 3 %%%%%%% +M2Telescope + X1_Y1= -126.8 -105.03 12.97 mm + X1_Y128= -158.29 -9.84 6.77 mm + X128_Y1= -107.4 -105.03 -85.6 mm + X128_Y128= -138.89 -9.84 -91.8 mm + SI= 1 + SILI= 1 + CSI= 1 + VIS= all +%%%%%%% Bloc Telescope 4 %%%%%%% +M2Telescope + X1_Y1= -95.71 -9.84 136.22 mm + X1_Y128= -149.81 -9.84 51.57 mm + X128_Y1= -68.67 -105.03 118.94 mm + X128_Y128= -122.76 -105.03 34.29 mm + SI= 1 + SILI= 1 + CSI= 1 + VIS= all +%%%%%%% Telescope 5 à l'arrière côté gauche du faisceau %%%%%%% +M2Telescope + X1_Y1= 19.24 -50.23 -157.01 mm + X1_Y128= 19.24 50.23 -157.01 mm + X128_Y1= 109.91 -50.23 -113.76 mm + X128_Y128= 109.91 50.23 -113.76 mm + SI= 1 + SILI= 1 + CSI= 0 + VIS= all +%%%%%%% Telescope 6 collé à l'arrière du bloc %%%%%%% +M2Telescope + X1_Y1= -108 50.23 -115.58 mm + X1_Y128= -16.62 50.23 -157.31 mm + X128_Y1= -108 -50.23 -115.58 mm + X128_Y128= -16.62 -50.23 -157.31 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all +%%%%%%% Telescope 7 à l'avant côté gauche du faisceau %%%%%%% +M2Telescope + X1_Y1= 145.63 50.23 61.77 mm + X1_Y128= 79.06 50.23 137.01 mm + X128_Y1= 145.63 -50.23 61.77 mm + X128_Y128= 79.06 -50.23 137.01 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all +%%%%%%% Telescope 8 en face du bloc %%%%%%% +M2Telescope + X1_Y1= 157.58 -50.23 13.83 mm + X1_Y128= 134.13 -50.23 -83.86 mm + X128_Y1= 157.58 50.23 13.83 mm + X128_Y128= 134.13 50.23 -83.86 mm + SI= 1 + SILI= 1 + CSI= 0 + VIS= all %%%%%%%%%%%%%%%%SPEG Spectrometer%%%%%%%%%%%%% SPEG -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -dotrx -nmesx= 4 -nomx= x11 -zx= 168.2 iev= 1 dx= 3.5 x0= 14838.0 etalx= .0025 ievd= 11 z= 16384.0 f= 100.0 -nomx= x12 -zx= 173.2 iev= 2 dx= 3.5 x0= 14910.0 etalx= .0025 ievd= 12 z= 16384.0 f= 100.0 -nomx= x21 -zx= 240.3 iev= 3 dx= 3.5 x0= 14148.0 etalx= .0025 ievd= 13 z= 16384.0 f= 100.0 -nomx= x22 -zx= 245.3 iev= 4 dx= 3.5 x0= 14238.0 etalx= .0025 ievd= 14 z= 16384.0 f= 100.0 -nax= 42 fax= 200000.0 zax= 16384.0 -nbx= 43 fbx= 100.0 zbx= 16384.0 -ichix= 44 fchix= 100.0 -nfx= 45 nfoc= 8.0 zfoc= 164.0 ffx= 400.0 zfx= 16384.0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -dotry -nmesy= 4 -zy= 168.2 iev= 5 dy= 3.5 y0= 460.0 etaly= .00512 ievd= 21 z= 4096.0 f= 100.0 -zy= 173.2 iev= 6 dy= 3.5 y0= 436.0 etaly= .00512 ievd= 22 z= 4096.0 f= 100.0 -zy= 240.3 iev= 7 dy= 3.5 y0= 460.0 etaly= .00512 ievd= 23 z= 4096.0 f= 100.0 -zy= 245.3 iev= 8 dy= 3.5 y0= 451.0 etaly= .00512 ievd= 24 z= 4096.0 f= 100.0 -nay= 55 fay= 2000000.0 zay= 16000.0 -nby= 53 fby= 100000.0 zby= 4096.0 -ichiy= 54 fchiy= 100.0 -nfy= 52 nfoc= 0.0 zfoc= 165.0 ffy= 100. zfy= 16000.0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Coefficients -alpha0= 1.5 alpha1= 1.5 alpha2= 1.5 alpha3= 1.6 -tema= 20000.0000000 temb= 1.000000 -tcora= 0.4e-5 tcorb= 12000.0000000 -cmsurqa= 8.e-6 cmsurqb= 3000.0000000 -za= 0.600000 zb= 20000.0000000 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + dotrx + nmesx= 4 + nomx= x11 + zx= 168.2 iev= 1 dx= 3.5 x0= 14838.0 etalx= .0025 ievd= 11 z= 16384.0 f= 100.0 + nomx= x12 + zx= 173.2 iev= 2 dx= 3.5 x0= 14910.0 etalx= .0025 ievd= 12 z= 16384.0 f= 100.0 + nomx= x21 + zx= 240.3 iev= 3 dx= 3.5 x0= 14148.0 etalx= .0025 ievd= 13 z= 16384.0 f= 100.0 + nomx= x22 + zx= 245.3 iev= 4 dx= 3.5 x0= 14238.0 etalx= .0025 ievd= 14 z= 16384.0 f= 100.0 + nax= 42 fax= 200000.0 zax= 16384.0 + nbx= 43 fbx= 100.0 zbx= 16384.0 + ichix= 44 fchix= 100.0 + nfx= 45 nfoc= 8.0 zfoc= 164.0 ffx= 400.0 zfx= 16384.0 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + dotry + nmesy= 4 + zy= 168.2 iev= 5 dy= 3.5 y0= 460.0 etaly= .00512 ievd= 21 z= 4096.0 f= 100.0 + zy= 173.2 iev= 6 dy= 3.5 y0= 436.0 etaly= .00512 ievd= 22 z= 4096.0 f= 100.0 + zy= 240.3 iev= 7 dy= 3.5 y0= 460.0 etaly= .00512 ievd= 23 z= 4096.0 f= 100.0 + zy= 245.3 iev= 8 dy= 3.5 y0= 451.0 etaly= .00512 ievd= 24 z= 4096.0 f= 100.0 + nay= 55 fay= 2000000.0 zay= 16000.0 + nby= 53 fby= 100000.0 zby= 4096.0 + ichiy= 54 fchiy= 100.0 + nfy= 52 nfoc= 0.0 zfoc= 165.0 ffy= 100. zfy= 16000.0 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + Coefficients + alpha0= 1.5 alpha1= 1.5 alpha2= 1.5 alpha3= 1.6 + tema= 20000.0000000 temb= 1.000000 + tcora= 0.4e-5 tcorb= 12000.0000000 + cmsurqa= 8.e-6 cmsurqb= 3000.0000000 + za= 0.600000 zb= 20000.0000000 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -degree_of_calibration_angle_with_Brho= 1 -degree_of_correction_angle_with_Brho= 1 + degree_of_calibration_angle_with_Brho= 1 + degree_of_correction_angle_with_Brho= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%EXL%%%%%%%%%%%%%%%%%%%%%%%%%% EXL -NumberOfCrystal= 18 -CsI_X_Y_Z= -1.956 48.401 -82.301 -CsI_X_Y_Z= 11.973 49.194 -76.1 -CsI_X_Y_Z= 33.85 82.032 -15.711 -CsI_X_Y_Z= 47.211 81.194 -8.369 -CsI_X_Y_Z= -21.958 80.001 -42.184 -CsI_X_Y_Z= -8.103 80.908 -35.833 -CsI_X_Y_Z= 54.018 50.157 -56.162 -CsI_X_Y_Z= 67.311 49.454 -48.684 -CsI_X_Y_Z= 6.304 82.469 -29.756 -CsI_X_Y_Z= 19.943 82.504 -22.894 -CsI_X_Y_Z= -11.619 65.279 -62.922 -CsI_X_Y_Z= 2.275 66.134 -56.648 -CsI_X_Y_Z= 26.508 50.531 -70.279 -CsI_X_Y_Z= 40.151 50.576 -63.424 -CsI_X_Y_Z= 16.748 67.591 -50.703 -CsI_X_Y_Z= 30.389 67.631 -43.845 -CsI_X_Y_Z= 44.275 67.183 -36.621 -CsI_X_Y_Z= 57.601 66.409 -29.208 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + POS= -1.956 48.401 -82.301 +EXL + POS= 11.973 49.194 -76.1 +EXL + POS= 33.85 82.032 -15.711 +EXL + POS= 47.211 81.194 -8.369 +EXL + POS= -21.958 80.001 -42.184 +EXL + POS= -8.103 80.908 -35.833 +EXL + POS= 54.018 50.157 -56.162 +EXL + POS= 67.311 49.454 -48.684 +EXL + POS= 6.304 82.469 -29.756 +EXL + POS= 19.943 82.504 -22.894 +EXL + POS= -11.619 65.279 -62.922 +EXL + POS= 2.275 66.134 -56.648 +EXL + POS= 26.508 50.531 -70.279 +EXL + POS= 40.151 50.576 -63.424 +EXL + POS= 16.748 67.591 -50.703 +EXL + POS= 30.389 67.631 -43.845 +EXL + POS= 44.275 67.183 -36.621 +EXL + POS= 57.601 66.409 -29.208 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TAC %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -159,8 +172,8 @@ TAC - - - + + + diff --git a/Inputs/DetectorConfiguration/e611.detector b/Inputs/DetectorConfiguration/e611.detector index ce70b0bd7e67bb1e93ea42ff2eb2491975e06eef..628e36fd274cbfd5bd385c0cfe7a320e7a9e5d18 100644 --- a/Inputs/DetectorConfiguration/e611.detector +++ b/Inputs/DetectorConfiguration/e611.detector @@ -1,54 +1,42 @@ - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% Thickness in micrometer -% Radius in mm -% Temperature in K, Pressure in bar Target - THICKNESS= 2.92 - RADIUS= 24 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -CATSArray -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - + THICKNESS= 2.92 micrometer + RADIUS= 24 mm + MATERIAL= CD2 + ANGLE= 0 deg + X= 0 mm + Y= 0 mm + Z= 0 mm %%%%%%%%%%%%% Cats 1 %%%%%%%%%%% CATSDetector - X1_Y1= -34.36 -34.96 -1787 - X28_Y1= 36.76 -34.96 -1787 - X1_Y28= -34.36 36.16 -1787 - X28_Y28= 36.76 36.16 -1787 + X1_Y1= -34.36 -34.96 -1787 mm + X28_Y1= 36.76 -34.96 -1787 mm + X1_Y28= -34.36 36.16 -1787 mm + X28_Y28= 36.76 36.16 -1787 mm %%%%%%%%%%%%% Cats 2 %%%%%%%%%%% CATSDetector - X1_Y1= 34.26 -35.46 -1155 - X28_Y1= -36.86 -35.46 -1155 - X1_Y28= 34.26 35.66 -1155 - X28_Y28= -36.86 35.66 -1155 + X1_Y1= 34.26 -35.46 -1155 mm + X28_Y1= -36.86 -35.46 -1155 mm + X1_Y28= 34.26 35.66 -1155 mm + X28_Y28= -36.86 35.66 -1155 mm %%%%%%%%%%%%%%%%%%% ChateauCristal %%%%%%%%%%%%%%%%%%% ANGLES_FILE= BaF_geometry.geo.nicolas - -%%%%%%%%%%%%%%%%%%%% -CDArray + +%%%%%%%%%%%%%%%%%%%% +CDArray %%%%%%%%%%%%%%%%%%%% -%%%%%%%%% Detector 1 %%%%%%%% +%%%%%%%%% Detector 1 %%%%%%%% -%%%%%%%%% Detector 2 %%%%%%%% +%%%%%%%%% Detector 2 %%%%%%%% -%%%%%%%%% Detector 3 %%%%%%%% +%%%%%%%%% Detector 3 %%%%%%%% -%%%%%%%%% Detector 4 %%%%%%%% +%%%%%%%%% Detector 4 %%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -60,10 +48,10 @@ IonisationChamber %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Chio -A= -30. -30. 600. -B= 30. -30. 600. -C= -30. 30. 600. -D= 30. 30. 600. +A= -30. -30. 600. mm +B= 30. -30. 600. mm +C= -30. 30. 600. mm +D= 30. 30. 600. mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ScintillatorPlastic @@ -72,19 +60,15 @@ ScintillatorPlastic %% all parameters need to be there for routine to exit Plastic - THETA= 0 - PHI= 0 - R= 0 - X= 0 - Y= 0 - Z= 800 - Thickness= 20 - Shape= Square - Height= 30 - Width= 30 - Radius= 0 - Scintillator= BC400 - LeadThickness= 0 + X= 0 mm + Y= 0 mm + Z= 800 mm + Thickness= 20 mm + Shape= Square + Height= 30 mm + Width= 30 mm + Scintillator= BC400 + LeadThickness= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/e628.detector b/Inputs/DetectorConfiguration/e628.detector index 4892f6d01fcd8ec27112d56dd6f62003800a264d..3f736e46e6d2aee6ded362f1d5b8065e78a0b5f0 100644 --- a/Inputs/DetectorConfiguration/e628.detector +++ b/Inputs/DetectorConfiguration/e628.detector @@ -1,108 +1,102 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%0.5mg/cm2 Target - THICKNESS= 4.8 - RADIUS= 5 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 4.8 micrometer + RADIUS= 5 mm + MATERIAL= CD2 + ANGLE= 0 deg + X= 0 mm + Y= 0 mm + Z= 0 mm -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -CATSArray %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CATSDetector - X1_Y1= -34.36 -34.96 -1193 - X28_Y1= 36.76 -34.96 -1193 - X1_Y28= -34.36 36.16 -1193 - X28_Y28= 36.76 36.16 -1193 + X1_Y1= -34.36 -34.96 -1193 mm + X28_Y1= 36.76 -34.96 -1193 mm + X1_Y28= -34.36 36.16 -1193 mm + X28_Y28= 36.76 36.16 -1193 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 CATSDetector - X1_Y1= 34.26 -35.46 -684 - X28_Y1= -36.86 -35.46 -684 - X1_Y28= 34.26 35.66 -684 - X28_Y28= -36.86 35.66 -684 + X1_Y1= 34.26 -35.46 -684 mm + X28_Y1= -36.86 -35.46 -684 mm + X1_Y28= 34.26 35.66 -684 mm + X28_Y28= -36.86 35.66 -684 mm %%%%%%%%%%%%%%%%%%%%%%%%%%% MUST2Array %%%%%%% Telescope 1 %%%%%%% M2Telescope -X1_Y1= 10.85 105.03 146.16 -X1_Y128= 22.8 9.84 175.95 -X128_Y1= 104.09 105.03 108.76 -X128_Y128= 116.04 9.84 138.55 -SI= 1 -SILI= 1 -CSI= 1 -VIS= all + X1_Y1= 10.85 105.03 146.16 mm + X1_Y128= 22.8 9.84 175.95 mm + X128_Y1= 104.09 105.03 108.76 mm + X128_Y128= 116.04 9.84 138.55 mm + SI= 1 + SILI= 1 + CSI= 1 + VIS= all %%%%%%% Telescope 2 %%%%%%% M2Telescope -X1_Y1= -116.04 9.84 138.55 -X1_Y128= -22.8 9.84 175.95 -X128_Y1= -104.09 105.03 108.76 -X128_Y128= -10.85 105.03 146.16 -SI= 1 -SILI= 1 -CSI= 1 -VIS= all + X1_Y1= -116.04 9.84 138.55 mm + X1_Y128= -22.8 9.84 175.95 mm + X128_Y1= -104.09 105.03 108.76 mm + X128_Y128= -10.85 105.03 146.16 mm + SI= 1 + SILI= 1 + CSI= 1 + VIS= all %%%%%%% Telescope 3 %%%%%%% M2Telescope -X1_Y1= -10.85 -105.03 146.16 -X1_Y128= -22.8 -9.84 175.95 -X128_Y1= -104.09 -105.03 108.76 -X128_Y128= -116.04 -9.84 138.55 -SI= 1 -SILI= 1 -CSI= 1 -VIS= all + X1_Y1= -10.85 -105.03 146.16 mm + X1_Y128= -22.8 -9.84 175.95 mm + X128_Y1= -104.09 -105.03 108.76 mm + X128_Y128= -116.04 -9.84 138.55 mm + SI= 1 + SILI= 1 + CSI= 1 + VIS= all %%%%%%% Telescope 4 %%%%%%% M2Telescope -X1_Y1= 116.04 -9.84 138.55 -X1_Y128= 22.8 -9.84 175.95 -X128_Y1= 104.09 -105.03 108.76 -X128_Y128= 10.85 -105.03 146.16 -SI= 1 -SILI= 1 -CSI= 1 -VIS= all + X1_Y1= 116.04 -9.84 138.55 mm + X1_Y128= 22.8 -9.84 175.95 mm + X128_Y1= 104.09 -105.03 108.76 mm + X128_Y128= 10.85 -105.03 146.16 mm + SI= 1 + SILI= 1 + CSI= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%% -Tiara -TiaraHyballWedge - Z= -147 - R= 0 - Phi= 0 -TiaraHyballWedge - Z= -147 - R= 0 - Phi= 60 -TiaraHyballWedge - Z= -147 - R= 0 - Phi= 120 -TiaraHyballWedge - Z= -147 - R= 0 - Phi= 180 -TiaraHyballWedge - Z= -147 - R= 0 - Phi= 240 -TiaraHyballWedge - Z= -147 - R= 0 - Phi= 300 -%%%%%%%%%%%%%%%%%%%%%%%%%%% -TiaraBarrel -TiaraInnerBarrel= 1 -TiaraOuterBarrel= 1 -TiaraChamber= 1 +Tiara Barrel + InnerBarrel= 1 + OuterBarrel= 1 + Chamber= 1 + +HyballWedge + Z= -147 mm + R= 0 mm + Phi= 0 deg +HyballWedge + Z= -147 mm + R= 0 mm + Phi= 60 deg +HyballWedge + Z= -147 mm + R= 0 mm + Phi= 120 deg +HyballWedge + Z= -147 mm + R= 0 mm + Phi= 180 deg +HyballWedge + Z= -147 mm + R= 0 mm + Phi= 240 deg +HyballWedge + Z= -147 mm + R= 0 mm + Phi= 300 deg + diff --git a/Inputs/DetectorConfiguration/e644.detector b/Inputs/DetectorConfiguration/e644.detector index c10c76d9a9daa14f93ac83bc30918ff9ec72cd28..b0d211f7428d7a084ad0a564488e6d74bd3c7d2a 100644 --- a/Inputs/DetectorConfiguration/e644.detector +++ b/Inputs/DetectorConfiguration/e644.detector @@ -1,56 +1,62 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -CATSArray +%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 3.2 micrometer + ANGLE= 20 deg + RADIUS= 24 mm + MATERIAL= CD2 + X= 0 mm + Y= 0 mm + Z= 0 mm + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CATSDetector - X1_Y1= 38.86 -34.36 -1193 - X28_Y1= -32.26 -34.36 -1193 - X1_Y28= 38.86 37.36 -1193 - X28_Y28= -32.26 37.36 -1193 + X1_Y1= 38.86 -34.36 -1193 mm + X28_Y1= -32.26 -34.36 -1193 mm + X1_Y28= 38.86 37.36 -1193 mm + X28_Y28= -32.26 37.36 -1193 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 CATSDetector - X1_Y1= -35.56 -35.36 -684 - X28_Y1= 35.56 -35.36 -684 - X1_Y28= -35.56 35.76 -684 - X28_Y28= 35.56 35.76 -684 -%%%%%%%%%%%%%%%%%%%%%%%%%%% -MUST2Array + X1_Y1= -35.56 -35.36 -684 mm + X28_Y1= 35.56 -35.36 -684 mm + X1_Y28= -35.56 35.76 -684 mm + X28_Y28= 35.56 35.76 -684 mm %%%%%%% Telescope 1 %%%%%%% M2Telescope -X1_Y1= 114.29 -12.75 162.37 -X1_Y128= 24.10 -12.77 198.77 -X128_Y1= 102.86 -105.10 134.03 -X128_Y128= 12.66 -105.12 170.42 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all + X1_Y1= 114.29 -12.75 162.37 mm + X1_Y128= 24.10 -12.77 198.77 mm + X128_Y1= 102.86 -105.10 134.03 mm + X128_Y128= 12.66 -105.12 170.42 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all %%%%%%% Telescope 2 %%%%%%% M2Telescope -X1_Y1= -13.60 -104.47 170.25 -X1_Y128= -25.15 -12.24 199.00 -X128_Y1= -104.00 -104.57 134.41 -X128_Y128= -115.61 -12.38 163.12 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all + X1_Y1= -13.60 -104.47 170.25 mm + X1_Y128= -25.15 -12.24 199.00 mm + X128_Y1= -104.00 -104.57 134.41 mm + X128_Y128= -115.61 -12.38 163.12 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all %%%%%%% Telescope 3 %%%%%%% M2Telescope -X1_Y1= -115.75 10.54 162.51 -X1_Y128= -25.12 11.01 198.44 -X128_Y1= -104.69 102.39 133.37 -X128_Y128= -14.05 102.86 169.29 -SI= 1 -SILI= 0 -CSI= 1 -VIS= all + X1_Y1= -115.75 10.54 162.51 mm + X1_Y128= -25.12 11.01 198.44 mm + X128_Y1= -104.69 102.39 133.37 mm + X128_Y128= -14.05 102.86 169.29 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all %%%%%%% Telescope 4 %%%%%%% M2Telescope -X1_Y1= 11.65 101.72 169.98 -X1_Y128= 23.40 9.82 199.52 -X128_Y1= 102.00 101.72 133.99 -X128_Y128= 113.77 9.79 163.54 -SI= 1 -SILI= 0 -CSI= 1 + X1_Y1= 11.65 101.72 169.98 mm + X1_Y128= 23.40 9.82 199.52 mm + X128_Y1= 102.00 101.72 133.99 mm + X128_Y128= 113.77 9.79 163.54 mm + SI= 1 + SILI= 0 + CSI= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/gaspHyde.detector b/Inputs/DetectorConfiguration/gaspHyde.detector deleted file mode 100644 index 0d2641a4870752fb96d1c27bf89c108936c1a73c..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/gaspHyde.detector +++ /dev/null @@ -1,367 +0,0 @@ -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and distance given in mm -%%Angle given in degree -%% using the data from the experimental mesurement -%% special care is given for the X Y direction -%% NOTATTION USED IN THE FOLLOWING: -%% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 -%%Option: 0,1 for Si SiLi and CSI -%%Option: all or sensible for VISualisation -% 1.2 12.371134021 -% 2 20.618556701 -% 30 309.278350515 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -Target - THICKNESS= 5 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GaspardTracker -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Annular Back -GPDAnnular - Z= -156.5 - RMIN= 16 - RMAX= 52 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Annular Front -GPDAnnular - Z= 156.5 - RMIN= 16 - RMAX= 52 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 End-Cap Back -GPDTrapezoid - X128_Y128= 55.338 -14.346 -146.501 - X1_Y128= 55.338 14.346 -146.501 - X128_Y1= 138.519 -48.717 -69.236 - X1_Y1= 138.518 48.726 -69.237 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDTrapezoid - X128_Y128= 49.215 29.045 -146.501 - X1_Y128= 28.986 49.274 -146.501 - X128_Y1= 132.395 63.500 -69.236 - X1_Y1= 63.492 132.401 -69.237 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -GPDTrapezoid - X128_Y128= 14.263 55.338 -146.501 - X1_Y128= -14.346 55.338 -146.501 - X128_Y1= 48.717 138.519 -69.236 - X1_Y1= -48.726 138.518 -69.237 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -GPDTrapezoid - X128_Y128= -29.045 49.215 -146.501 - X1_Y128= -49.274 28.986 -146.501 - X128_Y1= -63.500 132.395 -69.236 - X1_Y1= -132.401 63.492 -69.237 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -GPDTrapezoid - X128_Y128= -55.338 14.346 -146.501 - X1_Y128= -55.338 -14.346 -146.501 - X128_Y1= -138.519 48.717 -69.236 - X1_Y1= -138.518 -48.726 -69.237 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -GPDTrapezoid - X128_Y128= -49.215 -29.045 -146.501 - X1_Y128= -28.986 -49.274 -146.501 - X128_Y1= -132.395 -63.500 -69.236 - X1_Y1= -63.492 -132.401 -69.237 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -GPDTrapezoid - X128_Y128= -14.263 -55.338 -146.501 - X1_Y128= 14.346 -55.338 -146.501 - X128_Y1= -48.717 -138.519 -69.236 - X1_Y1= 48.726 -138.518 -69.237 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -GPDTrapezoid - X128_Y128= 29.045 -49.215 -146.501 - X1_Y128= 49.274 -28.986 -146.501 - X128_Y1= 63.500 -132.395 -69.236 - X1_Y1= 132.401 -63.492 -69.237 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Barrel -GPDSquare - THETA= 90 - PHI= 0 - R= 143 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - THETA= 90 - PHI= 45 - R= 143 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -GPDSquare - THETA= 90 - PHI= 90 - R= 143 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -GPDSquare - THETA= 90 - PHI= 135 - R= 143 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -GPDSquare - THETA= 90 - PHI= 180 - R= 143 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -GPDSquare - THETA= 90 - PHI= 225 - R= 143 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -GPDSquare - THETA= 90 - PHI= 270 - R= 143 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -GPDSquare - THETA= 90 - PHI= 315 - R= 143 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Barrel -%GPDSquare - X1_Y1= 142.516 49.00 -49.00 - X128_Y1= 142.516 49.00 49.00 - X1_Y128= 142.516 -49.00 -49.00 - X128_Y128= 142.516 -49.00 49.00 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -%GPDSquare - X1_Y1= 66.125 135.422 -49.00 - X128_Y1= 66.125 135.422 49.00 - X1_Y128= 135.422 66.126 -49.00 - X128_Y128= 135.422 66.126 49.00 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -%GPDSquare - X1_Y1= -49.00 142.516 -49.00 - X128_Y1= -49.00 142.516 49.00 - X1_Y128= 49.00 142.516 -49.00 - X128_Y128= 49.00 142.516 49.00 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -%GPDSquare - X1_Y1= -135.422 66.125 -49.00 - X128_Y1= -135.422 66.125 49.00 - X1_Y128= -66.126 135.422 -49.00 - X128_Y128= -66.126 135.422 49.00 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -%GPDSquare - X1_Y1= -142.516 -49.00 -49.00 - X128_Y1= -142.516 -49.00 49.00 - X1_Y128= -142.516 49.00 -49.00 - X128_Y128= -142.516 49.00 49.00 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -%GPDSquare - X1_Y1= -66.125 -135.422 -49.00 - X128_Y1= -66.125 -135.422 49.00 - X1_Y128= -135.422 -66.126 -49.00 - X128_Y128= -135.422 -66.126 49.00 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -%GPDSquare - X1_Y1= 49.00 -142.516 -49.00 - X128_Y1= 49.00 -142.516 49.00 - X1_Y128= -49.00 -142.516 -49.00 - X128_Y128= -49.00 -142.516 49.00 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -%GPDSquare - X1_Y1= 135.422 -66.125 -49.00 - X128_Y1= 135.422 -66.125 49.00 - X1_Y128= 66.126 -135.422 -49.00 - X128_Y128= 66.126 -135.422 49.00 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Front-Cap Back -GPDTrapezoid - X128_Y128= 55.338 14.346 146.501 - X1_Y128= 55.338 -14.346 146.501 - X128_Y1= 138.518 48.726 69.237 - X1_Y1= 138.519 -48.717 69.236 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDTrapezoid - X128_Y128= 28.986 49.274 146.501 - X1_Y128= 49.215 29.045 146.501 - X128_Y1= 63.492 132.401 69.237 - X1_Y1= 132.395 63.500 69.236 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -GPDTrapezoid - X128_Y128= -14.346 55.338 146.501 - X1_Y128= 14.263 55.338 146.501 - X128_Y1= -48.726 138.518 69.237 - X1_Y1= 48.717 138.519 69.236 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -GPDTrapezoid - X128_Y128= -49.274 28.986 146.501 - X1_Y128= -29.045 49.215 146.501 - X128_Y1= -132.401 63.492 69.237 - X1_Y1= -63.500 132.395 69.236 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -GPDTrapezoid - X128_Y128= -55.338 -14.346 146.501 - X1_Y128= -55.338 14.346 146.501 - X128_Y1= -138.518 -48.726 69.237 - X1_Y1= -138.519 48.717 69.236 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -GPDTrapezoid - X128_Y128= -28.986 -49.274 146.501 - X1_Y128= -49.215 -29.045 146.501 - X128_Y1= -63.492 -132.401 69.237 - X1_Y1= -132.395 -63.500 69.236 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -GPDTrapezoid - X128_Y128= 14.346 -55.338 146.501 - X1_Y128= -14.263 -55.338 146.501 - X128_Y1= 48.726 -138.518 69.237 - X1_Y1= -48.717 -138.519 69.236 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -GPDTrapezoid - X128_Y128= 49.274 -28.986 146.501 - X1_Y128= 29.045 -49.215 146.501 - X128_Y1= 132.401 -63.492 69.237 - X1_Y1= 63.500 -132.395 69.236 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all diff --git a/Inputs/DetectorConfiguration/gaspardParisAll.detector b/Inputs/DetectorConfiguration/gaspardParisAll.detector deleted file mode 100644 index 36483d56f25338cc4563a39d04d3b00b0da02782..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/gaspardParisAll.detector +++ /dev/null @@ -1,741 +0,0 @@ -%Fichier de configuration manip E225 -%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 -%Thickness in micrometer -%Radius in mm -%Temperature in K, Pressure in bar -%Material name according to the target library - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2l - NBLAYERS= 50 - X= 0 - Y= 0 - Z= 0 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralChamber -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Chamber - Rmin= 200 - Rmax= 202 - PhiMin= 0. - PhiMax= 6.14318 - ThetaMin= 0. - ThetaMax= 3.14159 - MATERIAL= Alu - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and R given in mm -%%Angle given in degree -%%Option: 0,1 for Si SiLi and CsI -%%Option: all or sensible for VISualisation - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Paris -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 -ParisCluster - X1_Y1= -84.5 -235 84.5 - X1_Y128= 84.5 -235 84.5 - X128_Y1= -84.5 -235 -84.5 - X128_Y128= 84.5 -235 -84.5 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -225.920617 -106.419571 84.5 - X1_Y128= -106.419571 -225.920617 84.5 - X128_Y1= -225.920617 -106.419571 -84.5 - X128_Y128= -106.419571 -225.920617 -84.5 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -235 84.5 84.5 - X1_Y128= -235 -84.5 84.5 - X128_Y1= -235 84.5 -84.5 - X128_Y128= -235 -84.5 -84.5 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -ParisCluster - X1_Y1= -106.419571 225.920617 84.5 - X1_Y128= -225.920617 106.419571 84.5 - X128_Y1= -106.419571 225.920617 -84.5 - X128_Y128= -225.920617 106.419571 -84.5 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= 84.5 235 84.5 - X1_Y128= -84.5 235 84.5 - X128_Y1= 84.5 235 -84.5 - X128_Y128= -84.5 235 -84.5 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= 225.920617 106.419571 84.5 - X1_Y128= 106.419571 225.920617 84.5 - X128_Y1= 225.920617 106.419571 -84.5 - X128_Y128= 106.419571 225.920617 -84.5 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= 235 -84.5 84.5 - X1_Y128= 235 84.5 84.5 - X128_Y1= 235 -84.5 -84.5 - X128_Y128= 235 84.5 -84.5 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= 106.419571 -225.920617 84.5 - X1_Y128= 225.920617 -106.419571 84.5 - X128_Y1= 106.419571 -225.920617 -84.5 - X128_Y128= 225.920617 -106.419571 -84.5 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= 84.5 84.5 -235 - X1_Y128= -84.5 84.5 -235 - X128_Y1= 84.5 -84.5 -235 - X128_Y128= -84.5 -84.5 -235 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= 225.920617 84.5 -106.419571 - X1_Y128= 106.419571 84.5 -225.920617 - X128_Y1= 225.920617 -84.5 -106.419571 - X128_Y128= 106.419571 -84.5 -225.920617 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= 106.419571 84.5 225.920617 - X1_Y128= 225.920617 84.5 106.419571 - X128_Y1= 106.419571 -84.5 225.920617 - X128_Y128= 225.920617 -84.5 106.419571 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -84.5 84.5 235 - X1_Y128= 84.5 84.5 235 - X128_Y1= -84.5 -84.5 235 - X128_Y128= 84.5 -84.5 235 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -225.920617 84.5 106.419571 - X1_Y128= -106.419571 84.5 225.920617 - X128_Y1= -225.920617 -84.5 106.419571 - X128_Y128= -106.419571 -84.5 225.920617 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -106.419571 84.5 -225.920617 - X1_Y128= -225.920617 84.5 -106.419571 - X128_Y1= -106.419571 -84.5 -225.920617 - X128_Y128= -225.920617 -84.5 -106.419571 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -84.5 106.419571 -225.920617 - X1_Y128= 84.5 106.419571 -225.920617 - X128_Y1= -84.5 225.920617 -106.419571 - X128_Y128= 84.5 225.920617 -106.419571 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -84.5 225.920617 106.419571 - X1_Y128= 84.5 225.920617 106.419571 - X128_Y1= -84.5 106.419571 225.920617 - X128_Y128= 84.5 106.419571 225.920617 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -84.5 -106.419571 225.920617 - X1_Y128= 84.5 -106.419571 225.920617 - X128_Y1= -84.5 -225.920617 106.419571 - X128_Y128= 84.5 -225.920617 106.419571 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -ParisCluster - X1_Y1= -84.5 -225.920617 -106.419571 - X1_Y128= 84.5 -225.920617 -106.419571 - X128_Y1= -84.5 -106.419571 -225.920617 - X128_Y128= 84.5 -106.419571 -225.920617 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -175.9824 135.677313 -95.372227 - X1_Y128= -199.252552 89.137008 -118.642379 - X128_Y1= -135.677313 135.677313 -135.677313 - X128_Y128= -158.947466 89.137008 -158.947466 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -135.677313 135.677313 -135.677313 - X1_Y128= -158.947466 89.137008 -158.947466 - X128_Y1= -95.372227 135.677313 -175.9824 - X128_Y128= -118.642379 89.137008 -199.252552 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -132.559704 182.217618 -92.254617 - X1_Y128= -155.829857 135.677313 -115.52477 - X128_Y1= -92.254617 182.217618 -132.559704 - X128_Y128= -115.52477 135.677313 -155.829857 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -95.372227 135.677313 175.9824 - X1_Y128= -118.642379 89.137008 199.252552 - X128_Y1= -135.677313 135.677313 135.677313 - X128_Y128= -158.947466 89.137008 158.947466 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -135.677313 135.677313 135.677313 - X1_Y128= -158.947466 89.137008 158.947466 - X128_Y1= -175.9824 135.677313 95.372227 - X128_Y128= -199.252552 89.137008 118.642379 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -92.254617 182.217618 132.559704 - X1_Y128= -115.52477 135.677313 155.829857 - X128_Y1= -132.559704 182.217618 92.254617 - X128_Y128= -155.829857 135.677313 115.52477 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 175.9824 135.677313 95.372227 - X1_Y128= 199.252552 89.137008 118.642379 - X128_Y1= 135.677313 135.677313 135.677313 - X128_Y128= 158.947466 89.137008 158.947466 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 135.677313 135.677313 135.677313 - X1_Y128= 158.947466 89.137008 158.947466 - X128_Y1= 95.372227 135.677313 175.9824 - X128_Y128= 118.642379 89.137008 199.252552 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 132.559704 182.217618 92.254617 - X1_Y128= 155.829857 135.677313 115.52477 - X128_Y1= 92.254617 182.217618 132.559704 - X128_Y128= 115.52477 135.677313 155.829857 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 95.372227 135.677313 -175.9824 - X1_Y128= 118.642379 89.137008 -199.252552 - X128_Y1= 135.677313 135.677313 -135.677313 - X128_Y128= 158.947466 89.137008 -158.947466 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 135.677313 135.677313 -135.677313 - X1_Y128= 158.947466 89.137008 -158.947466 - X128_Y1= 175.9824 135.677313 -95.372227 - X128_Y128= 199.252552 89.137008 -118.642379 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 92.254617 182.217618 -132.559704 - X1_Y128= 115.52477 135.677313 -155.829857 - X128_Y1= 132.559704 182.217618 -92.254617 - X128_Y128= 155.829857 135.677313 -115.52477 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -95.372227 -135.677313 -175.9824 - X1_Y128= -118.642379 -89.137008 -199.252552 - X128_Y1= -135.677313 -135.677313 -135.677313 - X128_Y128= -158.947466 -89.137008 -158.947466 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -135.677313 -135.677313 -135.677313 - X1_Y128= -158.947466 -89.137008 -158.947466 - X128_Y1= -175.9824 -135.677313 -95.372227 - X128_Y128= -199.252552 -89.137008 -118.642379 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= -92.254617 -182.217618 -132.559704 - X1_Y128= -115.52477 -135.677313 -155.829857 - X128_Y1= -132.559704 -182.217618 -92.254617 - X128_Y128= -155.829857 -135.677313 -115.52477 - - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParisPhoswich -% X1_Y1= 175.9824 -135.677313 -95.372227 -% X1_Y128= 199.252552 -89.137008 -118.642379 -% X128_Y1= 135.677313 -135.677313 -135.677313 -% X128_Y128= 158.947466 -89.137008 -158.947466 -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParisPhoswich -% X1_Y1= 135.677313 -135.677313 -135.677313 -% X1_Y128= 158.947466 -89.137008 -158.947466 -% X128_Y1= 95.372227 -135.677313 -175.9824 -% X128_Y128= 118.642379 -89.137008 -199.252552 -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParisPhoswich -% X1_Y1= 132.559704 -182.217618 -92.254617 -% X1_Y128= 155.829857 -135.677313 -115.52477 -% X128_Y1= 92.254617 -182.217618 -132.559704 -% X128_Y128= 115.52477 -135.677313 -155.829857 -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 95.372227 -135.677313 175.9824 - X1_Y128= 118.642379 -89.137008 199.252552 - X128_Y1= 135.677313 -135.677313 135.677313 - X128_Y128= 158.947466 -89.137008 158.947466 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 135.677313 -135.677313 135.677313 - X1_Y128= 158.947466 -89.137008 158.947466 - X128_Y1= 175.9824 -135.677313 95.372227 - X128_Y128= 199.252552 -89.137008 118.642379 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParisPhoswich - X1_Y1= 92.254617 -182.217618 132.559704 - X1_Y128= 115.52477 -135.677313 155.829857 - X128_Y1= 132.559704 -182.217618 92.254617 - X128_Y128= 155.829857 -135.677313 115.52477 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParisPhoswich -% X1_Y1= -175.9824 -135.677313 95.372227 -% X1_Y128= -199.252552 -89.137008 118.642379 -% X128_Y1= -135.677313 -135.677313 135.677313 -% X128_Y128= -158.947466 -89.137008 158.947466 -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParisPhoswich -% X1_Y1= -135.677313 -135.677313 135.677313 -% X1_Y128= -158.947466 -89.137008 158.947466 -% X128_Y1= -95.372227 -135.677313 175.9824 -% X128_Y128= -118.642379 -89.137008 199.252552 -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%ParisPhoswich -% X1_Y1= -132.559704 -182.217618 92.254617 -% X1_Y128= -155.829857 -135.677313 115.52477 -% X128_Y1= -92.254617 -182.217618 132.559704 -% X128_Y128= -115.52477 -135.677313 155.829857 -% VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GaspardTracker -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 Central Barrel -GPDDummyShape - THETA= 90 - PHI= 90 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDDummyShape - THETA= 90 - PHI= 120 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDDummyShape - THETA= 90 - PHI= 150 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -GPDDummyShape - THETA= 90 - PHI= 180 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -GPDDummyShape - THETA= 90 - PHI= 210 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -GPDDummyShape - THETA= 90 - PHI= 240 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -GPDDummyShape - THETA= 90 - PHI= 270 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -GPDDummyShape - THETA= 90 - PHI= 300 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -GPDDummyShape - THETA= 90 - PHI= 330 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 -GPDDummyShape - THETA= 90 - PHI= 360 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 -GPDDummyShape - THETA= 90 - PHI= 30 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 -GPDDummyShape - THETA= 90 - PHI= 60 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 First Cone (forward) -GPDDummyShape - THETA= 60 - PHI= 90 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 -GPDDummyShape - THETA= 60 - PHI= 130 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 -GPDDummyShape - THETA= 60 - PHI= 170 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 -GPDDummyShape - THETA= 60 - PHI= 210 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 -GPDDummyShape - THETA= 60 - PHI= 250 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 -GPDDummyShape - THETA= 60 - PHI= 290 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18 -GPDDummyShape - THETA= 60 - PHI= 330 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%19 -GPDDummyShape - THETA= 60 - PHI= 10 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%20 -GPDDummyShape - THETA= 60 - PHI= 50 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%21 Second Cone (forward) -GPDDummyShape - THETA= 30 - PHI= 90 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22 -GPDDummyShape - THETA= 30 - PHI= 180 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%23 -GPDDummyShape - THETA= 30 - PHI= 270 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24 -GPDDummyShape - THETA= 30 - PHI= 360 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%25 First Cone (backward) -GPDDummyShape - THETA= 120 - PHI= 90 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%26 -GPDDummyShape - THETA= 120 - PHI= 130 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%27 -GPDDummyShape - THETA= 120 - PHI= 170 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%28 -GPDDummyShape - THETA= 120 - PHI= 210 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%29 -GPDDummyShape - THETA= 120 - PHI= 250 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%30 -GPDDummyShape - THETA= 120 - PHI= 290 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%31 -GPDDummyShape - THETA= 120 - PHI= 330 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%32 -GPDDummyShape - THETA= 120 - PHI= 10 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%33 -GPDDummyShape - THETA= 120 - PHI= 50 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%34 Second Cone (backward) -GPDDummyShape - THETA= 150 - PHI= 90 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%35 -GPDDummyShape - THETA= 150 - PHI= 180 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%36 -GPDDummyShape - THETA= 150 - PHI= 270 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%37 -GPDDummyShape - THETA= 150 - PHI= 360 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%38 End Cap (forward) -GPDDummyShape - THETA= 0 - PHI= 0 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%39 End Cap (backward) -GPDDummyShape - THETA= 180 - PHI= 0 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all diff --git a/Inputs/DetectorConfiguration/gaspardV1Barrel.detector b/Inputs/DetectorConfiguration/gaspardV1Barrel.detector deleted file mode 100644 index bc9d3a26ebfc61fd393def3bbfe151a160302527..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/gaspardV1Barrel.detector +++ /dev/null @@ -1,110 +0,0 @@ -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and distance given in mm -%%Angle given in degree -%% using the data from the experimental mesurement -%% special care is given for the X Y direction -%% NOTATTION USED IN THE FOLLOWING: -%% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 -%%Option: 0,1 for Si SiLi and CSI -%%Option: all or sensible for VISualisation -% 1.2 12.371134021 -% 2 20.618556701 -% 30 309.278350515 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -Target - THICKNESS= 309.278350515 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GaspardTracker -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 49.1 66.08 -135.41 - X128_Y1= -48.9 66.22 -135.41 - X1_Y128= -48.8 135.51 -66.1 - X128_Y128= 49.2 135.36 -66.1 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -66.04 61.23 -130.4 - X128_Y1= -135.4 12.32 -81.4 - X1_Y128= -65.94 130.51 -61.09 - X128_Y128= -135.3 81.6 -12.1 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -GPDSquare - X1_Y1= -142.52 0.22 -69.3 - X128_Y1= -142.62 -69.09 -0.01 - X1_Y128= -142.42 69.5 0.01 - X128_Y128= -142.52 0.19 69.3 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -GPDSquare - X1_Y1= -135.54 -81.21 12.1 - X128_Y1= -66.31 -130.32 61.09 - X1_Y128= -135.44 -11.93 81.4 - X128_Y128= -66.21 -61.04 130.4 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -GPDSquare - X1_Y1= -49.2 -135.36 66.1 - X128_Y1= 48.8 -135.51 66.1 - X1_Y128= 48.9 -66.22 135.41 - X128_Y128= -49.1 -66.08 135.41 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -GPDSquare - X1_Y1= 65.94 -130.51 61.09 - X128_Y1= 135.3 -81.6 12.1 - X1_Y128= 135.4 -12.32 81.4 - X128_Y128= 66.04 -61.23 130.4 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -GPDSquare - X1_Y1= 142.42 -69.5 -0.01 - X128_Y1= 142.52 -0.19 -69.3 - X1_Y128= 142.52 -0.22 69.3 - X128_Y128= 142.62 69.09 0.01 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -GPDSquare - X1_Y1= 135.44 11.93 -81.4 - X128_Y1= 66.21 61.04 -130.4 - X1_Y128= 66.31 130.32 -61.09 - X128_Y128= 135.54 81.21 -12.1 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 diff --git a/Inputs/DetectorConfiguration/gaspardV1EndCapBack.detector b/Inputs/DetectorConfiguration/gaspardV1EndCapBack.detector deleted file mode 100644 index 5cf69e2bd57978c96cebfa9c8bc3ac05c6eb335b..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/gaspardV1EndCapBack.detector +++ /dev/null @@ -1,79 +0,0 @@ -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and distance given in mm -%%Angle given in degree -%% using the data from the experimental mesurement -%% special care is given for the X Y direction -%% NOTATTION USED IN THE FOLLOWING: -%% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 -%%Option: 0,1 for Si SiLi and CSI -%%Option: all or sensible for VISualisation -% 1.2 12.371134021 -% 2 20.618556701 -% 30 309.278350515 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -%Target - THICKNESS= 0 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Gaspard -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -12.17 -38.15 -153.33 - X128_Y1= -81.53 -87.06 -104.34 - X1_Y128= -61.04 45.57 -138.96 - X128_Y128= -130.41 -3.34 -89.97 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -12.33 -153.3 -38.22 - X128_Y1= -61.31 -138.89 45.43 - X1_Y128= -130.54 -89.78 -3.56 - X128_Y128= -81.56 -104.19 -87.21 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -GPDSquare - X1_Y1= 11.89 -153.33 -38.22 - X128_Y1= 81.26 -104.42 -87.21 - X1_Y128= 60.91 -139.07 45.43 - X128_Y128= 130.28 -130.28 -3.56 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -GPDSquare - X1_Y1= 130.4 -3.72 -89.97 - X128_Y1= 81.28 -87.29 -104.34 - X1_Y128= 12.06 -38.18 -153.33 - X128_Y128= 61.18 45.39 -138.96 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -GPDSquare - X1_Y1= 69.15 -100.86 -100.79 - X128_Y1= -0.22 -149.76 -51.8 - X1_Y128= -0.08 -51.75 -149.78 - X128_Y128= -69.44 -100.66 -100.79 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all diff --git a/Inputs/DetectorConfiguration/gaspardV1EndCapFront.detector b/Inputs/DetectorConfiguration/gaspardV1EndCapFront.detector deleted file mode 100644 index e3803c6ba3d4f28bb17585378355a8f4227c4e0b..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/gaspardV1EndCapFront.detector +++ /dev/null @@ -1,79 +0,0 @@ -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and distance given in mm -%%Angle given in degree -%% using the data from the experimental mesurement -%% special care is given for the X Y direction -%% NOTATTION USED IN THE FOLLOWING: -%% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 -%%Option: 0,1 for Si SiLi and CSI -%%Option: all or sensible for VISualisation -% 1.2 12.371134021 -% 2 20.618556701 -% 30 309.278350515 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -Target - THICKNESS= 309.278350515 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Gaspard -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Cap Front -GPDSquare - X1_Y1= -60.91 139.07 -45.43 - X128_Y1= -130.28 90.16 3.6 - X1_Y128= -81.26 104.42 87.21 - X128_Y128= -11.89 153.33 38.22 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -81.28 87.29 104.34 - X128_Y1= -130.40 3.72 89.97 - X1_Y128= -12.06 38.18 153.33 - X128_Y128= -61.18 -45.39 138.96 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -GPDSquare - X1_Y1= 81.53 87.06 104.34 - X128_Y1= 12.17 38.15 153.33 - X1_Y128= 61.04 -45.57 138.96 - X128_Y128= 130.411 3.34 89.97 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -GPDSquare - X1_Y1= 61.31 138.89 -45.43 - X128_Y1= 12.33 153.30 38.22 - X1_Y128= 81.56 104.19 87.21 - X128_Y128= 130.54 89.78 3.56 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -GPDSquare - X1_Y1= 0.22 149.76 51.80 - X128_Y1= -69.15 100.86 100.79 - X1_Y128= 0.08 51.75 149.78 - X128_Y128= 69.44 100.66 100.79 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all diff --git a/Inputs/DetectorConfiguration/gaspardV1_r150.detector b/Inputs/DetectorConfiguration/gaspardV1_r150.detector deleted file mode 100644 index 4af4299573eafe17a9d2f7c266017dad560623d6..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/gaspardV1_r150.detector +++ /dev/null @@ -1,672 +0,0 @@ -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and distance given in mm -%%Angle given in degree -%% using the data from the experimental mesurement -%% special care is given for the X Y direction -%% NOTATTION USED IN THE FOLLOWING: -%% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 -%%Option: 0,1 for Si SiLi and CSI -%%Option: all or sensible for VISualisation -% 1.2 12.371134021 -% 2 20.618556701 -% 30 309.278350515 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -Target - THICKNESS= 0.001 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GaspardTracker -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 // central ring -GPDSquare - X1_Y1= 25 150 25 - X128_Y1= -25 150 25 - X1_Y128= 25 150 -25 - X128_Y128= -25 150 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -34.3055 148.149 25 - X128_Y1= -80.4995 129.0149 25 - X1_Y128= -34.3055 148.149 -25 - X128_Y128= -80.4995 129.0149 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -88.3883 123.7437 25 - X128_Y1= -123.744 88.388 25 - X1_Y128= -88.3883 123.7437 -25 - X128_Y128= -123.744 88.388 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -GPDSquare - X1_Y1= -129.015 80.49963 25 - X128_Y1= -148.149 34.30567 25 - X1_Y128= -129.015 80.49963 -25 - X128_Y128= -148.149 34.30567 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -GPDSquare - X1_Y1= -150. 25 25 - X128_Y1= -150. -25 25 - X1_Y128= -150. 25 -25 - X128_Y128= -150. -25 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -GPDSquare - X1_Y1= -148.1490726 -34.30528084 25 - X128_Y1= -129.0149776 -80.4992892 25 - X1_Y128= -148.1490726 -34.30528084 -25 - X128_Y128= -129.0149776 -80.4992892 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -GPDSquare - X1_Y1= -123.7438626 -88.38810137 25 - X128_Y1= -88.38859392 -123.7435108 25 - X1_Y128= -123.7438626 -88.38810137 -25 - X128_Y128= -88.38859392 -123.7435108 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -GPDSquare - X1_Y1= -80.49980273 -129.0146572 25 - X128_Y1= -34.30587053 -148.148936 25 - X1_Y128= -80.49980273 -129.0146572 -25 - X128_Y128= -34.30587053 -148.148936 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -GPDSquare - X1_Y1= -25.00039804 -149.9999337 25 - X128_Y1= 24.99960196 -150.0000663 25 - X1_Y128= -25.00039804 -149.9999337 -25 - X128_Y128= 24.99960196 -150.0000663 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 -GPDSquare - X1_Y1= 34.30508427 -148.1491181 25 - X128_Y1= 80.49911802 -129.0150844 25 - X1_Y128= 34.30508427 -148.1491181 -25 - X128_Y128= 80.49911802 -129.0150844 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 -GPDSquare - X1_Y1= 88.38793719 -123.7439799 25 - X128_Y1= 123.7433935 -88.3887581 25 - X1_Y128= 88.38793719 -123.7439799 -25 - X128_Y128= 123.7433935 -88.3887581 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 -GPDSquare - X1_Y1= 129.0145503 -80.4999739 25 - X128_Y1= 148.1488905 -34.30606709 25 - X1_Y128= 129.0145503 -80.4999739 -25 - X128_Y128= 148.1488905 -34.30606709 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 -GPDSquare - X1_Y1= 149.9999005 -25.00059706 25 - X128_Y1= 150.0000995 24.99940294 25 - X1_Y128= 149.9999005 -25.00059706 -25 - X128_Y128= 150.0000995 24.99940294 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 -GPDSquare - X1_Y1= 148.1491636 34.30488771 25 - X128_Y1= 129.0151912 80.49894684 25 - X1_Y128= 148.1491636 34.30488771 -25 - X128_Y128= 129.0151912 80.49894684 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 -GPDSquare - X1_Y1= 123.7440972 88.38777301 25 - X128_Y1= 88.38892229 123.7432763 25 - X1_Y128= 123.7440972 88.38777301 -25 - X128_Y128= 88.38892229 123.7432763 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 -GPDSquare - X1_Y1= 80.50014508 129.0144435 25 - X128_Y1= 34.30626365 148.148845 25 - X1_Y128= 80.50014508 129.0144435 -25 - X128_Y128= 34.30626365 148.148845 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 // Forward 1 -GPDSquare - X1_Y1= 25 129.0149 80.49946 - X128_Y1= -25 129.0149 80.49946 - X1_Y128= 25 148.149 34.30548 - X128_Y128= -25 148.149 34.30548 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 // Forward 1 -GPDSquare - X1_Y1= -42.85674535 124.2301745 80.49946037 - X128_Y1= -86.15802659 99.23019366 80.49946037 - X1_Y128= -52.42381617 140.8008442 34.3054774 - X128_Y128= -95.72509741 115.8008633 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18 // Forward 1 -GPDSquare - X1_Y1= -99.23007934 86.15815825 80.49946037 - X128_Y1= -124.2301176 42.85691018 80.49946037 - X1_Y128= -115.8007363 95.72525106 34.3054774 - X128_Y128= -140.8007746 52.42400298 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%19 // Forward 1 -GPDSquare - X1_Y1= -129.0148376 25.00017118 80.49946037 - X128_Y1= -129.0149039 -24.99982882 80.49946037 - X1_Y128= -148.1489939 25.00019656 34.3054774 - X128_Y128= -148.1490602 -24.99980344 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%20 // Forward 1 -GPDSquare - X1_Y1= -124.2302314 -42.85658052 80.49946037 - X128_Y1= -99.23030797 -86.15789493 80.49946037 - X1_Y128= -140.8009137 -52.42362935 34.3054774 - X128_Y128= -115.8009903 -95.72494377 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%21 // Forward 1 -GPDSquare - X1_Y1= -86.15828991 -99.22996503 80.49946037 - X128_Y1= -42.857075 -124.2300608 80.49946037 - X1_Y128= -95.7254047 -115.8006093 34.3054774 - X128_Y128= -52.42418979 -140.8007051 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22 // Forward 1 -GPDSquare - X1_Y1= -25.00034235 -129.0148044 80.49946037 - X128_Y1= 24.99965765 -129.0149371 80.49946037 - X1_Y128= -25.00039313 -148.1489607 34.3054774 - X128_Y128= 24.99960687 -148.1490934 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%23 // Forward 1 -GPDSquare - X1_Y1= 42.85641569 -124.2302882 80.49946037 - X128_Y1= 86.15776328 -99.23042228 80.49946037 - X1_Y128= 52.42344254 -140.8009833 34.3054774 - X128_Y128= 95.72479012 -115.8011173 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24 // Forward 1 -GPDSquare - X1_Y1= 99.22985071 -86.15842157 80.49946037 - X128_Y1= 124.2300039 -42.85723983 80.49946037 - X1_Y128= 115.8004823 -95.72555834 34.3054774 - X128_Y128= 140.8006355 -52.42437661 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%25 // Forward 1 -GPDSquare - X1_Y1= 129.0147713 -25.00051353 80.49946037 - X128_Y1= 129.0149703 24.99948647 80.49946037 - X1_Y128= 148.1489276 -25.00058969 34.3054774 - X128_Y128= 148.1491266 24.99941031 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%26 // Forward 1 -GPDSquare - X1_Y1= 124.2303451 42.85625086 80.49946037 - X128_Y1= 99.2305366 86.15763162 80.49946037 - X1_Y128= 140.8010528 52.42325572 34.3054774 - X128_Y128= 115.8012443 95.72463648 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%27 // Forward 1 -GPDSquare - X1_Y1= 86.15855322 99.2297364 80.49946037 - X128_Y1= 42.85740466 124.2299471 80.49946037 - X1_Y128= 95.72571199 115.8003553 34.3054774 - X128_Y128= 52.42456342 140.8005659 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%28 // Forward 2 -GPDSquare - X1_Y1= 25 88.38843 123.7436 - X128_Y1= -25 88.38843 123.7436 - X1_Y128= 25 123.7436 88.38843 - X128_Y128= -25 123.7436 88.38843 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%29 // Forward 2 -GPDSquare - X1_Y1= -44.82233533 80.17775731 123.7436281 - X128_Y1= -80.17769784 44.82244171 123.7436281 - X1_Y128= -69.82230216 105.1777573 88.38826556 - X128_Y128= -105.1776647 69.82244171 88.38826556 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%30 // Forward 2 -GPDSquare - X1_Y1= -88.38839657 25.00011727 123.7436281 - X128_Y1= -88.38846291 -24.99988273 123.7436281 - X1_Y128= -123.7437122 25.00016418 88.38826556 - X128_Y128= -123.7437785 -24.99983582 88.38826556 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%31 // Forward 2 -GPDSquare - - X1_Y1= -80.17781678 -44.82222895 123.7436281 - X128_Y1= -44.82254809 -80.17763837 123.7436281 - X1_Y128= -105.17785 -69.82216261 88.38826556 - X128_Y128= -69.82258126 -105.177572 88.38826556 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%32 // Forward 2 -GPDSquare - X1_Y1= -25.00023455 -88.3883634 123.7436281 - X128_Y1= 24.99976545 -88.38849608 123.7436281 - X1_Y128= -25.00032837 -123.743679 88.38826556 - X128_Y128= 24.99967163 -123.7438117 88.38826556 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%33 // Forward 2 -GPDSquare - X1_Y1= 44.82212257 -80.17787625 123.7436281 - X128_Y1= 80.1775789 -44.82265447 123.7436281 - X1_Y128= 69.82202306 -105.1779426 88.38826556 - X128_Y128= 105.1774794 -69.82272081 88.38826556 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%34 // Forward 2 -GPDSquare - X1_Y1= 88.38833023 -25.00035182 123.7436281 - X128_Y1= 88.38852925 24.99964818 123.7436281 - X1_Y128= 123.7436458 -25.00049255 88.38826556 - X128_Y128= 123.7438449 24.99950745 88.38826556 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%35 // Forward 2 -GPDSquare - X1_Y1= 80.17793572 44.82201619 123.7436281 - X128_Y1= 44.82276085 80.17751943 123.7436281 - X1_Y128= 105.1780352 69.82188351 88.38826556 - X128_Y128= 69.82286035 105.1773868 88.38826556 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%36 // Forward 3 -GPDSquare - X1_Y1= 25 34.30548 148.149 - X128_Y1= -25 34.30548 148.149 - X1_Y128= 25 80.49946 129.0149 - X128_Y128= -25 80.49946 129.0149 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%37 -GPDSquare - X1_Y1= -34.30548 25 148.149 - X128_Y1= -34.30548 -25 148.149 - X1_Y128= -80.49946 25 129.0149 - X128_Y128= -80.49946 -25 129.0149 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%38 -GPDSquare - X1_Y1= -25 -34.30548 148.149 - X128_Y1= 25 -34.30548 148.149 - X1_Y128= -25 -80.49946 129.0149 - X128_Y128= 25 -80.49946 129.0149 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%39 -GPDSquare - X1_Y1= 34.30548 -25 148.149 - X128_Y1= 34.30548 25 148.149 - X1_Y128= 80.49946 -25 129.0149 - X128_Y128= 80.49946 25 129.0149 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40 // Backward 1 -GPDSquare - X1_Y1= 25 148.1490271 -34.3054774 - X128_Y1= -25 148.1490271 -34.3054774 - X1_Y128= 25 129.0148708 -80.49946037 - X128_Y128= -25 129.0148708 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%41 // Backward 1 -GPDSquare - X1_Y1= 95.72509741 115.8008633 -34.3054774 - X128_Y1= 52.42381617 140.8008442 -34.3054774 - X1_Y128= 86.15802659 99.23019366 -80.49946037 - X128_Y128= 42.85674535 124.2301745 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%42 // Backward 1 -GPDSquare - X1_Y1= 140.8007746 52.42400298 -34.3054774 - X128_Y1= 115.8007363 95.72525106 -34.3054774 - X1_Y128= 124.2301176 42.85691018 -80.49946037 - X128_Y128= 99.23007934 86.15815825 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%43 // Backward 1 -GPDSquare - X1_Y1= 148.1490602 -24.99980344 -34.3054774 - X128_Y1= 148.1489939 25.00019656 -34.3054774 - X1_Y128= 129.0149039 -24.99982882 -80.49946037 - X128_Y128= 129.0148376 25.00017118 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%44 // Backward 1 -GPDSquare - X1_Y1= 115.8009903 -95.72494377 -34.3054774 - X128_Y1= 140.8009137 -52.42362935 -34.3054774 - X1_Y128= 99.23030797 -86.15789493 -80.49946037 - X128_Y128= 124.2302314 -42.85658052 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%45 // Backward 1 -GPDSquare - X1_Y1= 52.42418979 -140.8007051 -34.3054774 - X128_Y1= 95.7254047 -115.8006093 -34.3054774 - X1_Y128= 42.857075 -124.2300608 -80.49946037 - X128_Y128= 86.15828991 -99.22996503 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%46 // Backward 1 -GPDSquare - X1_Y1= -24.99960687 -148.1490934 -34.3054774 - X128_Y1= 25.00039313 -148.1489607 -34.3054774 - X1_Y128= -24.99965765 -129.0149371 -80.49946037 - X128_Y128= 25.00034235 -129.0148044 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%47 // Backward 1 -GPDSquare - X1_Y1= -95.72479012 -115.8011173 -34.3054774 - X128_Y1= -52.42344254 -140.8009833 -34.3054774 - X1_Y128= -86.15776328 -99.23042228 -80.49946037 - X128_Y128= -42.85641569 -124.2302882 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%48 // Backward 1 -GPDSquare - X1_Y1= -140.8006355 -52.42437661 -34.3054774 - X128_Y1= -115.8004823 -95.72555834 -34.3054774 - X1_Y128= -124.2300039 -42.85723983 -80.49946037 - X128_Y128= -99.22985071 -86.15842157 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%49 // Backward 1 -GPDSquare - X1_Y1= -148.1491266 24.99941031 -34.3054774 - X128_Y1= -148.1489276 -25.00058969 -34.3054774 - X1_Y128= -129.0149703 24.99948647 -80.49946037 - X128_Y128= -129.0147713 -25.00051353 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%50 // Backward 1 -GPDSquare - X1_Y1= -115.8012443 95.72463648 -34.3054774 - X128_Y1= -140.8010528 52.42325572 -34.3054774 - X1_Y128= -99.2305366 86.15763162 -80.49946037 - X128_Y128= -124.2303451 42.85625086 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%51 // Backward 1 -GPDSquare - X1_Y1= -52.42456342 140.8005659 -34.3054774 - X128_Y1= -95.72571199 115.8003553 -34.3054774 - X1_Y128= -42.85740466 124.2299471 -80.49946037 - X128_Y128= -86.15855322 99.2297364 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%52 // Backward 2 -GPDSquare - X1_Y1= 25 123.7437453 -88.38826556 - X128_Y1= -25 123.7437453 -88.38826556 - X1_Y128= 25 88.38842974 -123.7436281 - X128_Y128= -25 88.38842974 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%53 // Backward 2 -GPDSquare - X1_Y1= 105.1776647 69.82244171 -88.38826556 - X128_Y1= 69.82230216 105.1777573 -88.38826556 - X1_Y128= 80.17769784 44.82244171 -123.7436281 - X128_Y128= 44.82233533 80.17775731 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%54 // Backward 2 -GPDSquare - X1_Y1= 123.7437785 -24.99983582 -88.38826556 - X128_Y1= 123.7437122 25.00016418 -88.38826556 - X1_Y128= 88.38846291 -24.99988273 -123.7436281 - X128_Y128= 88.38839657 25.00011727 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%55 // Backward 2 -GPDSquare - X1_Y1= 69.82258126 -105.177572 -88.38826556 - X128_Y1= 105.17785 -69.82216261 -88.38826556 - X1_Y128= 44.82254809 -80.17763837 -123.7436281 - X128_Y128= 80.17781678 -44.82222895 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%56 // Backward 2 -GPDSquare - X1_Y1= -24.99967163 -123.7438117 -88.38826556 - X128_Y1= 25.00032837 -123.743679 -88.38826556 - X1_Y128= -24.99976545 -88.38849608 -123.7436281 - X128_Y128= 25.00023455 -88.3883634 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%57 // Backward 2 -GPDSquare - X1_Y1= -105.1774794 -69.82272081 -88.38826556 - X128_Y1= -69.82202306 -105.1779426 -88.38826556 - X1_Y128= -80.1775789 -44.82265447 -123.7436281 - X128_Y128= -44.82212257 -80.17787625 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%58 // Backward 2 -GPDSquare - X1_Y1= -123.7438449 24.99950745 -88.38826556 - X128_Y1= -123.7436458 -25.00049255 -88.38826556 - X1_Y128= -88.38852925 24.99964818 -123.7436281 - X128_Y128= -88.38833023 -25.00035182 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%59 // Backward 2 -GPDSquare - X1_Y1= -69.82286035 105.1773868 -88.38826556 - X128_Y1= -105.1780352 69.82188351 -88.38826556 - X1_Y128= -44.82276085 80.17751943 -123.7436281 - X128_Y128= -80.17793572 44.82201619 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%60 // Backward 3 -GPDSquare - X1_Y1= 25. 80.49963 -129.014764 - X128_Y1= -25. 80.49963 -129.014764 - X1_Y128= 25. 34.30567 -148.1489815 - X128_Y128= -25. 34.30567 -148.1489815 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%61 // Backward 3 -GPDSquare - X1_Y1= -80.49959838 25.00010681 -129.014764 - X128_Y1= -80.49966472 -24.99989319 -129.014764 - X1_Y128= -34.30564079 25.00004552 -148.1489815 - X128_Y128= -34.30570713 -24.99995448 -148.1489815 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%62 // Backward 3 -GPDSquare - X1_Y1= -25.00021361 -80.49956521 -129.014764 - X128_Y1= 24.99978639 -80.49969789 -129.014764 - X1_Y128= -25.00009103 -34.30560762 -148.1489815 - X128_Y128= 24.99990897 -34.3057403 -148.1489815 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%63 // Backward 3 -GPDSquare - X1_Y1= 80.49953204 -25.00032042 -129.014764 - X128_Y1= 80.49973106 24.99967958 -129.014764 - X1_Y128= 34.30557445 -25.00013655 -148.1489815 - X128_Y128= 34.30577347 24.99986345 -148.1489815 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all - - diff --git a/Inputs/DetectorConfiguration/gaspardV1_r150_69det.detector b/Inputs/DetectorConfiguration/gaspardV1_r150_69det.detector deleted file mode 100644 index 40cd678b7e6022220d93ba004c8ed903a6ca0329..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/gaspardV1_r150_69det.detector +++ /dev/null @@ -1,711 +0,0 @@ -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and distance given in mm -%%Angle given in degree -%% using the data from the experimental mesurement -%% special care is given for the X Y direction -%% NOTATTION USED IN THE FOLLOWING: -%% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 -%%Option: 0,1 for Si SiLi and CSI -%%Option: all or sensible for VISualisation -% 1.2 12.371134021 -% 2 20.618556701 -% 30 309.278350515 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -Target - THICKNESS= 0.001 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GaspardTracker -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 // central ring -GPDSquare - X1_Y1= 25 150 25 - X128_Y1= -25 150 25 - X1_Y128= 25 150 -25 - X128_Y128= -25 150 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -34.3055 148.149 25 - X128_Y1= -80.4995 129.0149 25 - X1_Y128= -34.3055 148.148 -25 - X128_Y128= -80.4995 129.0149 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -88.3883 123.7437 25 - X128_Y1= -123.744 88.388 25 - X1_Y128= -88.3883 123.7437 -25 - X128_Y128= -123.744 88.388 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -GPDSquare - X1_Y1= -129.015 80.49963 25 - X128_Y1= -148.149 34.30567 25 - X1_Y128= -129.015 80.49963 -25 - X128_Y128= -148.149 34.30567 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -GPDSquare - X1_Y1= -150. 25 25 - X128_Y1= -150. -25 25 - X1_Y128= -150. 25 -25 - X128_Y128= -150. -25 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -GPDSquare - X1_Y1= -148.1490726 -34.30528084 25 - X128_Y1= -129.0149776 -80.4992892 25 - X1_Y128= -148.1490726 -34.30528084 -25 - X128_Y128= -129.0149776 -80.4992892 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -GPDSquare - X1_Y1= -123.7438626 -88.38810137 25 - X128_Y1= -88.38859392 -123.7435108 25 - X1_Y128= -123.7438626 -88.38810137 -25 - X128_Y128= -88.38859392 -123.7435108 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -GPDSquare - X1_Y1= -80.49980273 -129.0146572 25 - X128_Y1= -34.30587053 -148.148936 25 - X1_Y128= -80.49980273 -129.0146572 -25 - X128_Y128= -34.30587053 -148.148936 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -GPDSquare - X1_Y1= -25.00039804 -149.9999337 25 - X128_Y1= 24.99960196 -150.0000663 25 - X1_Y128= -25.00039804 -149.9999337 -25 - X128_Y128= 24.99960196 -150.0000663 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 -GPDSquare - X1_Y1= 34.30508427 -148.1491181 25 - X128_Y1= 80.49911802 -129.0150844 25 - X1_Y128= 34.30508427 -148.1491181 -25 - X128_Y128= 80.49911802 -129.0150844 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 -GPDSquare - X1_Y1= 88.38793719 -123.7439799 25 - X128_Y1= 123.7433935 -88.3887581 25 - X1_Y128= 88.38793719 -123.7439799 -25 - X128_Y128= 123.7433935 -88.3887581 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 -GPDSquare - X1_Y1= 129.0145503 -80.4999739 25 - X128_Y1= 148.1488905 -34.30606709 25 - X1_Y128= 129.0145503 -80.4999739 -25 - X128_Y128= 148.1488905 -34.30606709 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 -GPDSquare - X1_Y1= 149.9999005 -25.00059706 25 - X128_Y1= 150.0000995 24.99940294 25 - X1_Y128= 149.9999005 -25.00059706 -25 - X128_Y128= 150.0000995 24.99940294 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 -GPDSquare - X1_Y1= 148.1491636 34.30488771 25 - X128_Y1= 129.0151912 80.49894684 25 - X1_Y128= 148.1491636 34.30488771 -25 - X128_Y128= 129.0151912 80.49894684 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 -GPDSquare - X1_Y1= 123.7440972 88.38777301 25 - X128_Y1= 88.38892229 123.7432763 25 - X1_Y128= 123.7440972 88.38777301 -25 - X128_Y128= 88.38892229 123.7432763 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 -GPDSquare - X1_Y1= 80.50014508 129.0144435 25 - X128_Y1= 34.30626365 148.148845 25 - X1_Y128= 80.50014508 129.0144435 -25 - X128_Y128= 34.30626365 148.148845 -25 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 // Forward 1 -GPDSquare - X1_Y1= 25 129.0149 80.49946 - X128_Y1= -25 129.0149 80.49946 - X1_Y128= 25 148.149 34.30548 - X128_Y128= -25 148.149 34.30548 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 // Forward 1 -GPDSquare - X1_Y1= -37.81974796 125.8550895 80.49946037 - X128_Y1= -82.09255873 102.6189489 80.49946037 - X1_Y128= -46.71182686 142.7975471 34.3054774 - X128_Y128= -90.98463762 119.5614066 34.305477 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18 // Forward 1 -GPDSquare - X1_Y1= -91.9754618 93.86347163 80.49946037 - X128_Y1= -120.3787327 52.71430153 80.49946037 - X1_Y128= -107.7225548 104.7329241 34.3054774 - X128_Y128= -136.1258258 63.58375404 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%19 // Forward 1 -GPDSquare - X1_Y1= -125.0607407 40.36889924 80.49946037 - X128_Y1= -131.0876355 -9.266537079 80.49946037 - X1_Y128= -144.0553846 42.67529019 34.3054774 - X128_Y128= -150.0822794 -6.960146136 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%20 // Forward 1 -GPDSquare - X1_Y1= -129.4961584 -22.37368614 80.49946037 - X128_Y1= -111.7659904 -69.12452723 80.49946037 - X1_Y128= -147.3869164 -29.15872226 34.3054774 - X128_Y128= -129.6567484 -75.90956335 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%21 // Forward 1 -GPDSquare - X1_Y1= -104.265616 -79.99073816 80.49946037 - X128_Y1= -66.84014631 -113.1469475 80.49946037 - X1_Y128= -116.9539379 -94.3128339 34.3054774 - X128_Y128= -79.52846813 -127.4690432 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22 // Forward 1 -GPDSquare - X1_Y1= -55.14911712 -119.2829064 80.49946037 - X128_Y1= -6.602055555 -131.2488085 80.49946037 - X1_Y128= -59.72826595 -137.8610477 34.3054774 - X128_Y128= -11.18120439 -149.8269498 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%23 // Forward 1 -GPDSquare - X1_Y1= 6.601358994 -131.2488436 80.49946037 - X128_Y1= 55.14848406 -119.2831991 80.49946037 - X1_Y128= 11.18040923 -149.8270091 34.3054774 - X128_Y128= 59.72753429 -137.8613647 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24 // Forward 1 -GPDSquare - X1_Y1= 66.83954582 -113.1473022 80.49946037 - X128_Y1= 104.2651915 -79.99129151 80.49946037 - X1_Y128= 79.52779163 -127.4694653 34.3054774 - X128_Y128= 116.9534373 -94.3134546 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%25 // Forward 1 -GPDSquare - X1_Y1= 111.7656236 -69.12512039 80.49946037 - X128_Y1= 129.4960397 -22.3743734 80.49946037 - X1_Y128= 129.6563456 -75.91025146 34.3054774 - X128_Y128= 147.3867617 -29.15950447 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%26 // Forward 1 -GPDSquare - X1_Y1= 131.0875863 -9.267232784 80.49946037 - X128_Y1= 125.0609549 40.36823552 80.49946037 - X1_Y128= 150.0822424 -6.96094265 34.3054774 - X128_Y128= 144.0556111 42.67452566 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%27 // Forward 1 -GPDSquare - X1_Y1= 120.3790125 52.71366266 80.49946037 - X128_Y1= 91.97595995 93.8629835 80.49946037 - X1_Y128= 136.1261632 63.58303159 34.3054774 - X128_Y128= 107.7231107 104.7323524 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%28 // Forward 1 -GPDSquare - X1_Y1= 82.09310335 102.6185133 80.49946037 - X128_Y1= 37.8204159 125.8548887 80.49946037 - X1_Y128= 90.98527216 119.5609237 34.3054774 - X128_Y128= 46.71258471 142.7972992 34.3054774 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%29 // Forward 2 -GPDSquare - X1_Y1= 25 88.38843 123.7436 - X128_Y1= -25 88.38843 123.7436 - X1_Y128= 25 123.7436 88.38843 - X128_Y128= -25 123.7436 88.38843 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%30 -GPDSquare - X1_Y1= -37.66382699 83.77917789 123.7436281 - X128_Y1= -75.9660681 51.63981999 123.7436281 - X1_Y128= -60.38976983 110.8629343 88.38826556 - X128_Y128= -98.69201094 78.72357645 88.38826556 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%31 -GPDSquare - X1_Y1= -82.7043593 39.96878112 123.7436281 - X128_Y1= -91.38682626 -9.271596295 123.7436281 - X1_Y128= -117.522541 46.1082083 88.38826556 - X128_Y128= -126.2050079 -3.132169106 88.38826556 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%32 -GPDSquare - X1_Y1= -89.04666544 -22.54342225 123.7436281 - X128_Y1= -64.04674204 -65.84473666 123.7436281 - X1_Y128= -119.6652982 -40.22102588 88.38826556 - X128_Y128= -94.66537478 -83.5223403 88.38826556 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%33 -GPDSquare - X1_Y1= -53.72311467 -74.50732489 123.7436281 - X128_Y1= -6.738523969 -91.60844288 123.7436281 - X1_Y128= -65.81542315 -107.7304255 88.38826556 - X128_Y128= -18.83083244 -124.8315435 88.38826556 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%34 -GPDSquare - X1_Y1= 6.738037787 -91.60847864 123.7436281 - X128_Y1= 53.72271925 -74.50761 123.7436281 - X1_Y128= 18.83016994 -124.8316435 88.38826556 - X128_Y128= 65.8148514 -107.7307748 88.38826556 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%35 -GPDSquare - X1_Y1= 64.04639259 -65.84507657 123.7436281 - X128_Y1= 89.04654579 -22.54389483 123.7436281 - X1_Y128= 94.66493151 -83.5228427 88.38826556 - X128_Y128= 119.6650847 -40.22166097 88.38826556 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%36 -GPDSquare - X1_Y1= 91.38677705 -9.272081301 123.7436281 - X128_Y1= 82.70457142 39.96834219 123.7436281 - X1_Y128= 126.2049913 -3.132838898 88.38826556 - X128_Y128= 117.5227857 46.10758459 88.38826556 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%37 -GPDSquare - X1_Y1= 75.96634216 51.63941683 123.7436281 - X128_Y1= 37.66427163 83.778978 123.7436281 - X1_Y128= 98.69242874 78.72305267 88.38826556 - X128_Y128= 60.3903582 110.8626138 88.38826556 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%38 // Forward 3 -GPDSquare - X1_Y1= 25 34.30548 148.149 - X128_Y1= -25 34.30548 148.149 - X1_Y128= 25 80.49946 129.0149 - X128_Y128= -25 80.49946 129.0149 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%39 -GPDSquare - X1_Y1= -34.30548 25 148.149 - X128_Y1= -34.30548 -25 148.149 - X1_Y128= -80.49946 25 129.0149 - X128_Y128= -80.49946 -25 129.0149 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40 -GPDSquare - X1_Y1= -25 -34.30548 148.149 - X128_Y1= 25 -34.30548 148.149 - X1_Y128= -25 -80.49946 129.0149 - X128_Y128= 25 -80.49946 129.0149 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%41 -GPDSquare - X1_Y1= 34.30548 -25 148.149 - X128_Y1= 34.30548 25 148.149 - X1_Y128= 80.49946 -25 129.0149 - X128_Y128= 80.49946 25 129.0149 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%42 // Backward 1 -GPDSquare - X1_Y1= 25 148.1490271 -34.3054774 - X128_Y1= -25 148.1490271 -34.3054774 - X1_Y128= 25 129.0148708 -80.49946037 - X128_Y128= -25 129.0148708 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%43 // Backward 1 -GPDSquare - X1_Y1= 90.98463762 119.5614066 -34.3054774 - X128_Y1= 46.71182686 142.7975471 -34.3054774 - X1_Y128= 82.09255873 102.6189489 -80.49946037 - X128_Y128= 37.81974796 125.8550895 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%44 // Backward 1 -GPDSquare - X1_Y1= 136.1258258 63.58375404 -34.3054774 - X128_Y1= 107.7225548 104.7329241 -34.3054774 - X1_Y128= 120.3787327 52.71430153 -80.49946037 - X128_Y128= 91.9754618 93.86347163 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%45 // Backward 1 -GPDSquare - X1_Y1= 150.0822794 -6.960146136 -34.3054774 - X128_Y1= 144.0553846 42.67529019 -34.3054774 - X1_Y128= 131.0876355 -9.266537079 -80.49946037 - X128_Y128= 125.0607407 40.36889924 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%46 // Backward 1 -GPDSquare - X1_Y1= 129.6567484 -75.90956335 -34.3054774 - X128_Y1= 147.3869164 -29.15872226 -34.3054774 - X1_Y128= 111.7659904 -69.12452723 -80.49946037 - X128_Y128= 129.4961584 -22.37368614 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%47 // Backward 1 -GPDSquare - X1_Y1= 79.52846813 -127.4690432 -34.3054774 - X128_Y1= 116.9539379 -94.3128339 -34.3054774 - X1_Y128= 66.84014631 -113.1469475 -80.49946037 - X128_Y128= 104.265616 -79.99073816 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%48 // Backward 1 -GPDSquare - X1_Y1= 11.18120439 -149.8269498 -34.3054774 - X128_Y1= 59.72826595 -137.8610477 -34.3054774 - X1_Y128= 6.602055555 -131.2488085 -80.49946037 - X128_Y128= 55.14911712 -119.2829064 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%49 // Backward 1 -GPDSquare - X1_Y1= -59.72753429 -137.8613647 -34.3054774 - X128_Y1= -11.18040923 -149.8270091 -34.3054774 - X1_Y128= -55.14848406 -119.2831991 -80.49946037 - X128_Y128= -6.601358994 -131.2488436 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%50 // Backward 1 -GPDSquare - X1_Y1= -116.9534373 -94.3134546 -34.3054774 - X128_Y1= -79.52779163 -127.4694653 -34.3054774 - X1_Y128= -104.2651915 -79.99129151 -80.49946037 - X128_Y128= -66.83954582 -113.1473022 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%51 // Backward 1 -GPDSquare - X1_Y1= -147.3867617 -29.15950447 -34.3054774 - X128_Y1= -129.6563456 -75.91025146 -34.3054774 - X1_Y128= -129.4960397 -22.3743734 -80.49946037 - X128_Y128= -111.7656236 -69.12512039 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%52 // Backward 1 -GPDSquare - X1_Y1= -144.0556111 42.67452566 -34.3054774 - X128_Y1= -150.0822424 -6.96094265 -34.3054774 - X1_Y128= -125.0609549 40.36823552 -80.49946037 - X128_Y128= -131.0875863 -9.267232784 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%53 // Backward 1 -GPDSquare - X1_Y1= -107.7231107 104.7323524 -34.3054774 - X128_Y1= -136.1261632 63.58303159 -34.3054774 - X1_Y128= -91.97595995 93.8629835 -80.49946037 - X128_Y128= -120.3790125 52.71366266 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%54 // Backward 1 -GPDSquare - X1_Y1= -46.71258471 142.7972992 -34.3054774 - X128_Y1= -90.98527216 119.5609237 -34.3054774 - X1_Y128= -37.8204159 125.8548887 -80.49946037 - X128_Y128= -82.09310335 102.6185133 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%55 // Backward 2 -GPDSquare - X1_Y1= 25 123.7437453 -88.38826556 - X128_Y1= -25 123.7437453 -88.38826556 - X1_Y128= 25 88.38842974 -123.7436281 - X128_Y128= -25 88.38842974 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%56 // Backward 2 -GPDSquare - X1_Y1= 98.69201094 78.72357645 -88.38826556 - X128_Y1= 60.38976983 110.8629343 -88.38826556 - X1_Y128= 75.9660681 51.63981999 -123.7436281 - X128_Y128= 37.66382699 83.77917789 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%57 // Backward 2 -GPDSquare - X1_Y1= 126.2050079 -3.132169106 -88.38826556 - X128_Y1= 117.522541 46.1082083 -88.38826556 - X1_Y128= 91.38682626 -9.271596295 -123.7436281 - X128_Y128= 82.7043593 39.96878112 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%58 // Backward 2 -GPDSquare - X1_Y1= 94.66537478 -83.5223403 -88.38826556 - X128_Y1= 119.6652982 -40.22102588 -88.38826556 - X1_Y128= 64.04674204 -65.84473666 -123.7436281 - X128_Y128= 89.04666544 -22.54342225 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%59 // Backward 2 -GPDSquare - X1_Y1= 18.83083244 -124.8315435 -88.38826556 - X128_Y1= 65.81542315 -107.7304255 -88.38826556 - X1_Y128= 6.738523969 -91.60844288 -123.7436281 - X128_Y128= 53.72311467 -74.50732489 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%60 // Backward 2 -GPDSquare - X1_Y1= -65.8148514 -107.7307748 -88.38826556 - X128_Y1= -18.83016994 -124.8316435 -88.38826556 - X1_Y128= -53.72271925 -74.50761 -123.7436281 - X128_Y128= -6.738037787 -91.60847864 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%61 // Backward 2 -GPDSquare - X1_Y1= -119.6650847 -40.22166097 -88.38826556 - X128_Y1= -94.66493151 -83.5228427 -88.38826556 - X1_Y128= -89.04654579 -22.54389483 -123.7436281 - X128_Y128= -64.04639259 -65.84507657 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%62 // Backward 2 -GPDSquare - X1_Y1= -117.5227857 46.10758459 -88.38826556 - X128_Y1= -126.2049913 -3.132838898 -88.38826556 - X1_Y128= -82.70457142 39.96834219 -123.7436281 - X128_Y128= -91.38677705 -9.272081301 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%63 // Backward 2 -GPDSquare - X1_Y1= -60.3903582 110.8626138 -88.38826556 - X128_Y1= -98.69242874 78.72305267 -88.38826556 - X1_Y128= -37.66427163 83.778978 -123.7436281 - X128_Y128= -75.96634216 51.63941683 -123.7436281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%64 // Backward 2 -GPDSquare - X1_Y1= 25 80.49963155 -129.014764 - X128_Y1= -25 80.49963155 -129.014764 - X1_Y128= 25 34.30567396 -148.1489815 - X128_Y128= -25 34.30567396 -148.1489815 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%65 // Backward 3 -GPDSquare - X1_Y1= -80.49959838 25.00010681 -129.014764 - X128_Y1= -80.49966472 -24.99989319 -129.014764 - X1_Y128= -34.30564079 25.00004552 -148.1489815 - X128_Y128= -34.30570713 -24.99995448 -148.1489815 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%66 // Backward 3 -GPDSquare - X1_Y1= -25.00021361 -80.49956521 -129.014764 - X128_Y1= 24.99978639 -80.49969789 -129.014764 - X1_Y128= -25.00009103 -34.30560762 -148.1489815 - X128_Y128= 24.99990897 -34.3057403 -148.1489815 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%67 // Backward 3 -GPDSquare - X1_Y1= 80.49953204 -25.00032042 -129.014764 - X128_Y1= 80.49973106 24.99967958 -129.014764 - X1_Y128= 34.30557445 -25.00013655 -148.1489815 - X128_Y128= 34.30577347 24.99986345 -148.1489815 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%68 // Backward 3 - diff --git a/Inputs/DetectorConfiguration/gaspardV1_r150asy.detector b/Inputs/DetectorConfiguration/gaspardV1_r150asy.detector deleted file mode 100644 index 053d0315a965f4531d4107bb59855539b1da8454..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/gaspardV1_r150asy.detector +++ /dev/null @@ -1,690 +0,0 @@ -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and distance given in mm -%%Angle given in degree -%% using the data from the experimental mesurement -%% special care is given for the X Y direction -%% NOTATTION USED IN THE FOLLOWING: -%% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 -%%Option: 0,1 for Si SiLi and CSI -%%Option: all or sensible for VISualisation -% 1.2 12.371134021 -% 2 20.618556701 -% 30 309.278350515 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -Target - THICKNESS= 0.001 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GaspardTracker -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 // central ring -GPDSquare - X1_Y1= -88.38826556 100.2608923 76.71550028 - X128_Y1= -123.7436281 68.48373921 61.21676222 - X1_Y128= -88.38826556 122.1794324 31.77578957 - X128_Y128= -123.7436281 90.40227932 16.2770515 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -129.014764 61.39333304 57.75854342 - X128_Y1= -148.1489815 19.87447122 37.50846118 - X1_Y128= -129.014764 83.31187315 12.81883271 - X128_Y128= -148.1489815 41.79301133 -7.431249539 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -149.9999668 11.51076418 33.42921266 - X128_Y1= -150.0000332 -33.42894654 11.51067255 - X1_Y128= -149.9999668 33.42930429 -11.51049806 - X128_Y128= -150.0000332 -11.51040642 -33.42903817 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -148.1490726 -41.79265799 7.431421875 - X128_Y1= -129.0149776 -83.31156544 -12.81868263 - X1_Y128= -148.1490726 -19.87411788 -37.50828884 - X128_Y128= -129.0149776 -61.39302533 -57.75839335 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -123.7438626 -90.40198419 -16.27690755 - X128_Y1= -88.38859392 -122.1792216 -31.77568675 - X1_Y128= -123.7438626 -68.48344407 -61.21661827 - X128_Y128= -88.38859392 -100.2606815 -76.71539746 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -80.49980273 -126.9168975 -34.08640341 - X128_Y1= -34.30587053 -144.1146766 -42.47431259 - X1_Y128= -80.49980273 -104.9983574 -79.02611412 - X128_Y128= -34.30587053 -122.1961365 -87.4140233 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -25.00039804 -145.7783426 -43.2857359 - X128_Y1= 24.99960196 -145.7784618 -43.28579407 - X1_Y128= -25.00039804 -123.8598025 -88.22544662 - X128_Y128= 24.99960196 -123.8599217 -88.22550478 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 34.30508427 -144.1148403 -42.4743924 - X128_Y1= 80.49911802 -126.9172815 -34.08659069 - X1_Y128= 34.30508427 -122.1963001 -87.41410312 - X128_Y128= 80.49911802 -104.9987413 -79.02630141 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 88.38793719 -122.1796432 -31.77589238 - X128_Y1= 123.7433935 -90.40257445 -16.27719544 - X1_Y128= 88.38793719 -100.2611031 -76.7156031 - X128_Y128= 123.7433935 -68.48403434 -61.21690616 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 129.0145503 -83.31218085 -12.81898279 - X128_Y1= 148.1488905 -41.79336467 7.431077204 - X1_Y128= 129.0145503 -61.39364074 -57.7586935 - X128_Y128= 148.1488905 -19.87482456 -37.50863351 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 149.9999005 -33.42966205 11.51032357 - X128_Y1= 150.0000995 11.51004867 33.42886368 - X1_Y128= 149.9999005 -11.51112193 -33.42938715 - X128_Y128= 150.0000995 33.42858878 -11.51084703 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 148.1491636 19.87376454 37.50811651 - X128_Y1= 129.0151912 61.39271763 57.75824327 - X1_Y128= 148.1491636 41.79230465 -7.43159421 - X128_Y128= 129.0151912 83.31125774 12.81853255 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 123.7440972 68.48314894 61.21647432 - X128_Y1= 88.38892229 100.2604707 76.71529465 - X1_Y128= 123.7440972 90.40168905 16.27676361 - X128_Y128= 88.38892229 122.1790108 31.77558393 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 80.50014508 104.9981654 79.02602048 - X128_Y1= 34.30626365 122.1960547 87.4139834 - X1_Y128= 80.50014508 126.9167055 34.08630976 - X128_Y128= 34.30626365 144.1145948 42.47427268 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 25.00079608 123.8597428 88.22541754 - X128_Y1= -24.99920392 123.8599813 88.22553386 - X1_Y128= 25.00079608 145.778283 43.28570682 - X128_Y128= -24.99920392 145.7785215 43.28582315 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -34.30469115 122.196382 87.41414302 - X128_Y1= -80.49877567 104.9989333 79.02639505 - X1_Y128= -34.30469115 144.1149221 42.47443231 - X128_Y128= -80.49877567 126.9174735 34.08668433 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -73.54954822 62.59457836 120.0932251 - X128_Y1= -108.9049107 30.81742525 104.594487 - X1_Y128= -87.07943091 95.00526816 84.50545388 - X128_Y128= -122.4347934 63.22811504 69.00671581 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -118.1482559 16.42781008 97.57620961 - X128_Y1= -131.0892616 -26.98060427 76.40453192 - X1_Y128= -136.6304262 41.12900608 58.22827068 - X128_Y128= -149.5714318 -2.279408262 37.05659298 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -131.0892861 -43.59630914 68.30051905 - X128_Y1= -118.1484086 -87.00475435 47.1288263 - X1_Y128= -149.5714695 -27.79727431 24.61071023 - X128_Y128= -136.630592 -71.20571952 3.439017474 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -108.9051059 -101.3943916 40.11053812 - X128_Y1= -73.54983721 -133.171629 24.61175893 - X1_Y128= -122.4350245 -93.30486234 -7.339444172 - X128_Y128= -87.0797558 -125.0820998 -22.83822337 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -57.5399387 -141.4795132 20.55973698 - X128_Y1= -9.243678868 -153.1108719 14.88674986 - X1_Y128= -62.49226772 -137.8410817 -29.06118858 - X128_Y128= -14.19600789 -149.4724403 -34.7341757 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 9.242983154 -153.1109159 14.88672835 - X128_Y1= 57.53931167 -141.4797877 20.55960311 - X1_Y128= 14.19521408 -149.472508 -34.73420872 - X128_Y128= 62.4915426 -137.8413798 -29.06133396 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 73.54925923 -133.1719798 24.61158781 - X128_Y1= 108.9047156 -101.394911 40.11028475 - X1_Y128= 87.07910602 -125.0825151 -22.83842596 - X128_Y128= 122.4345624 -93.30544636 -7.339729018 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 118.1481032 -87.00531792 47.12855143 - X128_Y1= 131.089237 -43.59693444 68.30021407 - X1_Y128= 136.6302603 -71.20637125 3.438699602 - X128_Y128= 149.5713941 -27.79798777 24.61036225 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 131.0893106 -26.98122957 76.40422694 - X128_Y1= 118.1485613 16.4272465 97.57593474 - X1_Y128= 149.5715072 -2.280121727 37.056245 - X128_Y128= 136.6307578 41.12835435 58.22795281 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 108.9053011 30.81690576 104.5942337 - X128_Y1= 73.5501262 62.59422752 120.093054 - X1_Y128= 122.4352556 63.22753102 69.00643096 - X128_Y128= 87.08008069 95.00485278 84.50525128 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 57.54025222 70.90214996 124.1450946 - X128_Y1= 9.244026725 82.53362375 129.8181379 - X1_Y128= 62.49263028 107.7638933 90.7282451 - X128_Y128= 14.19640479 119.3953671 96.4012884 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -9.242635297 82.53371193 129.8181809 - X128_Y1= -57.53899815 70.90269889 124.1453623 - X1_Y128= -14.19481718 119.3955025 96.40135445 - X128_Y128= -62.49118004 107.7644895 90.72853587 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -44.82233533 17.81771087 146.3676448 - X128_Y1= -80.17769784 -13.95944224 130.8689067 - X1_Y128= -69.82230216 55.78632486 125.5497196 - X128_Y128= -105.1776647 24.00917175 110.0509815 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -88.38839657 -31.77563275 122.1793784 - X128_Y1= -88.38846291 -76.71534347 100.2608383 - X1_Y128= -123.7437122 -16.27683196 90.40220373 - X128_Y128= -123.7437785 -61.21654268 68.48366361 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -80.17781678 -94.53155357 91.57130051 - X128_Y1= -44.82254809 -126.308791 76.07252131 - X1_Y128= -105.17785 -101.5025907 48.83486426 - X128_Y128= -69.82258126 -133.2798281 33.33608506 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -25.00023455 -133.6885432 72.47317919 - X128_Y1= 24.99976545 -133.6886624 72.47312103 - X1_Y128= -25.00032837 -149.9669376 25.19724585 - X128_Y128= 24.99967163 -149.9670569 25.19718769 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 44.82212257 -126.3090048 76.07241703 - X128_Y1= 80.1775789 -94.53193602 91.57111397 - X1_Y128= 69.82202306 -133.2801612 33.33592262 - X128_Y128= 105.1774794 -101.5030924 48.83461956 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 88.38833023 -76.71576509 100.2606327 - X128_Y1= 88.38852925 -31.77605437 122.1791728 - X1_Y128= 123.7436458 -61.21713294 68.48337572 - X128_Y128= 123.7438449 -16.27742223 90.40191584 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 80.17793572 -13.95982469 130.8687202 - X128_Y1= 44.82276085 17.81749707 146.3675405 - X1_Y128= 105.1780352 24.00867005 110.0507368 - X128_Y128= 69.82286035 55.7859918 125.5495571 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 25.00046909 25.1972965 149.9669057 - X128_Y1= -24.99953091 25.197535 149.967022 - X1_Y128= 25.00065673 72.47320824 133.6884485 - X128_Y128= -24.99934327 72.47344674 133.6885648 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -6.580077344 -27.25284933 151.5387237 - X128_Y1= -41.93543986 -59.03000244 136.0399856 - X1_Y128= -39.24411633 10.49332119 148.6599796 - X128_Y128= -74.59947885 -21.28383192 133.1612416 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -41.93545732 -70.85827334 130.2709581 - X128_Y1= -6.580188623 -102.6355108 114.7721789 - X1_Y128= -74.59958298 -91.82860133 98.75429204 - X128_Y128= -39.24431429 -123.6058388 83.25551285 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 6.579966064 -102.6355422 114.7721636 - X128_Y1= 41.9354224 -70.85847337 130.2708605 - X1_Y128= 39.24391838 -123.606026 83.25542154 - X128_Y128= 74.59937471 -91.82895717 98.75411848 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= 41.93547478 -59.03020248 136.0398881 - X128_Y1= 6.580299903 -27.25288072 151.5387084 - X1_Y128= 74.59968712 -21.28418776 133.161068 - X128_Y128= 39.24451225 10.493134 148.6598883 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Forward 4 -GPDSquare - X1_Y1= 35.35533906 -65.75564142 134.8191219 - X128_Y1= -2.34546E-05 -97.53279453 119.3203838 - X1_Y128= 2.34546E-05 -33.97844615 150.3178805 - X128_Y128= -35.35533906 -65.75559926 134.8191424 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 -GPDSquare - X1_Y1= -87.07943091 125.0823075 22.83832466 - X128_Y1= -122.4347934 93.30515435 7.339586595 - X1_Y128= -73.54954822 133.1718044 -24.61167337 - X128_Y128= -108.9049107 101.3946513 -40.11041144 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 -GPDSquare - X1_Y1= -14.19561099 149.4724741 34.73419221 - X128_Y1= -62.49190516 137.8412307 29.06126127 - X1_Y128= -9.243331011 153.1108939 -14.8867391 - X128_Y128= -57.53962519 141.4796505 -20.55967004 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 -GPDSquare - X1_Y1= 62.49190516 137.8412307 29.06126127 - X128_Y1= 14.19561099 149.4724741 34.73419221 - X1_Y128= 57.53962519 141.4796505 -20.55967004 - X128_Y128= 9.243331011 153.1108939 -14.8867391 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 -GPDSquare - X1_Y1= 122.4347934 93.30515435 7.339586595 - X128_Y1= 87.07943091 125.0823075 22.83832466 - X1_Y128= 108.9049107 101.3946513 -40.11041144 - X128_Y128= 73.54954822 133.1718044 -24.61167337 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 -GPDSquare - X1_Y1= 149.5714318 27.79763104 -24.61053624 - X128_Y1= 136.6304262 71.20604539 -3.438858538 - X1_Y128= 131.0892616 43.59662179 -68.30036656 - X128_Y128= 118.1482559 87.00503613 -47.12868887 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 -GPDSquare - X1_Y1= 136.630592 -41.12868022 -58.22811174 - X128_Y1= 149.5714695 2.279764995 -37.05641899 - X1_Y128= 118.1484086 -16.42752829 -97.57607218 - X128_Y128= 131.0892861 26.98091692 -76.40437943 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 -GPDSquare - X1_Y1= 87.0797558 -95.00506047 -84.50535258 - X128_Y1= 122.4350245 -63.22782303 -69.00657339 - X1_Y128= 73.54983721 -62.59440294 -120.0931396 - X128_Y128= 108.9051059 -30.81716551 -104.5943604 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 -GPDSquare - X1_Y1= 14.19600789 -119.395401 -96.40130491 - X128_Y1= 62.49226772 -107.7640424 -90.72831779 - X1_Y128= 9.243678868 -82.5336458 -129.8181486 - X128_Y128= 57.5399387 -70.90228719 -124.1451615 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 -GPDSquare - X1_Y1= -62.4915426 -107.7643404 -90.72846318 - X128_Y1= -14.19521408 -119.3954687 -96.40133794 - X1_Y128= -57.53931167 -70.90256166 -124.1452954 - X128_Y128= -9.242983154 -82.53368989 -129.8181701 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 -GPDSquare - X1_Y1= -122.4345624 -63.22840705 -69.00685823 - X128_Y1= -87.07910602 -95.00547584 -84.50555517 - X1_Y128= -108.9047156 -30.81768499 -104.5946137 - X128_Y128= -73.54925923 -62.59475378 -120.0933107 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 -GPDSquare - X1_Y1= -149.5713941 2.27905153 -37.05676697 - X128_Y1= -136.6302603 -41.12933195 -58.22842961 - X1_Y128= -131.089237 26.98029162 -76.40468441 - X128_Y128= -118.1481032 -16.42809187 -97.57634705 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 -GPDSquare - X1_Y1= -136.6307578 71.20539365 -3.43917641 - X128_Y1= -149.5715072 27.79691757 -24.61088422 - X1_Y128= -118.1485613 87.00447256 -47.12896374 - X128_Y128= -131.0893106 43.59599648 -68.30067154 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 2 -GPDSquare - X1_Y1= -69.82230216 133.2799946 -33.33600384 - X128_Y1= -105.1776647 101.5028415 -48.83474191 - X1_Y128= -44.82233533 126.3088979 -76.07246917 - X128_Y128= -80.17769784 94.53174479 -91.57120724 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 2 -GPDSquare - X1_Y1= 25 149.9669973 -25.19721677 - X128_Y1= -25 149.9669973 -25.19721677 - X1_Y128= 25 133.6886028 -72.47315011 - X128_Y128= -25 133.6886028 -72.47315011 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 2 -GPDSquare - X1_Y1= 105.1776647 101.5028415 -48.83474191 - X128_Y1= 69.82230216 133.2799946 -33.33600384 - X1_Y128= 80.17769784 94.53174479 -91.57120724 - X128_Y128= 44.82233533 126.3088979 -76.07246917 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 2 -GPDSquare - X1_Y1= 123.7437785 16.27712709 -90.40205978 - X128_Y1= 123.7437122 61.21683781 -68.48351967 - X1_Y128= 88.38846291 31.77584356 -122.1792756 - X128_Y128= 88.38839657 76.71555428 -100.2607355 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 2 -GPDSquare - X1_Y1= 69.82258126 -55.78615833 -125.5496383 - X128_Y1= 105.17785 -24.0089209 -110.0508591 - X1_Y128= 44.82254809 -17.81760397 -146.3675926 - X128_Y128= 80.17781678 13.95963346 -130.8688134 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 2 -GPDSquare - X1_Y1= -24.99967163 -72.47338711 -133.6885357 - X128_Y1= 25.00032837 -72.47326786 -133.6884775 - X1_Y128= -24.99976545 -25.19747537 -149.9669929 - X128_Y128= 25.00023455 -25.19735612 -149.9669347 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 2 -GPDSquare - X1_Y1= -105.1774794 -24.0094226 -110.0511038 - X128_Y1= -69.82202306 -55.78649139 -125.5498008 - X1_Y128= -80.1775789 13.95925101 -130.869 - X128_Y128= -44.82212257 -17.81781778 -146.3676969 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 2 -GPDSquare - X1_Y1= -123.7438449 61.21624754 -68.48380756 - X128_Y1= -123.7436458 16.27653683 -90.40234767 - X1_Y128= -88.38852925 76.71513266 -100.2609411 - X128_Y128= -88.38833023 31.77542194 -122.1794813 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 3 -GPDSquare - X1_Y1= -39.24411633 123.6059324 -83.25546719 - X128_Y1= -74.59947885 91.82877925 -98.75420526 - X1_Y128= -6.580077344 102.6355265 -114.7721712 - X128_Y128= -41.93543986 70.85837335 -130.2709093 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 3 -GPDSquare - X1_Y1= -74.59958298 21.28400984 -133.1611548 - X128_Y1= -39.24431429 -10.4932276 -148.659934 - X1_Y128= -41.93545732 59.03010246 -136.0399369 - X128_Y128= -6.580188623 27.25286503 -151.5387161 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 3 -GPDSquare - X1_Y1= 39.24391838 -10.49341479 -148.6600253 - X128_Y1= 74.59937471 21.283654 -133.1613283 - X1_Y128= 6.579966064 27.25283364 -151.5387314 - X128_Y128= 41.9354224 59.02990243 -136.0400344 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 3 -GPDSquare - X1_Y1= 74.59968712 91.82842341 -98.75437882 - X128_Y1= 39.24451225 123.6057452 -83.2555585 - X1_Y128= 41.93547478 70.85817332 -130.2710069 - X128_Y128= 6.580299903 102.6354951 -114.7721865 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% / Backward 4 -GPDSquare - X1_Y1= 2.34546E-05 97.53279453 -119.3203838 - X128_Y1= -35.35533906 65.75564142 -134.8191219 - X1_Y128= 35.35533906 65.75559926 -134.8191424 - X128_Y128= -2.34546E-05 33.97844615 -150.3178805 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/gaspardV1_r150asy_1.detector b/Inputs/DetectorConfiguration/gaspardV1_r150asy_1.detector deleted file mode 100644 index 5e8f85de52b5b92b59c49c689070079ef0460c88..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/gaspardV1_r150asy_1.detector +++ /dev/null @@ -1,670 +0,0 @@ -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and distance given in mm -%%Angle given in degree -%% using the data from the experimental mesurement -%% special care is given for the X Y direction -%% NOTATTION USED IN THE FOLLOWING: -%% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 -%%Option: 0,1 for Si SiLi and CSI -%%Option: all or sensible for VISualisation -% 1.2 12.371134021 -% 2 20.618556701 -% 30 309.278350515 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -Target - THICKNESS= 0.001 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GaspardTracker -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 // central ring -GPDSquare - X1_Y1= -88.38826556 104.7572512 70.45163477 - X128_Y1= -123.7436281 72.09319422 56.92175207 - X1_Y128= -88.38826556 123.8914075 24.25765179 - X128_Y128= -123.7436281 91.22735051 10.7277691 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GPDSquare - X1_Y1= -129.014764 64.80489403 53.90284212 - X128_Y1= -148.1489815 22.12723623 36.22519404 - X1_Y128= -129.014764 83.93905033 7.70885915 - X128_Y128= -148.1489815 41.26139253 -9.968788937 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -149.9999668 13.53009721 32.6641458 - X128_Y1= -150.0000332 -32.66388576 13.5299895 - X1_Y128= -149.9999668 32.6642535 -13.52983718 - X128_Y128= -150.0000332 -13.52972947 -32.66399347 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -148.1490726 -41.26102933 9.96893938 - X128_Y1= -129.0149776 -83.93873404 -7.708728138 - X1_Y128= -148.1490726 -22.12687303 -36.22504359 - X128_Y128= -129.0149776 -64.80457774 -53.90271111 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -123.7438626 -91.22704714 -10.72764344 - X128_Y1= -88.38859392 -123.8911908 -24.25756204 - X1_Y128= -123.7438626 -72.09289085 -56.92162641 - X128_Y128= -88.38859392 -104.7570345 -70.45154501 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -80.49980273 -128.7610957 -26.2747408 - X128_Y1= -34.30587053 -146.4388667 -33.59710646 - X1_Y128= -80.49980273 -109.6269394 -72.46872378 - X128_Y128= -34.30587053 -127.3047104 -79.79108943 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -25.00039804 -148.1489658 -34.30545201 - X128_Y1= 24.99960196 -148.1490884 -34.30550279 - X1_Y128= -25.00039804 -129.0148095 -80.49943499 - X128_Y128= 24.99960196 -129.0149321 -80.49948576 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 34.30508427 -146.4390349 -33.59717613 - X128_Y1= 80.49911802 -128.7614904 -26.2749043 - X1_Y128= 34.30508427 -127.3048786 -79.7911591 - X128_Y128= 80.49911802 -109.6273341 -72.46888727 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 88.38793719 -123.8916241 -24.25774155 - X128_Y1= 123.7433935 -91.22765388 -10.72789476 - X1_Y128= 88.38793719 -104.7574679 -70.45172452 - X128_Y128= 123.7433935 -72.09349759 -56.92187773 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 129.0145503 -83.93936662 -7.708990163 - X128_Y1= 148.1488905 -41.26175573 9.968638494 - X1_Y128= 129.0145503 -64.80521033 -53.90297313 - X128_Y128= 148.1488905 -22.12759943 -36.22534448 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 149.9999005 -32.66462124 13.52968485 - X128_Y1= 150.0000995 13.52936173 32.66384115 - X1_Y128= 149.9999005 -13.53046495 -32.66429812 - X128_Y128= 150.0000995 32.66351802 -13.53014182 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 148.1491636 22.12650983 36.22489315 - X128_Y1= 129.0151912 64.80426145 53.9025801 - X1_Y128= 148.1491636 41.26066612 -9.969089823 - X128_Y128= 129.0151912 83.93841774 7.708597125 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 123.7440972 72.09258748 56.92150075 - X128_Y1= 88.38892229 104.7568178 70.45145525 - X1_Y128= 123.7440972 91.22674377 10.72751778 - X128_Y128= 88.38892229 123.8909741 24.25747228 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 80.50014508 109.626742 72.46864203 - X128_Y1= 34.30626365 127.3046263 79.79105459 - X1_Y128= 80.50014508 128.7608983 26.27465906 - X128_Y128= 34.30626365 146.4387826 33.59707162 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 25.00079608 129.0147482 80.4994096 - X128_Y1= -24.99920392 129.0149933 80.49951115 - X1_Y128= 25.00079608 148.1489045 34.30542663 - X128_Y128= -24.99920392 148.1491496 34.30552817 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -34.30469115 127.3049627 79.79119394 - X128_Y1= -80.49877567 109.6275314 72.46896901 - X1_Y128= -34.30469115 146.439119 33.59721096 - X128_Y128= -80.49877567 128.7616877 26.27498604 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -73.54954822 69.80933687 116.047923 - X128_Y1= -108.9049107 37.14527993 102.5180404 - X1_Y128= -87.07943091 99.98699467 78.54790646 - X128_Y128= -122.4347934 67.32293773 65.01802377 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -118.1482559 22.35404902 96.39131766 - X128_Y1= -131.0892616 -22.26589893 77.9091474 - X1_Y128= -136.6304262 44.60704021 55.60879976 - X128_Y128= -149.5714318 -0.01290774 37.12662951 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -131.0892861 -39.34534995 70.83461379 - X128_Y1= -118.1484086 -83.96532963 52.35243039 - X1_Y128= -149.5714695 -26.24298023 26.26178794 - X128_Y128= -136.630592 -70.86295991 7.77960454 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -108.9051059 -98.75658319 46.22569831 - X128_Y1= -73.54983721 -131.4207268 32.69577971 - X1_Y128= -122.4350245 -93.57889222 -1.62963388 - X128_Y128= -87.0797558 -126.2430358 -15.15955248 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -57.5399387 -139.960485 29.15849936 - X128_Y1= -9.243678868 -151.9164761 24.20617034 - X1_Y128= -62.49226772 -139.3581223 -20.59199407 - X128_Y128= -14.19600789 -151.3141134 -25.54432309 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 9.242983154 -151.9165214 24.20615157 - X128_Y1= 57.53931167 -139.9607672 29.1583825 - X1_Y128= 14.19521408 -151.314183 -25.54435192 - X128_Y128= 62.4915426 -139.3584287 -20.59212099 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 73.54925923 -131.4210874 32.69563034 - X128_Y1= 108.9047156 -98.75711718 46.22547713 - X1_Y128= 87.07910602 -126.2434628 -15.15972933 - X128_Y128= 122.4345624 -93.57949254 -1.629882541 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 118.1481032 -83.96590893 52.35219044 - X128_Y1= 131.089237 -39.3459927 70.83434755 - X1_Y128= 136.6302603 -70.86362983 7.779327048 - X128_Y128= 149.5713941 -26.2437136 26.26148416 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 131.0893106 -22.26654169 77.90888116 - X128_Y1= 118.1485613 22.35346971 96.3910777 - X1_Y128= 149.5715072 -0.013641119 37.12632573 - X128_Y128= 136.6307578 44.60637029 55.60852227 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 108.9053011 37.14474594 102.5178192 - X128_Y1= 73.5501262 69.80897624 116.0477737 - X1_Y128= 122.4352556 67.3223374 65.01777511 - X128_Y128= 87.08008069 99.9865677 78.5477296 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 57.54025222 78.3487737 119.5850703 - X128_Y1= 9.244026725 90.3048832 124.5374483 - X1_Y128= 62.49263028 113.1017145 83.98019617 - X128_Y128= 14.19640479 125.057824 88.93257423 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -9.242635297 90.30497385 124.5374859 - X128_Y1= -57.53899815 78.34933796 119.585304 - X1_Y128= -14.19481718 125.0579632 88.93263189 - X128_Y128= -62.49118004 113.1023273 83.98045 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -44.82233533 26.72000072 145.0068958 - X128_Y1= -80.17769784 -5.944056222 131.4770131 - X1_Y128= -69.82230216 63.34689285 121.9098736 - X128_Y128= -105.1776647 30.68283591 108.3799909 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -88.38839657 -24.25749857 123.891344 - X128_Y1= -88.38846291 -70.45148154 104.7571877 - X1_Y128= -123.7437122 -10.72755459 91.22726166 - X128_Y128= -123.7437785 -56.92153756 72.09310536 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -80.17781678 -88.76494402 97.17151028 - X128_Y1= -44.82254809 -121.4290876 83.64159168 - X1_Y128= -105.17785 -98.33197357 54.94035724 - X128_Y128= -69.82258126 -130.9961172 41.41043864 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -25.00023455 -129.0148095 80.49948576 - X128_Y1= 24.99976545 -129.0149321 80.49943499 - X1_Y128= -25.00032837 -148.1489658 34.30550279 - X128_Y128= 24.99967163 -148.1490884 34.30545201 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 44.82212257 -121.4293074 83.64150065 - X128_Y1= 80.1775789 -88.76533715 97.17134744 - X1_Y128= 69.82202306 -130.9964595 41.41029683 - X128_Y128= 105.1774794 -98.33248928 54.94014362 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 88.38833023 -70.45191493 104.7570082 - X128_Y1= 88.38852925 -24.25793196 123.8911645 - X1_Y128= 123.7436458 -56.9221443 72.09285404 - X128_Y128= 123.7438449 -10.72816133 91.22701034 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 80.17793572 -5.94444935 131.4768502 - X128_Y1= 44.82276085 26.71978094 145.0068047 - X1_Y128= 105.1780352 30.6823202 108.3797773 - X128_Y128= 69.82286035 63.3465505 121.9097318 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 25.00046909 34.30555138 148.1489308 - X128_Y1= -24.99953091 34.30579654 148.1490323 - X1_Y128= 25.00065673 80.49950897 129.0147132 - X128_Y128= -24.99934327 80.49975413 129.0148147 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -6.580077344 -17.9508074 152.9198192 - X128_Y1= -41.93543986 -50.61486434 139.3899365 - X1_Y128= -39.24411633 19.54921605 147.7420979 - X128_Y128= -74.59947885 -13.11484089 134.2122152 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -41.93545732 -62.77326357 134.3537673 - X128_Y1= -6.580188623 -95.43740719 120.8238487 - X1_Y128= -74.59958298 -85.62852255 104.176093 - X128_Y128= -39.24431429 -118.2926662 90.64617436 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 6.579966064 -95.43743945 120.8238354 - X128_Y1= 41.9354224 -62.77346919 134.3536822 - X1_Y128= 39.24391838 -118.2928586 90.64609466 - X128_Y128= 74.59937471 -85.62888833 104.1759414 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 41.93547478 -50.61506996 139.3898513 - X128_Y1= 6.580299903 -17.95083966 152.9198058 - X1_Y128= 74.59968712 -13.11520666 134.2120637 - X128_Y128= 39.24451225 19.54902363 147.7420182 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -87.07943091 126.2432493 15.1596409 - X128_Y1= -122.4347934 93.57919238 1.629758211 - X1_Y128= -73.54954822 131.4209071 -32.69570502 - X128_Y128= -108.9049107 98.75685019 -46.22558772 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -14.19561099 151.3141482 25.5443375 - X128_Y1= -62.49190516 139.3582755 20.59205753 - X1_Y128= -9.243331011 151.9164988 -24.20616096 - X128_Y128= -57.53962519 139.9606261 -29.15844093 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 62.49190516 139.3582755 20.59205753 - X128_Y1= 14.19561099 151.3141482 25.5443375 - X1_Y128= 57.53962519 139.9606261 -29.15844093 - X128_Y128= 9.243331011 151.9164988 -24.20616096 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 122.4347934 93.57919238 1.629758211 - X128_Y1= 87.07943091 126.2432493 15.1596409 - X1_Y128= 108.9049107 98.75685019 -46.22558772 - X128_Y128= 73.54954822 131.4209071 -32.69570502 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 149.5714318 26.24334692 -26.26163605 - X128_Y1= 136.6304262 70.86329487 -7.779465794 - X1_Y128= 131.0892616 39.34567133 -70.83448067 - X128_Y128= 118.1482559 83.96561928 -52.35231042 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 136.630592 -44.60670525 -55.60866102 - X128_Y1= 149.5714695 0.01327443 -37.12647762 - X1_Y128= 118.1484086 -22.35375937 -96.39119768 - X128_Y128= 131.0892861 22.26622031 -77.90901428 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 87.0797558 -99.98678118 -78.54781803 - X128_Y1= 122.4350245 -67.32263757 -65.01789944 - X1_Y128= 73.54983721 -69.80915655 -116.0478484 - X128_Y128= 108.9051059 -37.14501293 -102.5179298 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 14.19600789 -125.0578588 -88.93258864 - X128_Y1= 62.49226772 -113.1018677 -83.98025963 - X1_Y128= 9.243678868 -90.30490586 -124.5374577 - X128_Y128= 57.5399387 -78.34891477 -119.5851287 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -62.4915426 -113.1021741 -83.98038655 - X128_Y1= -14.19521408 -125.0579284 -88.93261748 - X1_Y128= -57.53931167 -78.34919689 -119.5852456 - X128_Y128= -9.242983154 -90.30495119 -124.5374765 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -122.4345624 -67.32323789 -65.0181481 - X128_Y1= -87.07910602 -99.98720815 -78.54799489 - X1_Y128= -108.9047156 -37.14554692 -102.5181509 - X128_Y128= -73.54925923 -69.80951718 -116.0479977 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -149.5713941 0.012541052 -37.1267814 - X128_Y1= -136.6302603 -44.60737518 -55.60893851 - X1_Y128= -131.089237 22.26557756 -77.90928052 - X128_Y128= -118.1481032 -22.35433867 -96.39143763 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -136.6307578 70.86262494 -7.779743286 - X128_Y1= -149.5715072 26.24261354 -26.26193982 - X1_Y128= -118.1485613 83.96503997 -52.35255037 - X128_Y128= -131.0893106 39.34502857 -70.83474691 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -69.82230216 130.9962884 -41.41036774 - X128_Y1= -105.1776647 98.33223142 -54.94025043 - X1_Y128= -44.82233533 121.4291975 -83.64154616 - X128_Y128= -80.17769784 88.76514058 -97.17142886 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 25 148.1490271 -34.3054774 - X128_Y1= -25 148.1490271 -34.3054774 - X1_Y128= 25 129.0148708 -80.49946037 - X128_Y128= -25 129.0148708 -80.49946037 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 105.1776647 98.33223142 -54.94025043 - X128_Y1= 69.82230216 130.9962884 -41.41036774 - X1_Y128= 80.17769784 88.76514058 -97.17142886 - X128_Y128= 44.82233533 121.4291975 -83.64154616 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 123.7437785 10.72785796 -91.227136 - X128_Y1= 123.7437122 56.92184093 -72.0929797 - X1_Y128= 88.38846291 24.25771526 -123.8912542 - X128_Y128= 88.38839657 70.45169823 -104.7570979 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 69.82258126 -63.34672167 -121.9098027 - X128_Y1= 105.17785 -30.68257806 -108.3798841 - X1_Y128= 44.82254809 -26.71989083 -145.0068502 - X128_Y128= 80.17781678 5.944252786 -131.4769316 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -24.99967163 -80.49969284 -129.0147893 - X128_Y1= 25.00032837 -80.49957026 -129.0147386 - X1_Y128= -24.99976545 -34.30573525 -148.1490069 - X128_Y128= 25.00023455 -34.30561267 -148.1489562 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -105.1774794 -30.68309376 -108.3800977 - X128_Y1= -69.82202306 -63.34706402 -121.9099445 - X1_Y128= -80.1775789 5.943859659 -131.4770945 - X128_Y128= -44.82212257 -26.7201106 -145.0069413 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -123.7438449 56.92123419 -72.09323102 - X128_Y1= -123.7436458 10.72725122 -91.22738732 - X1_Y128= -88.38852925 70.45126485 -104.7572774 - X128_Y128= -88.38833023 24.25728188 -123.8914337 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -39.24411633 118.2927624 -90.64613451 - X128_Y1= -74.59947885 85.62870544 -104.1760172 - X1_Y128= -6.580077344 95.43742332 -120.8238421 - X128_Y128= -41.93543986 62.77336638 -134.3537248 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= -74.59958298 13.11502377 -134.2121394 - X128_Y1= -39.24431429 -19.54911984 -147.742058 - X1_Y128= -41.93545732 50.61496715 -139.3898939 - X128_Y128= -6.580188623 17.95082353 -152.9198125 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 39.24391838 -19.54931227 -147.7421377 - X128_Y1= 74.59937471 13.114658 -134.2122909 - X1_Y128= 6.579966064 17.95079127 -152.9198259 - X128_Y128= 41.9354224 50.61476153 -139.3899791 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDSquare - X1_Y1= 74.59968712 85.62833966 -104.1761687 - X128_Y1= 39.24451225 118.29257 -90.64621421 - X1_Y128= 41.93547478 62.77316076 -134.3538099 - X128_Y128= 6.580299903 95.43739106 -120.8238554 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 diff --git a/Inputs/DetectorConfiguration/gaspardV2BarrelBack.detector b/Inputs/DetectorConfiguration/gaspardV2BarrelBack.detector deleted file mode 100644 index 53033af99793fa2658c111f0e299345c2eedc96c..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/gaspardV2BarrelBack.detector +++ /dev/null @@ -1,109 +0,0 @@ -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and distance given in mm -%%Angle given in degree -%% using the data from the experimental mesurement -%% special care is given for the X Y direction -%% NOTATTION USED IN THE FOLLOWING: -%% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 -%%Option: 0,1 for Si SiLi and CSI -%%Option: all or sensible for VISualisation -% 1.2 12.371134021 -% 2 20.618556701 -% 30 309.278350515 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -Target - THICKNESS= 0.001 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GaspardTracker -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Barrel Back -GPDTrapezoid - X1_Y1= 118.21 33.46 4.45 - X128_Y1= 127.60 10.79 -76.57 - X1_Y128= 97.86 82.61 -76.57 - X128_Y128= 107.27 59.89 4.45 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDTrapezoid - X1_Y1= 59.93 107.25 4.45 - X128_Y1= 82.60 97.86 -76.57 - X1_Y128= 10.79 127.61 -76.57 - X128_Y128= 33.50 118.20 4.45 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -GPDTrapezoid - X1_Y1= -33.46 118.21 4.45 - X128_Y1= -10.79 127.60 -76.57 - X1_Y128= -82.61 97.86 -76.57 - X128_Y128= -59.89 107.27 4.45 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -GPDTrapezoid - X1_Y1= -107.25 59.93 4.45 - X128_Y1= -97.86 82.60 -76.57 - X1_Y128= -127.61 10.79 -76.57 - X128_Y128= -118.20 33.50 4.45 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -GPDTrapezoid - X1_Y1= -118.21 -33.43 4.45 - X128_Y1= -127.60 -10.79 -76.57 - X1_Y128= -97.86 -82.61 -76.57 - X128_Y128= -107.27 -59.89 4.45 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -GPDTrapezoid - X1_Y1= -59.93 -107.25 4.45 - X128_Y1= -82.60 -97.86 -76.57 - X1_Y128= -10.79 -127.61 -76.57 - X128_Y128= -33.50 -118.20 4.45 - FIRSTSTAGE= 0 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -GPDTrapezoid - X1_Y1= 33.46 -118.21 4.45 - X128_Y1= 10.79 -127.60 -76.57 - X1_Y128= 82.61 -97.86 -76.57 - X128_Y128= 59.89 -107.27 4.45 - FIRSTSTAGE= 0 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -GPDTrapezoid - X1_Y1= 107.25 -59.93 4.45 - X128_Y1= 97.86 -82.60 -76.57 - X1_Y128= 127.61 -10.79 -76.57 - X128_Y128= 118.20 -33.50 4.45 - FIRSTSTAGE= 0 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all diff --git a/Inputs/DetectorConfiguration/gaspardV2BarrelFront.detector b/Inputs/DetectorConfiguration/gaspardV2BarrelFront.detector deleted file mode 100644 index 60e74f9ab69a19f99a700cbcb8d899aab971af6e..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/gaspardV2BarrelFront.detector +++ /dev/null @@ -1,109 +0,0 @@ -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and distance given in mm -%%Angle given in degree -%% using the data from the experimental mesurement -%% special care is given for the X Y direction -%% NOTATTION USED IN THE FOLLOWING: -%% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 -%%Option: 0,1 for Si SiLi and CSI -%%Option: all or sensible for VISualisation -% 1.2 12.371134021 -% 2 20.618556701 -% 30 309.278350515 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -Target - THICKNESS= 0.001 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GaspardTracker -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Barrel Front -GPDTrapezoid - X1_Y1= 122.02 14.32 -4.45 - X128_Y1= 122.02 38.86 76.57 - X1_Y128= 122.02 -38.88 76.57 - X128_Y128= 122.02 -14.29 -4.45 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDTrapezoid - X1_Y1= 76.15 96.41 -4.45 - X128_Y1= 58.80 113.76 76.57 - X1_Y128= 113.77 58.79 76.57 - X128_Y128= 96.38 76.18 -4.45 - FIRSTSTAGE= 0 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -GPDTrapezoid - X1_Y1= -14.32 122.02 -4.45 - X128_Y1= -38.86 122.02 76.57 - X1_Y128= 38.88 122.02 76.57 - X128_Y128= 14.29 122.02 -4.45 - FIRSTSTAGE= 0 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -GPDTrapezoid - X1_Y1= -96.41 76.15 -4.45 - X128_Y1= -113.76 58.80 76.57 - X1_Y128= -58.79 113.77 76.57 - X128_Y128= -76.18 96.38 -4.45 - FIRSTSTAGE= 0 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -GPDTrapezoid - X1_Y1= -122.02 -14.32 -4.45 - X128_Y1= -122.02 -38.86 76.57 - X1_Y128= -122.02 38.88 76.57 - X128_Y128= -122.02 14.29 -4.45 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -GPDTrapezoid - X1_Y1= -76.15 -96.41 -4.45 - X128_Y1= -58.80 -113.76 76.57 - X1_Y128= -113.77 -58.79 76.57 - X128_Y128= -96.38 -76.18 -4.45 - FIRSTSTAGE= 0 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -GPDTrapezoid - X1_Y1= 14.32 -122.02 -4.45 - X128_Y1= 38.86 -122.02 76.57 - X1_Y128= -38.88 -122.02 76.57 - X128_Y128= -14.29 -122.02 -4.45 - FIRSTSTAGE= 0 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -GPDTrapezoid - X1_Y1= 96.41 -76.15 -4.45 - X128_Y1= 113.76 -58.80 76.57 - X1_Y128= 58.79 -113.77 76.57 - X128_Y128= 76.18 -96.38 -4.45 - FIRSTSTAGE= 0 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all diff --git a/Inputs/DetectorConfiguration/gaspardV2EndCapBack.detector b/Inputs/DetectorConfiguration/gaspardV2EndCapBack.detector deleted file mode 100644 index 5922c6c5728a770d6ac4ec75a4f7033653dce845..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/gaspardV2EndCapBack.detector +++ /dev/null @@ -1,109 +0,0 @@ -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and distance given in mm -%%Angle given in degree -%% using the data from the experimental mesurement -%% special care is given for the X Y direction -%% NOTATTION USED IN THE FOLLOWING: -%% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 -%%Option: 0,1 for Si SiLi and CSI -%%Option: all or sensible for VISualisation -% 1.2 12.371134021 -% 2 20.618556701 -% 30 309.278350515 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -Target - THICKNESS= 0.001 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GaspardTracker -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 End-Cap Back -GPDTrapezoid - X1_Y1= 45.64 34.43 -146.50 - X128_Y1= 91.09 79.82 -91.36 - X1_Y128= 120.84 8.00 -91.36 - X128_Y128= 56.59 8.00 -146.50 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDTrapezoid - X1_Y1= 7.92 56.62 -146.50 - X128_Y1= 7.97 120.85 -91.36 - X1_Y128= 79.79 91.10 -91.36 - X128_Y128= 34.35 45.67 -146.50 - FIRSTSTAGE= 0 - SECONDSTAGE= 0 - THIRDSTAGE= 0 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -GPDTrapezoid - X1_Y1= -34.43 45.64 -146.50 - X128_Y1= -79.82 91.09 -91.36 - X1_Y128= -8.00 120.84 -91.36 - X128_Y128= -8.00 56.59 -146.50 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -GPDTrapezoid - X1_Y1= -56.62 7.92 -146.50 - X128_Y1= -120.85 7.97 -91.36 - X1_Y128= -91.09 79.79 -91.36 - X128_Y128= -45.67 34.35 -146.50 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -GPDTrapezoid - X1_Y1= -45.64 -34.43 -146.50 - X128_Y1= -91.09 -79.82 -91.36 - X1_Y128= -120.84 -8.00 -91.36 - X128_Y128= -56.59 -8.00 -146.50 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -GPDTrapezoid - X1_Y1= -7.92 -56.62 -146.50 - X128_Y1= -7.97 -120.85 -91.36 - X1_Y128= -79.79 -91.10 -91.36 - X128_Y128= -34.35 -45.67 -146.50 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -GPDTrapezoid - X1_Y1= 34.43 -45.64 -146.50 - X128_Y1= 79.82 -91.09 -91.36 - X1_Y128= 8.00 -120.84 -91.36 - X128_Y128= 8.00 -56.59 -146.50 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -GPDTrapezoid - X1_Y1= 56.62 -7.92 -146.50 - X128_Y1= 120.85 -7.97 -91.36 - X1_Y128= 91.09 -79.79 -91.36 - X128_Y128= 45.67 -34.35 -146.50 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all diff --git a/Inputs/DetectorConfiguration/gaspardV2EndCapFront.detector b/Inputs/DetectorConfiguration/gaspardV2EndCapFront.detector deleted file mode 100644 index b0e4fedbe8c7ce1a671c1e02e0abc5d56af0b57b..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/gaspardV2EndCapFront.detector +++ /dev/null @@ -1,109 +0,0 @@ -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and distance given in mm -%%Angle given in degree -%% using the data from the experimental mesurement -%% special care is given for the X Y direction -%% NOTATTION USED IN THE FOLLOWING: -%% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 -%%Option: 0,1 for Si SiLi and CSI -%%Option: all or sensible for VISualisation -% 1.2 12.371134021 -% 2 20.618556701 -% 30 309.278350515 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -Target - THICKNESS= 0.001 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GaspardTracker -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Barrel -GPDTrapezoid - X1_Y1= 55.34 -14.35 146.50 - X128_Y1= 114.70 -38.88 91.36 - X1_Y128= 114.70 38.85 91.36 - X128_Y128= 55.34 14.26 146.50 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -GPDTrapezoid - X1_Y1= 49.27 28.99 146.50 - X128_Y1= 108.60 53.61 91.36 - X1_Y128= 53.63 108.58 91.36 - X128_Y128= 29.04 49.21 146.50 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -GPDTrapezoid - X1_Y1= 14.35 55.34 146.50 - X128_Y1= 38.88 114.70 91.36 - X1_Y128= -38.85 114.70 91.36 - X128_Y128= -14.26 55.34 146.50 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -GPDTrapezoid - X1_Y1= -28.99 49.27 146.50 - X128_Y1= -53.61 108.60 91.36 - X1_Y128= -108.58 53.63 91.36 - X128_Y128= -49.21 29.04 146.50 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -GPDTrapezoid - X1_Y1= -55.34 14.35 146.50 - X128_Y1= -114.70 38.88 91.36 - X1_Y128= -114.70 -38.85 91.36 - X128_Y128= -55.34 -14.26 146.50 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -GPDTrapezoid - X1_Y1= -49.27 -28.99 146.50 - X128_Y1= -108.60 -53.61 91.36 - X1_Y128= -53.63 -108.58 91.36 - X128_Y128= -29.04 -49.21 146.50 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -GPDTrapezoid - X1_Y1= -14.35 -55.34 146.50 - X128_Y1= -38.88 -114.70 91.36 - X1_Y128= 38.85 -114.70 91.36 - X128_Y128= 14.26 -55.34 146.50 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -GPDTrapezoid - X1_Y1= 28.99 -49.27 146.50 - X128_Y1= 53.61 -108.60 91.36 - X1_Y128= 108.58 -53.63 91.36 - X128_Y128= 49.21 -29.04 146.50 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all diff --git a/Inputs/DetectorConfiguration/helios.detector b/Inputs/DetectorConfiguration/helios.detector deleted file mode 100644 index 1337a37074d3b56fd20dbf63492297f4e3807301..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/helios.detector +++ /dev/null @@ -1,426 +0,0 @@ -%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%%%% -%% -%% Thickness in micrometer -%% Radius in mm -%% Position in mm -%% Magnetic field in tesla -%% -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%% -%% Position and distance given in mm -%% Angle given in degree -%% using the data from the experimental mesurement -%% special care is given for the X Y direction -%% NOTATTION USED IN THE FOLLOWING: -%% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 -%%Option: 0,1 for Si SiLi and CSI -%%Option: all or sensible for VISualisation -% 1.2 12.371134021 -% 2 20.618556701 -% 30 309.278350515 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -Target - THICKNESS= 1. -% THICKNESS= 0.28 - RADIUS= 7.5 - MATERIAL= CD2 -% MATERIAL= Ti-t - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Helios - MField= 2. -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -HeliosDummyShape - X1_Y1= 11.5 11.5 150. - X128_Y1= 11.5 -11.5 150. - X1_Y128= 11.5 11.5 206. - X128_Y128= 11.5 -11.5 206. - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -HeliosDummyShape - X1_Y1= -11.5 11.5 150. - X128_Y1= 11.5 11.5 150. - X1_Y128= -11.5 11.5 206. - X128_Y128= 11.5 11.5 206. - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 -HeliosDummyShape - X1_Y1= -11.5 -11.5 150. - X128_Y1= -11.5 11.5 150. - X1_Y128= -11.5 -11.5 206. - X128_Y128= -11.5 11.5 206. - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 -HeliosDummyShape - X1_Y1= 11.5 -11.5 150. - X128_Y1= -11.5 -11.5 150. - X1_Y128= 11.5 -11.5 206. - X128_Y128= -11.5 -11.5 206. - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 -HeliosDummyShape - X1_Y1= 11.5 11.5 208.4 - X128_Y1= 11.5 -11.5 208.4 - X1_Y128= 11.5 11.5 264.4 - X128_Y128= 11.5 -11.5 264.4 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 -HeliosDummyShape - X1_Y1= -11.5 11.5 208.4 - X128_Y1= 11.5 11.5 208.4 - X1_Y128= -11.5 11.5 264.4 - X128_Y128= 11.5 11.5 264.4 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 -HeliosDummyShape - X1_Y1= -11.5 -11.5 208.4 - X128_Y1= -11.5 11.5 208.4 - X1_Y128= -11.5 -11.5 264.4 - X128_Y128= -11.5 11.5 264.4 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 -HeliosDummyShape - X1_Y1= 11.5 -11.5 208.4 - X128_Y1= -11.5 -11.5 208.4 - X1_Y128= 11.5 -11.5 264.4 - X128_Y128= -11.5 -11.5 264.4 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 -HeliosDummyShape - X1_Y1= 11.5 11.5 266.8 - X128_Y1= 11.5 -11.5 266.8 - X1_Y128= 11.5 11.5 322.8 - X128_Y128= 11.5 -11.5 322.8 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 -HeliosDummyShape - X1_Y1= -11.5 11.5 266.8 - X128_Y1= 11.5 11.5 266.8 - X1_Y128= -11.5 11.5 322.8 - X128_Y128= 11.5 11.5 322.8 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 -HeliosDummyShape - X1_Y1= -11.5 -11.5 266.8 - X128_Y1= -11.5 11.5 266.8 - X1_Y128= -11.5 -11.5 322.8 - X128_Y128= -11.5 11.5 322.8 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 -HeliosDummyShape - X1_Y1= 11.5 -11.5 266.8 - X128_Y1= -11.5 -11.5 266.8 - X1_Y128= 11.5 -11.5 322.8 - X128_Y128= -11.5 -11.5 322.8 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 -HeliosDummyShape - X1_Y1= 11.5 11.5 325.2 - X128_Y1= 11.5 -11.5 325.2 - X1_Y128= 11.5 11.5 381.2 - X128_Y128= 11.5 -11.5 381.2 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 -HeliosDummyShape - X1_Y1= -11.5 11.5 325.2 - X128_Y1= 11.5 11.5 325.2 - X1_Y128= -11.5 11.5 381.2 - X128_Y128= 11.5 11.5 381.2 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 -HeliosDummyShape - X1_Y1= -11.5 -11.5 325.2 - X128_Y1= -11.5 11.5 325.2 - X1_Y128= -11.5 -11.5 381.2 - X128_Y128= -11.5 11.5 381.2 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 -HeliosDummyShape - X1_Y1= 11.5 -11.5 325.2 - X128_Y1= -11.5 -11.5 325.2 - X1_Y128= 11.5 -11.5 381.2 - X128_Y128= -11.5 -11.5 381.2 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 -HeliosDummyShape - X1_Y1= 11.5 11.5 383.6 - X128_Y1= 11.5 -11.5 383.6 - X1_Y128= 11.5 11.5 439.6 - X128_Y128= 11.5 -11.5 439.6 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18 -HeliosDummyShape - X1_Y1= -11.5 11.5 383.6 - X128_Y1= 11.5 11.5 383.6 - X1_Y128= -11.5 11.5 439.6 - X128_Y128= 11.5 11.5 439.6 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%19 -HeliosDummyShape - X1_Y1= -11.5 -11.5 383.6 - X128_Y1= -11.5 11.5 383.6 - X1_Y128= -11.5 -11.5 439.6 - X128_Y128= -11.5 11.5 439.6 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%20 -HeliosDummyShape - X1_Y1= 11.5 -11.5 383.6 - X128_Y1= -11.5 -11.5 383.6 - X1_Y128= 11.5 -11.5 439.6 - X128_Y128= -11.5 -11.5 439.6 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%21 -HeliosDummyShape - X1_Y1= 11.5 11.5 442. - X128_Y1= 11.5 -11.5 442. - X1_Y128= 11.5 11.5 498. - X128_Y128= 11.5 -11.5 498. - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22 -HeliosDummyShape - X1_Y1= -11.5 11.5 442. - X128_Y1= 11.5 11.5 442. - X1_Y128= -11.5 11.5 498. - X128_Y128= 11.5 11.5 498. - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%23 -HeliosDummyShape - X1_Y1= -11.5 -11.5 442. - X128_Y1= -11.5 11.5 442. - X1_Y128= -11.5 -11.5 498. - X128_Y128= -11.5 11.5 498. - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24 -HeliosDummyShape - X1_Y1= 11.5 -11.5 442. - X128_Y1= -11.5 -11.5 442. - X1_Y128= 11.5 -11.5 498 - X128_Y128= -11.5 -11.5 498. - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%25 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% AT backward angles: -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%25 -HeliosDummyShape - X1_Y1= 11.5 11.5 -150. - X128_Y1= 11.5 -11.5 -150. - X1_Y128= 11.5 11.5 -206. - X128_Y128= 11.5 -11.5 -206. - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%26 -HeliosDummyShape - X1_Y1= -11.5 11.5 -150. - X128_Y1= 11.5 11.5 -150. - X1_Y128= -11.5 11.5 -206. - X128_Y128= 11.5 11.5 -206. - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%27 -HeliosDummyShape - X1_Y1= -11.5 -11.5 -150. - X128_Y1= -11.5 11.5 -150. - X1_Y128= -11.5 -11.5 -206. - X128_Y128= -11.5 11.5 -206. - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%28 -HeliosDummyShape - X1_Y1= 11.5 -11.5 -150. - X128_Y1= -11.5 -11.5 -150. - X1_Y128= 11.5 -11.5 -206. - X128_Y128= -11.5 -11.5 -206. - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%29 -HeliosDummyShape - X1_Y1= 11.5 11.5 -208.4 - X128_Y1= 11.5 -11.5 -208.4 - X1_Y128= 11.5 11.5 -264.4 - X128_Y128= 11.5 -11.5 -264.4 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%30 -HeliosDummyShape - X1_Y1= -11.5 11.5 -208.4 - X128_Y1= 11.5 11.5 -208.4 - X1_Y128= -11.5 11.5 -264.4 - X128_Y128= 11.5 11.5 -264.4 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%31 -HeliosDummyShape - X1_Y1= -11.5 -11.5 -208.4 - X128_Y1= -11.5 11.5 -208.4 - X1_Y128= -11.5 -11.5 -264.4 - X128_Y128= -11.5 11.5 -264.4 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%32 -HeliosDummyShape - X1_Y1= 11.5 -11.5 -208.4 - X128_Y1= -11.5 -11.5 -208.4 - X1_Y128= 11.5 -11.5 -264.4 - X128_Y128= -11.5 -11.5 -264.4 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%33 -HeliosDummyShape - X1_Y1= 11.5 11.5 -266.8 - X128_Y1= 11.5 -11.5 -266.8 - X1_Y128= 11.5 11.5 -322.8 - X128_Y128= 11.5 -11.5 -322.8 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%34 -HeliosDummyShape - X1_Y1= -11.5 11.5 -266.8 - X128_Y1= 11.5 11.5 -266.8 - X1_Y128= -11.5 11.5 -322.8 - X128_Y128= 11.5 11.5 -322.8 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%35 -HeliosDummyShape - X1_Y1= -11.5 -11.5 -266.8 - X128_Y1= -11.5 11.5 -266.8 - X1_Y128= -11.5 -11.5 -322.8 - X128_Y128= -11.5 11.5 -322.8 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%36 -HeliosDummyShape - X1_Y1= 11.5 -11.5 -266.8 - X128_Y1= -11.5 -11.5 -266.8 - X1_Y128= 11.5 -11.5 -322.8 - X128_Y128= -11.5 -11.5 -322.8 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%37 -HeliosDummyShape - X1_Y1= 11.5 11.5 -325.2 - X128_Y1= 11.5 -11.5 -325.2 - X1_Y128= 11.5 11.5 -381.2 - X128_Y128= 11.5 -11.5 -381.2 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%38 -HeliosDummyShape - X1_Y1= -11.5 11.5 -325.2 - X128_Y1= 11.5 11.5 -325.2 - X1_Y128= -11.5 11.5 -381.2 - X128_Y128= 11.5 11.5 -381.2 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%39 -HeliosDummyShape - X1_Y1= -11.5 -11.5 -325.2 - X128_Y1= -11.5 11.5 -325.2 - X1_Y128= -11.5 -11.5 -381.2 - X128_Y128= -11.5 11.5 -381.2 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40 -HeliosDummyShape - X1_Y1= 11.5 -11.5 -325.2 - X128_Y1= -11.5 -11.5 -325.2 - X1_Y128= 11.5 -11.5 -381.2 - X128_Y128= -11.5 -11.5 -381.2 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%41 -HeliosDummyShape - X1_Y1= 11.5 11.5 -383.6 - X128_Y1= 11.5 -11.5 -383.6 - X1_Y128= 11.5 11.5 -439.6 - X128_Y128= 11.5 -11.5 -439.6 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%42 -HeliosDummyShape - X1_Y1= -11.5 11.5 -383.6 - X128_Y1= 11.5 11.5 -383.6 - X1_Y128= -11.5 11.5 -439.6 - X128_Y128= 11.5 11.5 -439.6 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%43 -HeliosDummyShape - X1_Y1= -11.5 -11.5 -383.6 - X128_Y1= -11.5 11.5 -383.6 - X1_Y128= -11.5 -11.5 -439.6 - X128_Y128= -11.5 11.5 -439.6 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%44 -HeliosDummyShape - X1_Y1= 11.5 -11.5 -383.6 - X128_Y1= -11.5 -11.5 -383.6 - X1_Y128= 11.5 -11.5 -439.6 - X128_Y128= -11.5 -11.5 -439.6 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%45 -HeliosDummyShape - X1_Y1= 11.5 11.5 -442. - X128_Y1= 11.5 -11.5 -442. - X1_Y128= 11.5 11.5 -498. - X128_Y128= 11.5 -11.5 -498. - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%46 -HeliosDummyShape - X1_Y1= -11.5 11.5 -442. - X128_Y1= 11.5 11.5 -442. - X1_Y128= -11.5 11.5 -498. - X128_Y128= 11.5 11.5 -498. - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%47 -HeliosDummyShape - X1_Y1= -11.5 -11.5 -442. - X128_Y1= -11.5 11.5 -442. - X1_Y128= -11.5 -11.5 -498. - X128_Y128= -11.5 11.5 -498. - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%48 -HeliosDummyShape - X1_Y1= 11.5 -11.5 -442. - X128_Y1= -11.5 -11.5 -442. - X1_Y128= 11.5 -11.5 -498 - X128_Y128= -11.5 -11.5 -498. - FIRSTSTAGE= 1 - VIS= all diff --git a/Inputs/DetectorConfiguration/helios100.detector b/Inputs/DetectorConfiguration/helios100.detector deleted file mode 100644 index 25e1a13218e47f54d0a4fb93d0b04b956beff681..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/helios100.detector +++ /dev/null @@ -1,1048457 +0,0 @@ -%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%%%% -%% -%% Thickness in micrometer -%% Radius in mm -%% Position in mm -%% Magnetic field in tesla -%% -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%% -%% Position and distance given in mm -%% Angle given in degree -%% using the data from the experimental mesurement -%% special care is given for the X Y direction -%% NOTATTION USED IN THE FOLLOWING: -%% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 -%%Option: 0,1 for Si SiLi and CSI -%%Option: all or sensible for VISualisation -% 1.2 12.371134021 -% 2 20.618556701 -% 30 309.278350515 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -Target - THICKNESS= 0.945 -% THICKNESS= 0.189 (<=> 20ug/cm2) -% THICKNESS= 0.28 - ANGLE= 0. - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%% -QQQArray -%%%%%%%%% Det 1 %%%%%%%% 1st quadran -QQQ - THETA= 0 - PHI= 0 - R= 900 - BETA= 0 0 -0 - SIDE= right -%%%%%%%%% Det 2 %%%%%%%% 2nd quadran -QQQ - THETA= 0 - PHI= 90 - R= 900 - BETA= 0 0 -0 - SIDE= right -%%%%%%%%% Det 1 %%%%%%%% -QQQ - THETA= 0 - PHI= 180 - R= 900 - BETA= 0 0 -0 - SIDE= right -%%%%%%%%% Det 1 %%%%%%%% -QQQ - THETA= 0 - PHI= 270 - R= 900 - BETA= 0 0 -0 - SIDE= right -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Helios - MField= 2 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% AT backward -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%25 -HeliosDummyShape - X1_Y1= 11.5 11.5 -100 - X128_Y1= 11.5 -11.5 -100 - X1_Y128= 11.5 11.5 -156 - X128_Y128= 11.5 -11.5 -156 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%26 -HeliosDummyShape - X1_Y1= -11.5 11.5 -100 - X128_Y1= 11.5 11.5 -100 - X1_Y128= -11.5 11.5 -156 - X128_Y128= 11.5 11.5 -156 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%27 -HeliosDummyShape - X1_Y1= -11.5 -11.5 -100 - X128_Y1= -11.5 11.5 -100 - X1_Y128= -11.5 -11.5 -156 - X128_Y128= -11.5 11.5 -156 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%28 -HeliosDummyShape - X1_Y1= 11.5 -11.5 -100 - X128_Y1= -11.5 -11.5 -100 - X1_Y128= 11.5 -11.5 -156 - X128_Y128= -11.5 -11.5 -156 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%29 -HeliosDummyShape - X1_Y1= 11.5 11.5 -158.4 - X128_Y1= 11.5 -11.5 -158.4 - X1_Y128= 11.5 11.5 -214.4 - X128_Y128= 11.5 -11.5 -214.4 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%30 -HeliosDummyShape - X1_Y1= -11.5 11.5 -158.4 - X128_Y1= 11.5 11.5 -158.4 - X1_Y128= -11.5 11.5 -214.4 - X128_Y128= 11.5 11.5 -214.4 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%31 -HeliosDummyShape - X1_Y1= -11.5 -11.5 -158.4 - X128_Y1= -11.5 11.5 -158.4 - X1_Y128= -11.5 -11.5 -214.4 - X128_Y128= -11.5 11.5 -214.4 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%32 -HeliosDummyShape - X1_Y1= 11.5 -11.5 -158.4 - X128_Y1= -11.5 -11.5 -158.4 - X1_Y128= 11.5 -11.5 -214.4 - X128_Y128= -11.5 -11.5 -214.4 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%33 -HeliosDummyShape - X1_Y1= 11.5 11.5 -216.8 - X128_Y1= 11.5 -11.5 -216.8 - X1_Y128= 11.5 11.5 -272.8 - X128_Y128= 11.5 -11.5 -272.8 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%34 -HeliosDummyShape - X1_Y1= -11.5 11.5 -216.8 - X128_Y1= 11.5 11.5 -216.8 - X1_Y128= -11.5 11.5 -272.8 - X128_Y128= 11.5 11.5 -272.8 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%35 -HeliosDummyShape - X1_Y1= -11.5 -11.5 -216.8 - X128_Y1= -11.5 11.5 -216.8 - X1_Y128= -11.5 -11.5 -272.8 - X128_Y128= -11.5 11.5 -272.8 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%36 -HeliosDummyShape - X1_Y1= 11.5 -11.5 -216.8 - X128_Y1= -11.5 -11.5 -216.8 - X1_Y128= 11.5 -11.5 -272.8 - X128_Y128= -11.5 -11.5 -272.8 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%37 -HeliosDummyShape - X1_Y1= 11.5 11.5 -275.2 - X128_Y1= 11.5 -11.5 -275.2 - X1_Y128= 11.5 11.5 -331.2 - X128_Y128= 11.5 -11.5 -331.2 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%38 -HeliosDummyShape - X1_Y1= -11.5 11.5 -275.2 - X128_Y1= 11.5 11.5 -275.2 - X1_Y128= -11.5 11.5 -331.2 - X128_Y128= 11.5 11.5 -331.2 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%39 -HeliosDummyShape - X1_Y1= -11.5 -11.5 -275.2 - X128_Y1= -11.5 11.5 -275.2 - X1_Y128= -11.5 -11.5 -331.2 - X128_Y128= -11.5 11.5 -331.2 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40 -HeliosDummyShape - X1_Y1= 11.5 -11.5 -275.2 - X128_Y1= -11.5 -11.5 -275.2 - X1_Y128= 11.5 -11.5 -331.2 - X128_Y128= -11.5 -11.5 -331.2 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%41 -HeliosDummyShape - X1_Y1= 11.5 11.5 -333.6 - X128_Y1= 11.5 -11.5 -333.6 - X1_Y128= 11.5 11.5 -389.6 - X128_Y128= 11.5 -11.5 -389.6 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%42 -HeliosDummyShape - X1_Y1= -11.5 11.5 -333.6 - X128_Y1= 11.5 11.5 -333.6 - X1_Y128= -11.5 11.5 -389.6 - X128_Y128= 11.5 11.5 -389.6 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%43 -HeliosDummyShape - X1_Y1= -11.5 -11.5 -333.6 - X128_Y1= -11.5 11.5 -333.6 - X1_Y128= -11.5 -11.5 -389.6 - X128_Y128= -11.5 11.5 -389.6 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%44 -HeliosDummyShape - X1_Y1= 11.5 -11.5 -333.6 - X128_Y1= -11.5 -11.5 -333.6 - X1_Y128= 11.5 -11.5 -389.6 - X128_Y128= -11.5 -11.5 -389.6 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%45 -HeliosDummyShape - X1_Y1= 11.5 11.5 -392 - X128_Y1= 11.5 -11.5 -392 - X1_Y128= 11.5 11.5 -448 - X128_Y128= 11.5 -11.5 -448 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%46 -HeliosDummyShape - X1_Y1= -11.5 11.5 -392 - X128_Y1= 11.5 11.5 -392 - X1_Y128= -11.5 11.5 -448 - X128_Y128= 11.5 11.5 -448 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%47 -HeliosDummyShape - X1_Y1= -11.5 -11.5 -392 - X128_Y1= -11.5 11.5 -392 - X1_Y128= -11.5 -11.5 -448 - X128_Y128= -11.5 11.5 -448 - FIRSTSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%48 -HeliosDummyShape - X1_Y1= 11.5 -11.5 -392 - X128_Y1= -11.5 -11.5 -392 - X1_Y128= 11.5 -11.5 -448 - X128_Y128= -11.5 -11.5 -448 - FIRSTSTAGE= 1 - VIS= all - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Inputs/DetectorConfiguration/hira.detector b/Inputs/DetectorConfiguration/hira.detector index 8a7966c7498769712ef6bbba70039875efdea3ba..6d6fde406f53dd78df8ecbe1e46326dd3f1ba3f0 100755 --- a/Inputs/DetectorConfiguration/hira.detector +++ b/Inputs/DetectorConfiguration/hira.detector @@ -6,168 +6,166 @@ GeneralTarget % Radius in mm % Temperature in K, Pressure in bar Target - THICKNESS= 12.5 - ANGLE= 0 - RADIUS= 10 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 - -%%%%%%%%%%%%%%%%%%%%% -HIRAArray + THICKNESS= 12.5 + ANGLE= 0 + RADIUS= 10 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 + +%%%%%%%%%%%%%%%%%%%%% +HIRAArray %%%%%%%%%%%%%%%%%%%%% - -%%%%%%% Telescope 1 %%%%%%% -HiraTelescope -A= 173.37 146.75 262.67 -B= 131.14 113.17 299.62 -C= 151.53 79.58 301.68 -D= 193.66 113.27 265.03 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 - -%%%%%%% Telescope 2 %%%%%%% -HiraTelescope -A= 185.54 74.46 284.21 -B= 139.49 39.19 313.95 -C= 155.91 3.85 309.52 -D= 202.07 39.18 280.08 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 - - -%%%%%%% Telescope 3 %%%%%%% -HiraTelescope -A= 189.04 -1.58 291.62 -B= 139.10 -36.55 314.66 -C= 151.29 -71.91 302.98 -D= 201.44 -36.97 280.35 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 - - -%%%%%%% Telescope 4 %%%%%%% -HiraTelescope -A= 183.90 -77.07 283.93 -B= 130.43 -110.63 300.17 -C= 139.05 -144.12 281.73 -D= 192.75 -110.68 265.85 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 - - -%%%%%%% Telescope 5 %%%%%%% -HiraTelescope -A= 89.03 146.90 300.27 -B= 37.97 113.38 323.02 -C= 56.43 79.76 330.94 -D= 107.59 113.39 308.52 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 - - -%%%%%%% Telescope 6 %%%%%%% -HiraTelescope -A= 94.01 74.21 324.51 -B= 41.45 38.75 339.56 -C= 58.48 34.39 339.75 -D= 111.12 38.96 325.13 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 - - -%%%%%%% Telescope 7 %%%%%%% -HiraTelescope -A= 95.57 -1.96 332.31 -B= 41.29 -37.33 339.64 -C= 56.63 -72.62 332.23 -D= 110.97 -37.25 325.09 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 - - -%%%%%%% Telescope 8 %%%%%%% -HiraTelescope -A= 93.18 -77.88 323.56 -B= 37.45 -111.64 323.69 -C= 51.20 -145.11 308.69 -D= 107.05 -111.48 308.92 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 - - -%%%%%%% Telescope 9 %%%%%%% -HiraTelescope -A= -22.26 91.79 332.36 -B= -77.07 56.46 330.57 -C= -61.34 21.44 338.41 -D= -6.58 56.83 340.66 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 - - -%%%%%%% Telescope 10 %%%%%%% -HiraTelescope -A= -23.10 -19.16 344.31 -B= -76.45 -54.13 330.49 -C= -59.35 -89.22 327.12 -D= -5.97 -54.26 341.22 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 - - -%%%%%%% Telescope 11 %%%%%%% -HiraTelescope -A= -96.45 147.32 297.42 -B= -151.2 113.36 286.61 -C= -140.2 79.81 303.70 -D= -85.74 113.90 314.86 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 - - -%%%%%%% Telescope 12 %%%%%%% -HiraTelescope -A= -105.62 74.17 320.23 -B= -157.09 38.47 302.22 -C= -143.26 3.23 312.38 -D= -91.94 38.96 330.70 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 - -%%%%%%% Telescope 13 %%%%%%% -HiraTelescope -A= -108.60 -1.94 327.52 -B= -156.99 -37.61 302.29 -C= -140.04 -72.81 305.17 -D= -91.79 -37.71 330.80 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 - - -%%%%%%% Telescope 14 %%%%%%% -HiraTelescope -A= -104.76 -78.01 319.19 -B= -150.28 -111.80 287.13 -C= -130.29 -145.22 282.83 -D= -84.95 -111.59 315.32 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 - - + +%%%%%%% Telescope 1 %%%%%%% +HiraTelescope + A= 173.37 146.75 262.67 + B= 131.14 113.17 299.62 + C= 151.53 79.58 301.68 + D= 193.66 113.27 265.03 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 + +%%%%%%% Telescope 2 %%%%%%% +HiraTelescope + A= 185.54 74.46 284.21 + B= 139.49 39.19 313.95 + C= 155.91 3.85 309.52 + D= 202.07 39.18 280.08 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 + + +%%%%%%% Telescope 3 %%%%%%% +HiraTelescope + A= 189.04 -1.58 291.62 + B= 139.10 -36.55 314.66 + C= 151.29 -71.91 302.98 + D= 201.44 -36.97 280.35 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 + + +%%%%%%% Telescope 4 %%%%%%% +HiraTelescope + A= 183.90 -77.07 283.93 + B= 130.43 -110.63 300.17 + C= 139.05 -144.12 281.73 + D= 192.75 -110.68 265.85 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 + + +%%%%%%% Telescope 5 %%%%%%% +HiraTelescope + A= 89.03 146.90 300.27 + B= 37.97 113.38 323.02 + C= 56.43 79.76 330.94 + D= 107.59 113.39 308.52 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 + + +%%%%%%% Telescope 6 %%%%%%% +HiraTelescope + A= 94.01 74.21 324.51 + B= 41.45 38.75 339.56 + C= 58.48 34.39 339.75 + D= 111.12 38.96 325.13 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 + + +%%%%%%% Telescope 7 %%%%%%% +HiraTelescope + A= 95.57 -1.96 332.31 + B= 41.29 -37.33 339.64 + C= 56.63 -72.62 332.23 + D= 110.97 -37.25 325.09 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 + + +%%%%%%% Telescope 8 %%%%%%% +HiraTelescope + A= 93.18 -77.88 323.56 + B= 37.45 -111.64 323.69 + C= 51.20 -145.11 308.69 + D= 107.05 -111.48 308.92 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 + + +%%%%%%% Telescope 9 %%%%%%% +HiraTelescope + A= -22.26 91.79 332.36 + B= -77.07 56.46 330.57 + C= -61.34 21.44 338.41 + D= -6.58 56.83 340.66 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 + + +%%%%%%% Telescope 10 %%%%%%% +HiraTelescope + A= -23.10 -19.16 344.31 + B= -76.45 -54.13 330.49 + C= -59.35 -89.22 327.12 + D= -5.97 -54.26 341.22 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 + + +%%%%%%% Telescope 11 %%%%%%% +HiraTelescope + A= -96.45 147.32 297.42 + B= -151.2 113.36 286.61 + C= -140.2 79.81 303.70 + D= -85.74 113.90 314.86 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 + + +%%%%%%% Telescope 12 %%%%%%% +HiraTelescope + A= -105.62 74.17 320.23 + B= -157.09 38.47 302.22 + C= -143.26 3.23 312.38 + D= -91.94 38.96 330.70 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 + +%%%%%%% Telescope 13 %%%%%%% +HiraTelescope + A= -108.60 -1.94 327.52 + B= -156.99 -37.61 302.29 + C= -140.04 -72.81 305.17 + D= -91.79 -37.71 330.80 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 + + +%%%%%%% Telescope 14 %%%%%%% +HiraTelescope + A= -104.76 -78.01 319.19 + B= -150.28 -111.80 287.13 + C= -130.29 -145.22 282.83 + D= -84.95 -111.59 315.32 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 diff --git a/Inputs/DetectorConfiguration/hira_dp.detector b/Inputs/DetectorConfiguration/hira_dp.detector index 5d382cfc28c1d38044586b76af1ad442e052963c..fda48313cbdf1d062372d6cdc1f4e55bece4276f 100644 --- a/Inputs/DetectorConfiguration/hira_dp.detector +++ b/Inputs/DetectorConfiguration/hira_dp.detector @@ -1,6 +1,4 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target THICKNESS= 5.0 ANGLE= 0 @@ -9,167 +7,163 @@ Target X= 0 Y= 0 Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -HIRAArray -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - %%%%%%% Telescope0 %%%%%%% HiraTelescope -A= 131.804 -31.8321 -319.993 -B= 177.872 -66.2026 -289.265 -C= 160.036 -101.086 -289.873 -D= 114.185 -66.786 -321.003 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= 131.804 -31.8321 -319.993 + B= 177.872 -66.2026 -289.265 + C= 160.036 -101.086 -289.873 + D= 114.185 -66.786 -321.003 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope1 %%%%%%% HiraTelescope -A= 123.344 -120.225 -301.85 -B= 165.773 -151.255 -263.318 -C= 144.222 -183.142 -255.959 -D= 101.995 -152.297 -294.862 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= 123.344 -120.225 -301.85 + B= 165.773 -151.255 -263.318 + C= 144.222 -183.142 -255.959 + D= 101.995 -152.297 -294.862 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope2 %%%%%%% HiraTelescope -A= 127.594 88.329 -310.964 -B= 178.843 53.1653 -291.348 -C= 166.228 17.9956 -303.151 -D= 115.194 53.2494 -323.166 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= 127.594 88.329 -310.964 + B= 178.843 53.1653 -291.348 + C= 166.228 17.9956 -303.151 + D= 115.194 53.2494 -323.166 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope3 %%%%%%% HiraTelescope -A= 113.097 172.218 -279.876 -B= 168.137 139.257 -268.389 -C= 159.292 106.675 -288.276 -D= 104.45 139.84 -300.127 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= 113.097 172.218 -279.876 + B= 168.137 139.257 -268.389 + C= 159.292 106.675 -288.276 + D= 104.45 139.84 -300.127 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope3 %%%%%%% HiraTelescope -A= 44.4926 -31.8321 -343.203 -B= 96.9435 -66.2026 -325.445 -C= 79.5587 -101.086 -321.416 -D= 27.2124 -66.786 -339.618 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= 44.4926 -31.8321 -343.203 + B= 96.9435 -66.2026 -325.445 + C= 79.5587 -101.086 -321.416 + D= 27.2124 -66.786 -339.618 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope4 %%%%%%% HiraTelescope -A= 41.0164 -120.225 -323.488 -B= 91.9722 -151.255 -297.251 -C= 73.0609 -183.142 -284.565 -D= 22.2039 -152.297 -311.213 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= 41.0164 -120.225 -323.488 + B= 91.9722 -151.255 -297.251 + C= 73.0609 -183.142 -284.565 + D= 22.2039 -152.297 -311.213 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope5 %%%%%%% HiraTelescope -A= 42.7628 88.329 -333.392 -B= 97.3427 53.1653 -327.709 -C= 82.1028 17.9956 -335.845 -D= 27.6269 53.2494 -341.968 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= 42.7628 88.329 -333.392 + B= 97.3427 53.1653 -327.709 + C= 82.1028 17.9956 -335.845 + D= 27.6269 53.2494 -341.968 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope6 %%%%%%% HiraTelescope -A= 36.8063 172.218 -299.611 -B= 92.9437 139.257 -302.761 -C= 79.2527 106.675 -319.681 -D= 23.2127 139.84 -316.934 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= 36.8063 172.218 -299.611 + B= 92.9437 139.257 -302.761 + C= 79.2527 106.675 -319.681 + D= 23.2127 139.84 -316.934 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope8 %%%%%%% HiraTelescope -A= -133.07 -31.8321 -319.468 -B= -78.767 -66.2026 -330.315 -C= -91.8082 -101.086 -318.134 -D= -146.242 -66.786 -307.724 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -133.07 -31.8321 -319.468 + B= -78.767 -66.2026 -330.315 + C= -91.8082 -101.086 -318.134 + D= -146.242 -66.786 -307.724 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope9 %%%%%%% HiraTelescope -A= -126.223 -120.225 -300.657 -B= -68.9753 -151.255 -303.413 -C= -79.01 -183.142 -282.971 -D= -136.377 -152.297 -280.62 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -126.223 -120.225 -300.657 + B= -68.9753 -151.255 -303.413 + C= -79.01 -183.142 -282.971 + D= -136.377 -152.297 -280.62 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope10 %%%%%%% HiraTelescope -A= -129.662 88.329 -310.107 -B= -79.5532 53.1653 -332.476 -C= -96.8192 17.9956 -331.901 -D= -147.059 53.2494 -309.967 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -129.662 88.329 -310.107 + B= -79.5532 53.1653 -332.476 + C= -96.8192 17.9956 -331.901 + D= -147.059 53.2494 -309.967 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope11 %%%%%%% HiraTelescope -A= -117.93 172.218 -277.874 -B= -70.8889 139.257 -308.671 -C= -91.2055 106.675 -316.478 -D= -138.364 139.84 -286.079 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -117.93 172.218 -277.874 + B= -70.8889 139.257 -308.671 + C= -91.2055 106.675 -316.478 + D= -138.364 139.84 -286.079 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope8 %%%%%%% HiraTelescope -A= -45.8508 -31.8321 -343.024 -B= 9.40888 -66.2026 -339.447 -C= -6.34081 -101.086 -331.055 -D= -61.6144 -66.786 -335.089 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -45.8508 -31.8321 -343.024 + B= 9.40888 -66.2026 -339.447 + C= -6.34081 -101.086 -331.055 + D= -61.6144 -66.786 -335.089 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope9 %%%%%%% HiraTelescope -A= -44.106 -120.225 -323.081 -B= 11.9041 -151.255 -310.927 -C= -3.07949 -183.142 -293.778 -D= -59.1005 -152.297 -306.356 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -44.106 -120.225 -323.081 + B= 11.9041 -151.255 -310.927 + C= -3.07949 -183.142 -293.778 + D= -59.1005 -152.297 -306.356 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope10 %%%%%%% HiraTelescope -A= -44.9825 88.329 -333.1 -B= 9.20852 53.1653 -341.737 -C= -7.61774 17.9956 -345.651 -D= -61.8224 53.2494 -337.467 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -44.9825 88.329 -333.1 + B= 9.20852 53.1653 -341.737 + C= -7.61774 17.9956 -345.651 + D= -61.8224 53.2494 -337.467 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope11 %%%%%%% HiraTelescope -A= -41.9929 172.218 -298.929 -B= 11.4164 139.257 -316.5 -C= -6.18724 106.675 -329.3 -D= -59.6068 139.84 -312.143 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -41.9929 172.218 -298.929 + B= 11.4164 139.257 -316.5 + C= -6.18724 106.675 -329.3 + D= -59.6068 139.84 -312.143 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 diff --git a/Inputs/DetectorConfiguration/hira_exp.detector b/Inputs/DetectorConfiguration/hira_exp.detector index 9b27a264a4b46367f8ba915547126c83bbd82965..527cd13740e79b9de5e6e93098d91bdf621f7072 100644 --- a/Inputs/DetectorConfiguration/hira_exp.detector +++ b/Inputs/DetectorConfiguration/hira_exp.detector @@ -15,157 +15,150 @@ HIRAArray %%%%%%% Telescope0 %%%%%%% HiraTelescope -A= -172.291 65.55 300.329 -B= -219.769 30.2478 272.989 -C= -207.639 -5.16037 284.486 -D= -160.15 30.1168 311.835 -ThinSi_DE= 0 -ThickSi_E= 1 -CsI= 1 + A= -172.291 65.55 300.329 + B= -219.769 30.2478 272.989 + C= -207.639 -5.16037 284.486 + D= -160.15 30.1168 311.835 + ThinSi_DE= 0 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope1 %%%%%%% HiraTelescope -A= -159.479 141.333 280.66 -B= -211.233 107.604 259.882 -C= -203.393 73.7704 277.961 -D= -151.631 107.475 298.753 -ThinSi_DE= 0 -ThickSi_E= 1 -CsI= 1 + A= -159.479 141.333 280.66 + B= -211.233 107.604 259.882 + C= -203.393 73.7704 277.961 + D= -151.631 107.475 298.753 + ThinSi_DE= 0 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope2 %%%%%%% HiraTelescope -A= -137.726 209.931 247.263 -B= -193.454 179.488 232.586 -C= -189.601 148.949 256.785 -D= -133.867 179.371 271.481 -ThinSi_DE= 0 -ThickSi_E= 1 -CsI= 1 + A= -137.726 209.931 247.263 + B= -193.454 179.488 232.586 + C= -189.601 148.949 256.785 + D= -133.867 179.371 271.481 + ThinSi_DE= 0 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope3 %%%%%%% HiraTelescope -A= -249.886 65.8949 239.569 -B= -287.764 30.5993 199.98 -C= -279.394 -4.80689 214.45 -D= -241.507 30.4636 254.052 -ThinSi_DE= 0 -ThickSi_E= 1 -CsI= 1 + A= -249.886 65.8949 239.569 + B= -287.764 30.5993 199.98 + C= -279.394 -4.80689 214.45 + D= -241.507 30.4636 254.052 + ThinSi_DE= 0 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope4 %%%%%%% HiraTelescope -A= -231.993 141.655 224.257 -B= -275.821 107.938 189.76 -C= -273.419 74.1148 209.337 -D= -229.587 107.808 243.851 -ThinSi_DE= 0 -ThickSi_E= 1 -CsI= 1 + A= -231.993 141.655 224.257 + B= -275.821 107.938 189.76 + C= -273.419 74.1148 209.337 + D= -229.587 107.808 243.851 + ThinSi_DE= 0 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope5 %%%%%%% HiraTelescope -A= -201.659 210.213 198.299 -B= -251.016 179.788 168.533 -C= -254.161 149.268 192.857 -D= -204.804 179.671 222.643 -ThinSi_DE= 0 -ThickSi_E= 1 -CsI= 1 + A= -201.659 210.213 198.299 + B= -251.016 179.788 168.533 + C= -254.161 149.268 192.857 + D= -204.804 179.671 222.643 + ThinSi_DE= 0 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope6 %%%%%%% HiraTelescope -A= -160.425 268.083 163.013 -B= -214.611 242.498 137.38 -C= -222.6 216.832 165.849 -D= -168.417 242.4 191.505 -ThinSi_DE= 0 -ThickSi_E= 1 -CsI= 1 + A= -160.425 268.083 163.013 + B= -214.611 242.498 137.38 + C= -222.6 216.832 165.849 + D= -168.417 242.4 191.505 + ThinSi_DE= 0 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope7 %%%%%%% HiraTelescope -A= -110.389 312.323 120.195 -B= -168.457 292.878 97.8832 -C= -180.34 273.372 129.685 -D= -122.278 292.803 152.021 -ThinSi_DE= 0 -ThickSi_E= 1 -CsI= 1 + A= -110.389 312.323 120.195 + B= -168.457 292.878 97.8832 + C= -180.34 273.372 129.685 + D= -122.278 292.803 152.021 + ThinSi_DE= 0 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope8 %%%%%%% HiraTelescope -A= -318.259 65.8742 136.197 -B= -339.763 30.5784 85.8029 -C= -337.025 -4.82794 102.293 -D= -315.518 30.4428 152.703 -ThinSi_DE= 0 -ThickSi_E= 1 -CsI= 1 + A= -318.259 65.8742 136.197 + B= -339.763 30.5784 85.8029 + C= -337.025 -4.82794 102.293 + D= -315.518 30.4428 152.703 + ThinSi_DE= 0 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope9 %%%%%%% HiraTelescope -A= -296.036 141.74 128.26 -B= -324.929 108.025 80.5492 -C= -329.578 74.2051 99.7226 -D= -300.688 107.896 147.451 -ThinSi_DE= 0 -ThickSi_E= 1 -CsI= 1 + A= -296.036 141.74 128.26 + B= -324.929 108.025 80.5492 + C= -329.578 74.2051 99.7226 + D= -300.688 107.896 147.451 + ThinSi_DE= 0 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope10 %%%%%%% HiraTelescope -A= -258.49 210.285 114.635 -B= -294.224 179.865 69.408 -C= -305.734 149.35 91.0724 -D= -270.007 179.748 136.319 -ThinSi_DE= 0 -ThickSi_E= 1 -CsI= 1 + A= -258.49 210.285 114.635 + B= -294.224 179.865 69.408 + C= -305.734 149.35 91.0724 + D= -270.007 179.748 136.319 + ThinSi_DE= 0 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope11 %%%%%%% HiraTelescope -A= -207.463 268.142 96.1114 -B= -249.169 242.562 53.0521 -C= -266.671 216.903 76.8915 -D= -224.976 242.464 119.971 -ThinSi_DE= 0 -ThickSi_E= 1 -CsI= 1 + A= -207.463 268.142 96.1114 + B= -249.169 242.562 53.0521 + C= -266.671 216.903 76.8915 + D= -224.976 242.464 119.971 + ThinSi_DE= 0 + ThickSi_E= 1 + CsI= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Microball - RING1= 1 - RING2= 1 - RING3= 1 - RING4= 1 - RING5= 1 - RING6= 1 - RING7= 1 - RING8= 1 - RING9= 1 - DISABLE_CRYSTAL 19 - DISABLE_CRYSTAL 20 - DISABLE_CRYSTAL 30 - DISABLE_CRYSTAL 31 - DISABLE_CRYSTAL 32 - DISABLE_CRYSTAL 42 - DISABLE_CRYSTAL 43 - DISABLE_CRYSTAL 44 - %DISABLE_CRYSTAL 45 - DETECTOR_FLIP= 0 - INCLUDE_CHAMBER= 1 + RING1= 1 + RING2= 1 + RING3= 1 + RING4= 1 + RING5= 1 + RING6= 1 + RING7= 1 + RING8= 1 + RING9= 1 + DISABLE_CRYSTAL 19 20 30 31 32 42 43 44 + %DISABLE_CRYSTAL 45 + DETECTOR_FLIP= 0 + INCLUDE_CHAMBER= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% NeutronWall - THETA= 50 - PHI= 0 - R= 3000 - BARS= 25 - VETOWALL= 1 - VWDISTANCE= 100 - OVERLAP= 3 - VWMATERIAL= BC400 - NWMATERIAL= NE213 + THETA= 50 + PHI= 0 + R= 3000 + BARS= 25 + VETOWALL= 1 + VWDISTANCE= 100 + OVERLAP= 3 + VWMATERIAL= BC400 + NWMATERIAL= NE213 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/hira_upgrade.detector b/Inputs/DetectorConfiguration/hira_upgrade.detector index cf2d075ab784dde73c34c2dbddd99b4a24a2d47d..df05ab9fc281e93480b277aae94b4bfe72a9db9e 100644 --- a/Inputs/DetectorConfiguration/hira_upgrade.detector +++ b/Inputs/DetectorConfiguration/hira_upgrade.detector @@ -15,122 +15,122 @@ HIRAArray %%%%%%% Telescope0 %%%%%%% HiraTelescope -A= -177.657 64.6929 291.606 -B= -223.829 29.3441 262.173 -C= -211.837 -6.11417 273.759 -D= -165.941 29.2929 303.557 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -177.657 64.6929 291.606 + B= -223.829 29.3441 262.173 + C= -211.837 -6.11417 273.759 + D= -165.941 29.2929 303.557 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope1 %%%%%%% HiraTelescope -A= -165.967 134.197 274.275 -B= -216.232 99.9158 250.91 -C= -208.327 65.8351 268.555 -D= -158.327 100.269 292.267 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -165.967 134.197 274.275 + B= -216.232 99.9158 250.91 + C= -208.327 65.8351 268.555 + D= -158.327 100.269 292.267 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope2 %%%%%%% HiraTelescope -A= -146.452 197.836 245.343 -B= -200.596 166.121 227.729 -C= -196.529 134.907 251.064 -D= -142.626 166.862 268.991 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -146.452 197.836 245.343 + B= -200.596 166.121 227.729 + C= -196.529 134.907 251.064 + D= -142.626 166.862 268.991 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope4 %%%%%%% HiraTelescope -A= -247.076 64.6929 235.688 -B= -284.058 29.3441 195.308 -C= -275.473 -6.11417 209.604 -D= -238.853 29.2929 250.264 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -247.076 64.6929 235.688 + B= -284.058 29.3441 195.308 + C= -275.473 -6.11417 209.604 + D= -238.853 29.2929 250.264 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope5 %%%%%%% HiraTelescope -A= -231.3 134.197 221.974 -B= -273.805 99.9158 186.395 -C= -270.736 65.8351 205.485 -D= -228.576 100.269 241.33 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -231.3 134.197 221.974 + B= -273.805 99.9158 186.395 + C= -270.736 65.8351 205.485 + D= -228.576 100.269 241.33 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope6 %%%%%%% HiraTelescope -A= -204.962 197.836 199.079 -B= -252.702 166.121 168.051 -C= -254.812 134.907 191.643 -D= -207.386 166.862 222.911 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -204.962 197.836 199.079 + B= -252.702 166.121 168.051 + C= -254.812 134.907 191.643 + D= -207.386 166.862 222.911 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope7 %%%%%%% HiraTelescope -A= -169.213 252.829 168.003 -B= -221.672 225.065 141.077 -C= -228.398 198.083 168.682 -D= -176.21 226.163 195.81 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -169.213 252.829 168.003 + B= -221.672 225.065 141.077 + C= -228.398 198.083 168.682 + D= -176.21 226.163 195.81 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope7 %%%%%%% HiraTelescope -A= -125.617 296.772 130.106 -B= -182.071 274.173 106.652 -C= -192.649 252.602 137.605 -D= -136.411 275.579 161.212 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -125.617 296.772 130.106 + B= -182.071 274.173 106.652 + C= -192.649 252.602 137.605 + D= -136.411 275.579 161.212 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope8 %%%%%%% HiraTelescope -A= -305.189 64.6929 153.152 -B= -328.749 29.3441 103.724 -C= -324.718 -6.11417 119.904 -D= -301.587 29.2929 169.495 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -305.189 64.6929 153.152 + B= -328.749 29.3441 103.724 + C= -324.718 -6.11417 119.904 + D= -301.587 29.2929 169.495 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope9 %%%%%%% HiraTelescope -A= -286.092 134.197 144.649 -B= -316.337 99.9158 98.1979 -C= -318.984 65.8351 117.351 -D= -289.147 100.269 163.956 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -286.092 134.197 144.649 + B= -316.337 99.9158 98.1979 + C= -318.984 65.8351 117.351 + D= -289.147 100.269 163.956 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope10 %%%%%%% HiraTelescope -A= -254.211 197.836 130.455 -B= -290.793 166.121 86.8249 -C= -299.709 134.907 108.77 -D= -263.497 166.862 152.536 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -254.211 197.836 130.455 + B= -290.793 166.121 86.8249 + C= -299.709 134.907 108.77 + D= -263.497 166.862 152.536 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 %%%%%%% Telescope11 %%%%%%% HiraTelescope -A= -210.939 252.829 111.189 -B= -253.233 225.065 70.1018 -C= -267.736 198.083 94.5344 -D= -225.76 226.163 135.735 -ThinSi_DE= 1 -ThickSi_E= 1 -CsI= 1 + A= -210.939 252.829 111.189 + B= -253.233 225.065 70.1018 + C= -267.736 198.083 94.5344 + D= -225.76 226.163 135.735 + ThinSi_DE= 1 + ThickSi_E= 1 + CsI= 1 diff --git a/Inputs/DetectorConfiguration/hyde-TDR_realistic.detector b/Inputs/DetectorConfiguration/hyde-TDR_realistic.detector deleted file mode 100644 index 5e8061c2d204440c092368082a0dc3bd98fcd2a3..0000000000000000000000000000000000000000 --- a/Inputs/DetectorConfiguration/hyde-TDR_realistic.detector +++ /dev/null @@ -1,668 +0,0 @@ -%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% -%%Position and distance given in mm -%Thickness in micrometer -%Radius in mm -%%Angle given in degree -%% using the data from the experimental mesurement -%% special care is given for the X Y direction -%% NOTATTION USED IN THE FOLLOWING: -%% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 -%%Option: 0,1 for Si SiLi and CSI -%%Option: all or sensible for VISualisation -% 1.2 12.371134021 -% 2 20.618556701 -% 30 309.278350515 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -Target - THICKNESS= 0.00001 - RADIUS= 8.0 - MATERIAL= Vacuum - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Hyde2Tracker -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8-7-6-5, phi=0deg -HYD2Trapezoid2 - X128_Y128= 42.81 13.91 158.74 - X1_Y128= 42.81 -13.91 158.74 - X128_Y1= 96.24 31.27 130.33 - X1_Y1= 96.24 -31.27 130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6-5-4-3, phi=0deg -HYD2Trapezoid1 - X128_Y128= 96.24 31.27 130.33 - X1_Y128= 96.24 -31.27 130.33 - X128_Y1= 149.92 48.72 48.72 - X1_Y1= 149.92 -48.72 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9-10-1-2 , phi=0deg -HYD2Trapezoid1 - X128_Y128= 96.24 -31.27 -130.33 - X1_Y128= 96.24 31.27 -130.33 - X128_Y1= 149.92 -48.72 -48.72 - X1_Y1= 149.92 48.72 -48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11-12-9-10 , phi=0deg -HYD2Trapezoid2 - X128_Y128= 42.81 -13.91 -158.74 - X1_Y128= 42.81 13.91 -158.74 - X128_Y1= 96.24 -31.27 -130.33 - X1_Y1= 96.24 31.27 -130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8-7-6-5, phi=35.999deg -HYD2Trapezoid2 - X128_Y128= 26.4544779622 36.419016952 158.74 - X1_Y128= 42.8087937368 13.9137118986 158.74 - X128_Y1= 59.4720023027 81.8720431045 130.33 - X1_Y1= 96.2368803956 31.2795996093 130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6-5-4-3, phi=35.999deg -HYD2Trapezoid1 - X128_Y128= 59.4720023027 81.8720431045 130.33 - X1_Y128= 96.2368803956 31.2795996093 130.33 - X128_Y1= 92.6388594197 127.544841234 48.72 - X1_Y1= 149.920114958 48.7196462521 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2-4-1-3, phi=35.999deg -HYD2Square1 - X128_Y1= 92.654 127.534 -48.72 - X128_Y128= 92.654 127.534 48.72 - X1_Y1= 149.926 48.72 -48.72 - X1_Y128= 149.926 48.72 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9-10-1-2 , phi=35.999deg -HYD2Trapezoid1 - X128_Y128= 96.2368803956 31.2795996093 -130.33 - X1_Y128= 59.4720023027 81.8720431045 -130.33 - X128_Y1= 149.920114958 48.7196462521 -48.72 - X1_Y1= 92.6388594197 127.544841234 -48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11-12-9-10 , phi=35.999deg -HYD2Trapezoid2 - X128_Y128= 42.8087937368 13.9137118986 -158.74 - X1_Y128= 26.4544779622 36.419016952 -158.74 - X128_Y1= 96.2368803956 31.2795996093 -130.33 - X1_Y1= 59.4720023027 81.8720431045 -130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8-7-6-5, phi=71.997deg -HYD2Trapezoid2 - X128_Y128= 0.002 45.013 158.74 - X1_Y128= 26.459 36.416 158.74 - X128_Y1= 0.005 101.193 130.33 - X1_Y1= 59.482 81.865 130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6-5-4-3, phi=71.997deg -HYD2Trapezoid1 - X128_Y128= 0.0050468908986 101.192640417 130.33 - X1_Y128= 59.4720023027 81.8720431045 130.33 - X128_Y1= -0.000185979149216 157.637701074 48.72 - X1_Y1= 92.6388594197 127.544841234 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2-4-1-3, phi=71.997deg -HYD2Square1 - X128_Y1= 0.000 157.638 -48.72 - X128_Y128= 0.000 157.638 48.72 - X1_Y1= 92.654 127.534 -48.72 - X1_Y128= 92.654 127.534 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9-10-1-2 , phi=71.997deg -HYD2Trapezoid1 - X128_Y128= 59.4720023027 81.8720431045 -130.33 - X1_Y128= 0.0050468908986 101.192640417 -130.33 - X128_Y1= 92.6388594197 127.544841234 -48.72 - X1_Y1= 0.000185979149216 157.637701074 -48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11-12-9-10 , phi=71.997deg -HYD2Trapezoid2 - X128_Y128= 26.459 36.416 -158.74 - X1_Y128= 0.002 45.013 -158.74 - X128_Y1= 59.482 81.865 -130.33 - X1_Y1= 0.005 101.193 -130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8-7-6-5, phi=107.996deg -HYD2Trapezoid2 - X128_Y128= -26.4544779622 36.419016952 158.74 - X1_Y128= 0.00337376708037 45.0131557283 158.74 - X128_Y1= -59.4720023027 81.8720431045 130.33 - X1_Y1= 0.00692465110692 101.192640306 130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6-5-4-3, phi=107.996deg -HYD2Trapezoid1 - X128_Y128= -59.4720023027 81.8720431045 130.33 - X1_Y128= 0.00692465110692 101.192640306 130.33 - X128_Y1= -92.6388594197 127.544841234 48.72 - X1_Y1= 0.0184632659624 157.637699993 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2-4-1-3, phi=107.996deg -HYD2Square1 - X128_Y1= -92.654 127.534 -48.72 - X128_Y128= -92.654 127.534 48.72 - X1_Y1= 0.019 157.638 -48.72 - X1_Y128= 0.019 157.638 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9-10-1-2 , phi=107.996deg -HYD2Trapezoid1 - X128_Y128= 0.007 101.193 -130.33 - X1_Y128= -59.474 81.871 -130.33 - X128_Y1= 0.019 157.638 -48.72 - X1_Y1= -92.654 127.534 -48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11-12-9-10 , phi=107.996deg -HYD2Trapezoid2 - X128_Y128= 0.00337376708037 45.0131557283 -158.74 - X1_Y128= -26.4544779622 36.419016952 -158.74 - X128_Y1= 0.00692465110692 101.192640306 -130.33 - X1_Y1= -59.4720023027 81.8720431045 -130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8-7-6-5, phi=143.994deg -HYD2Trapezoid2 - X128_Y128= -42.8087937368 13.9137118986 158.74 - X1_Y128= -26.4544779622 36.419016952 158.74 - X128_Y1= -96.2368803956 31.2795996093 130.33 - X1_Y1= -59.4720023027 81.8720431045 130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6-5-4-3, phi=143.994deg -HYD2Trapezoid1 - X128_Y128= -96.2368803956 31.2795996093 130.33 - X1_Y128= -59.4720023027 81.8720431045 130.33 - X128_Y1= -149.920114958 48.7196462521 48.72 - X1_Y1= -92.6388594197 127.544841234 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2-4-1-3, phi=143.994deg -HYD2Square1 - X128_Y1= -149.920114958 48.7196462521 -48.72 - X128_Y128= -149.920114958 48.7196462521 48.72 - X1_Y1= -92.6388594197 127.544841234 -48.72 - X1_Y128= -92.6388594197 127.544841234 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9-10-1-2 , phi=143.994deg -HYD2Trapezoid1 - X128_Y128= -59.4720023027 81.8720431045 -130.33 - X1_Y128= -96.2368803956 31.2795996093 -130.33 - X128_Y1= -92.6388594197 127.544841234 -48.72 - X1_Y1= -149.920114958 48.7196462521 -48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11-12-9-10 , phi=143.994deg -HYD2Trapezoid2 - X128_Y128= -26.4544779622 36.419016952 -158.74 - X1_Y128= -42.8087937368 13.9137118986 -158.74 - X128_Y1= -59.4720023027 81.8720431045 -130.33 - X1_Y1= -96.2368803956 31.2795996093 -130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8-7-6-5, phi=179.993deg -HYD2Trapezoid2 - X128_Y128= -42.8116453156 -13.9049352882 158.74 - X1_Y128= -42.8083540852 13.9150645171 158.74 - X128_Y1= -96.2436987074 -31.2586141587 130.33 - X1_Y1= -96.2362999457 31.2813854036 130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6-5-4-3, phi=179.993deg -HYD2Trapezoid1 - X128_Y128= -96.2436987074 -31.2586141587 130.33 - X1_Y128= -96.2362999457 31.2813854036 130.33 - X128_Y1= -149.925762745 -48.7022634525 48.72 - X1_Y1= -149.914235157 48.7377358656 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2-4-1-3, phi=179.993deg -HYD2Square1 - X128_Y1= -149.925762745 -48.7022634525 -48.72 - X128_Y128= -149.925762745 -48.7022634525 48.72 - X1_Y1= -149.914235157 48.7377358656 -48.72 - X1_Y128= -149.914235157 48.7377358656 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9-10-1-2 , phi=179.993deg -HYD2Trapezoid1 - X128_Y128= -96.2362999457 31.2813854036 -130.33 - X1_Y128= -96.2436987074 -31.2586141587 -130.33 - X128_Y1= -149.914235157 48.7377358656 -48.72 - X1_Y1= -149.925762745 -48.7022634525 -48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11-12-9-10 , phi=179.993deg -HYD2Trapezoid2 - X128_Y128= -42.8083540852 13.9150645171 -158.74 - X1_Y128= -42.8116453156 -13.9049352882 -158.74 - X128_Y1= -96.2362999457 31.2813854036 -130.33 - X1_Y1= -96.2436987074 -31.2586141587 -130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8-7-6-5, phi=215.992deg -HYD2Trapezoid2 - X128_Y128= -26.4711852911 -36.4186332704 158.74 - X1_Y128= -42.8201756515 -13.9094592696 158.74 - X128_Y1= -59.4913722956 -81.8579692051 130.33 - X1_Y1= -96.2442787348 -31.2568282271 130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6-5-4-3, phi=215.992deg -HYD2Trapezoid1 - X128_Y128= -59.4913722956 -81.8579692051 130.33 - X1_Y128= -96.2442787348 -31.2568282271 130.33 - X128_Y1= -92.6690350768 -127.522918481 48.72 - X1_Y1= -149.931638266 -48.6841724483 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2-4-1-3, phi=215.992deg -HYD2Square1 - X128_Y1= -92.6690350768 -127.522918481 -48.72 - X128_Y128= -92.6690350768 -127.522918481 48.72 - X1_Y1= -149.931638266 -48.6841724483 -48.72 - X1_Y128= -149.931638266 -48.6841724483 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9-10-1-2 , phi=215.992deg -HYD2Trapezoid1 - X128_Y128= -96.2442787348 -31.2568282271 -130.33 - X1_Y128= -59.4913722956 -81.8579692051 -130.33 - X128_Y1= -149.931638266 -48.6841724483 -48.72 - X1_Y1= -92.6690350768 -127.522918481 -48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11-12-9-10 , phi=215.992deg -HYD2Trapezoid2 - X128_Y128= -42.8120846472 -13.9035825657 -158.74 - X1_Y128= -26.4630942868 -36.4127565664 -158.74 - X128_Y1= -96.2442787348 -31.2568282271 -130.33 - X1_Y1= -59.4913722956 -81.8579692051 -130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8-7-6-5, phi=251.991deg -HYD2Trapezoid2 - X128_Y128= -0.00727674824959 -45.0131552665 158.74 - X1_Y128= -26.4642448041 -36.4119203963 158.74 - X128_Y1= -0.0170184328335 -101.192639112 130.33 - X1_Y1= -59.4928912658 -81.8568652517 130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6-5-4-3, phi=251.991deg -HYD2Trapezoid1 - X128_Y128= -0.0170184328335 -101.192639112 130.33 - X1_Y128= -59.4928912658 -81.8568652517 130.33 - X128_Y1= -0.0184632659624 -157.637699993 48.72 - X1_Y1= -92.6844218339 -127.511735732 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2-4-1-3, phi=251.991deg -HYD2Square1 - X128_Y1= -0.0184632659624 -157.637699993 -48.72 - X128_Y128= -0.0184632659624 -157.637699993 48.72 - X1_Y1= -92.6844218339 -127.511735732 -48.72 - X1_Y128= -92.6844218339 -127.511735732 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9-10-1-2 , phi=251.991deg -HYD2Trapezoid1 - X128_Y128= -59.4928912658 -81.8568652517 -130.33 - X1_Y128= -0.0170184328335 -101.192639112 -130.33 - X128_Y1= -92.6844218339 -127.511735732 -48.72 - X1_Y1= -0.0184632659624 -157.637699993 -48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11-12-9-10 , phi=251.991deg -HYD2Trapezoid2 - X128_Y128= -26.4642448041 -36.4119203963 -158.74 - X1_Y128= -0.00727674824959 -45.0131552665 -158.74 - X128_Y1= -59.4928912658 -81.8568652517 -130.33 - X1_Y1= -0.0170184328335 -101.192639112 -130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8-7-6-5, phi=287.989deg -HYD2Trapezoid2 - X128_Y128= 26.4513200584 -36.4213106185 158.74 - X1_Y128= -0.0086990247118 -45.0131550141 158.74 - X128_Y1= 59.4638354195 -81.8779749212 130.33 - X1_Y1= -0.0188961930155 -101.192638778 130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6-5-4-3, phi=287.989deg -HYD2Trapezoid1 - X128_Y128= 59.4638354195 -81.8779749212 130.33 - X1_Y128= -0.0188961930155 -101.192638778 130.33 - X128_Y1= 92.6391603714 -127.544622645 48.72 - X1_Y1= -0.0374844691037 -157.637696618 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2-4-1-3, phi=287.989deg -HYD2Square1 - X128_Y1= 92.6391603714 -127.544622645 -48.72 - X128_Y128= 92.6391603714 -127.544622645 48.72 - X1_Y1= -0.0374844691037 -157.637696618 -48.72 - X1_Y128= -0.0374844691037 -157.637696618 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9-10-1-2 , phi=287.989deg -HYD2Trapezoid1 - X128_Y128= -0.0188961930155 -101.192638778 -130.33 - X1_Y128= 59.4638354195 -81.8779749212 -130.33 - X128_Y1= -0.037484469103 -157.637696618 -48.72 - X1_Y1= 92.6391603714 -127.544622645 -48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11-12-9-10 , phi=287.989deg -HYD2Trapezoid2 - X128_Y128= -0.0086990247118 -45.0131550141 -158.74 - X1_Y128= 26.4513200584 -36.4213106185 -158.74 - X128_Y1= -0.0188961930155 -101.192638778 -130.33 - X1_Y1= 59.4638354195 -81.8779749212 -130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8-7-6-5, phi=323.988deg -HYD2Trapezoid2 - X128_Y128= 42.8071473829 -13.918776273 158.74 - X1_Y128= 26.4501692445 -36.4221463802 158.74 - X128_Y1= 96.2331792056 -31.2909846438 130.33 - X1_Y1= 59.4623160576 -81.8790783355 130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6-5-4-3, phi=323.988deg -HYD2Trapezoid1 - X128_Y128= 96.2331792056 -31.2909846438 130.33 - X1_Y128= 59.4623160576 -81.8790783355 130.33 - X128_Y1= 149.914350157 -48.7373821313 48.72 - X1_Y1= 92.6237696463 -127.555799933 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2-4-1-3, phi=323.988deg -HYD2Square1 - X128_Y1= 149.914350157 -48.7373821313 -48.72 - X128_Y128= 149.914350157 -48.7373821313 48.72 - X1_Y1= 92.6237696463 -127.555799933 -48.72 - X1_Y128= 92.6237696463 -127.555799933 48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9-10-1-2 , phi=323.988deg -HYD2Trapezoid1 - X128_Y128= 59.4623160576 -81.8790783355 -130.33 - X1_Y128= 96.2331792056 -31.2909846438 -130.33 - X128_Y1= 92.6237696463 -127.555799933 -48.72 - X1_Y1= 149.914350157 -48.7373821313 -48.72 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11-12-9-10 , phi=323.988deg -HYD2Trapezoid2 - X128_Y128= 26.4501692445 -36.4221463802 -158.74 - X1_Y128= 42.8071473829 -13.918776273 -158.74 - X128_Y1= 59.4623160576 -81.8790783355 -130.33 - X1_Y1= 96.2331792056 -31.2909846438 -130.33 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - FOURTHSTAGE= 1 - FIFTHSTAGE= 1 - SIXTHSTAGE= 1 - VIS= all diff --git a/Inputs/DetectorConfiguration/plastic.detector b/Inputs/DetectorConfiguration/plastic.detector index 5558ccc3fbf2e9ac34702332a0f67fbd17e159fe..fef9b416f98cdf954055e164a3bda3e1d2253a56 100644 --- a/Inputs/DetectorConfiguration/plastic.detector +++ b/Inputs/DetectorConfiguration/plastic.detector @@ -1,37 +1,24 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Thickness in micrometer -% Radius in mm -% Temperature in K, Pressure in bar Target - THICKNESS= 100 - ANGLE= 0 - RADIUS= 7.5 - MATERIAL= CH2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ScintillatorPlastic -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ScintillatorPlastic + THICKNESS= 100 micrometer + ANGLE= 0 deg + RADIUS= 7.5 mm + MATERIAL= CH2 + X= 0 mm + Y= 0 mm + Z= 0 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Plastic - THETA= 0 - PHI= 0 - R= 0 - X= 0 - Y= 0 - Z= 10 - Thickness= 1.0 - Shape= Square - Height= 22 - Width= 22 - Radius= 0 - Scintillator= BC400 - LeadThickness= 0 + X= 0 mm + Y= 0 mm + Z= 10 mm + Thickness= 1.0 cm + Shape= Square + Height= 22 mm + Width= 22 mm + Radius= 0 mm + Scintillator= BC400 + LeadThickness= 0 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/EventGenerator/10He.reaction b/Inputs/EventGenerator/10He.reaction index 5f7ab3e07bf24a95615bab005d79f9f1c50058f3..b2696775485a84138acd1bda2c2215f7697d4212 100644 --- a/Inputs/EventGenerator/10He.reaction +++ b/Inputs/EventGenerator/10He.reaction @@ -15,11 +15,11 @@ Beam Particle= 11Li Energy= 553 - SigmaEnergy= 20 - SigmaThetaX= 0.6138 - SigmaPhiY= 0.3812 - SigmaX= 6.216 - SigmaY= 6.109 + SigmaEnergy= 20 + SigmaThetaX= 0.6138 + SigmaPhiY= 0.3812 + SigmaX= 6.216 + SigmaY= 6.109 MeanThetaX= 0 MeanPhiY= 0 MeanX= 1.773 @@ -31,22 +31,22 @@ Beam %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 11Li - Target= 2H - Light= 3He - Heavy= 10He - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 10.0 - CrossSectionPath= 11Li(d,3He)10He.txt CS10He - ShootLight= 1 - ShootHeavy= 0 + Beam= 11Li + Target= 2H + Light= 3He + Heavy= 10He + ExcitationEnergyLight= 0.0 + ExcitationEnergyHeavy= 10.0 + CrossSectionPath= 11Li(d,3He)10He.txt CS10He + ShootLight= 1 + ShootHeavy= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %ParticleDecay 10He Daughter= 9He n ExcitationEnergy= 0.1 0 - DifferentialCrossSection= 11Li(d,3He)10He.txt particle9He + DifferentialCrossSection= 11Li(d,3He)10He.txt particle9He shoot= 1 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -55,7 +55,7 @@ TwoBodyReaction Cascade BranchingRatio= 30 Energies= 0.1 - DifferentialCrossSection= 11Li(d,3He)10He.txt Gamma9He + DifferentialCrossSection= 11Li(d,3He)10He.txt Gamma9He Cascade BranchingRatio= 70 Energies= 0.05 0.5 diff --git a/Inputs/EventGenerator/11Be_d3He.reaction b/Inputs/EventGenerator/11Be_d3He.reaction index 3553801964c88efdceb5fa36a4e85cc776c192a9..f84d5a5c9d2d0252028b534f775ea511ead55022 100644 --- a/Inputs/EventGenerator/11Be_d3He.reaction +++ b/Inputs/EventGenerator/11Be_d3He.reaction @@ -1,11 +1,11 @@ Beam Particle= 11Be Energy= 660 - SigmaEnergy= 4 - SigmaThetaX= 0. - SigmaPhiY= 0. - SigmaX= 3 - SigmaY= 3 + SigmaEnergy= 4 + SigmaThetaX= 0. + SigmaPhiY= 0. + SigmaX= 3 + SigmaY= 3 MeanThetaX= 0 MeanPhiY= 0 MeanX= 0 @@ -14,22 +14,22 @@ Beam %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 11Be - Target= 2H - Light= 3He - Heavy= 10Li - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 0.0 - CrossSectionPath= 11Li(d,3He)10He.txt CS - ShootLight= 1 - ShootHeavy= 0 + Beam= 11Be + Target= 2H + Light= 3He + Heavy= 10Li + ExcitationEnergyLight= 0.0 + ExcitationEnergyHeavy= 0.0 + CrossSectionPath= 11Li(d,3He)10He.txt CS + ShootLight= 1 + ShootHeavy= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %ParticleDecay 10Li Daughter= 9Li n ExcitationEnergy= 0.1 0 - DifferentialCrossSection= flat.txt particle9He + DifferentialCrossSection= flat.txt particle9He shoot= 1 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -38,7 +38,7 @@ TwoBodyReaction Cascade BranchingRatio= 30 Energies= 0.1 - DifferentialCrossSection= 11Li(d,3He)10He.txt Gamma9He + DifferentialCrossSection= 11Li(d,3He)10He.txt Gamma9He Cascade BranchingRatio= 70 Energies= 0.05 0.5 diff --git a/Inputs/EventGenerator/11Li.beam b/Inputs/EventGenerator/11Li.beam index ce45dfdf2609d18eaed59fa02dcc124d67e9b23c..361a7b898c8924347fa6e013af88ea4032d4bbee 100644 --- a/Inputs/EventGenerator/11Li.beam +++ b/Inputs/EventGenerator/11Li.beam @@ -4,11 +4,11 @@ Beam Particle= 11Li Energy= 553 - SigmaEnergy= 20 - SigmaThetaX= 0.6138 - SigmaPhiY= 0.3812 - SigmaX= 6.216 - SigmaY= 6.109 + SigmaEnergy= 20 + SigmaThetaX= 0.6138 + SigmaPhiY= 0.3812 + SigmaX= 6.216 + SigmaY= 6.109 MeanThetaX= 0 MeanPhiY= 0 MeanX= 1.773 diff --git a/Inputs/EventGenerator/12Cppa.reaction b/Inputs/EventGenerator/12Cppa.reaction index 39a41410b9a502d5563004ed577b3790460780b6..5e9fcb8a52e712e9eb1a63b2ae64ee1ff1ca72b4 100644 --- a/Inputs/EventGenerator/12Cppa.reaction +++ b/Inputs/EventGenerator/12Cppa.reaction @@ -16,15 +16,15 @@ Beam MeanY= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 1H - Target= 12C - Light= 1H - Heavy= 12C - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 12.7 - CrossSectionPath= flat.txt CS - ShootLight= 1 - ShootHeavy= 1 + Beam= 1H + Target= 12C + Light= 1H + Heavy= 12C + ExcitationEnergyLight= 0.0 + ExcitationEnergyHeavy= 12.7 + CrossSectionPath= flat.txt CS + ShootLight= 1 + ShootHeavy= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ParticleDecay 12C Daughter= 4He 4He 4He diff --git a/Inputs/EventGenerator/12Li.reaction b/Inputs/EventGenerator/12Li.reaction index 4622b307ef6199e6eece0f56edc33b70d5ffd7f5..33b90272149082a4667b6067eb07742431ccdc5d 100644 --- a/Inputs/EventGenerator/12Li.reaction +++ b/Inputs/EventGenerator/12Li.reaction @@ -6,11 +6,11 @@ Beam Particle= 11Li Energy= 550 - SigmaEnergy= 0 - SigmaThetaX= 0.6921330164 - SigmaPhiY= 0.963142053 - SigmaX= 6.232 - SigmaY= 9.069 + SigmaEnergy= 0 + SigmaThetaX= 0.6921330164 + SigmaPhiY= 0.963142053 + SigmaX= 6.232 + SigmaY= 9.069 MeanThetaX= 0 MeanPhiY= 0 MeanX= 0 @@ -18,13 +18,13 @@ Beam %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 11Li - Target= 2H - Light= 1H - Heavy= 12Li - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 1.0 - CrossSectionPath= flat.txt CS - ShootLight= 1 - ShootHeavy= 0 + Beam= 11Li + Target= 2H + Light= 1H + Heavy= 12Li + ExcitationEnergyLight= 0.0 + ExcitationEnergyHeavy= 1.0 + CrossSectionPath= flat.txt CS + ShootLight= 1 + ShootHeavy= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/EventGenerator/132SndpTestMarcIsotropic.reaction b/Inputs/EventGenerator/132SndpTestMarcIsotropic.reaction index b8dab4c3dfb6d09b7652822ce83aff3bf90fda98..2b804fe36859e02bb78d0b9b66415c212c752e71 100644 --- a/Inputs/EventGenerator/132SndpTestMarcIsotropic.reaction +++ b/Inputs/EventGenerator/132SndpTestMarcIsotropic.reaction @@ -5,25 +5,25 @@ Beam Particle= 132Sn Energy= 1320 - SigmaEnergy= 0 - SigmaX= 0.851 - SigmaY= 0.851 - SigmaThetaX= 0 - SigmaPhiY= 0 + SigmaEnergy= 0 + SigmaX= 0.851 + SigmaY= 0.851 + SigmaThetaX= 0 + SigmaPhiY= 0 MeanThetaX= 0 MeanPhiY= 0 MeanX= 0 MeanY= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 132Sn - Target= 2H - Light= 1H - Heavy= 133Sn - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 0.0 - CrossSectionPath= flat.txt CS - ShootLight= 1 - ShootHeavy= 0 + Beam= 132Sn + Target= 2H + Light= 1H + Heavy= 133Sn + ExcitationEnergyLight= 0.0 + ExcitationEnergyHeavy= 0.0 + CrossSectionPath= flat.txt CS + ShootLight= 1 + ShootHeavy= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/EventGenerator/134Snpt.reaction b/Inputs/EventGenerator/134Snpt.reaction index 8358daae192325812f0ddc38dfbc30bcea5bca1e..ad91e165972cf5d2138157061ec7594722644e2a 100644 --- a/Inputs/EventGenerator/134Snpt.reaction +++ b/Inputs/EventGenerator/134Snpt.reaction @@ -5,25 +5,25 @@ Beam Particle= 134Sn Energy= 1340 - SigmaEnergy= 0 - SigmaX= 0 - SigmaY= 0 - SigmaThetaX= 0 - SigmaPhiY= 0 + SigmaEnergy= 0 + SigmaX= 0 + SigmaY= 0 + SigmaThetaX= 0 + SigmaPhiY= 0 MeanThetaX= 0 MeanPhiY= 0 MeanX= 0 MeanY= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 134Sn - Target= 1H - Light= 3H - Heavy= 132Sn - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 0.0 - CrossSectionPath= CS_Ep10MeV_sn134pt_gs_1h9demi.dat CS - ShootLight= 1 - ShootHeavy= 0 + Beam= 134Sn + Target= 1H + Light= 3H + Heavy= 132Sn + ExcitationEnergyLight= 0.0 + ExcitationEnergyHeavy= 0.0 + CrossSectionPath= CS_Ep10MeV_sn134pt_gs_1h9demi.dat CS + ShootLight= 1 + ShootHeavy= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/EventGenerator/19C208Pb_570MeV_EneSpr1_flat.reaction b/Inputs/EventGenerator/19C208Pb_570MeV_EneSpr1_flat.reaction index 2eaeed3493e1966633333a25bdcfb6794a6715bf..a3e83167653c6e0ab892a7b02fa1fa6f6ce9c862 100644 --- a/Inputs/EventGenerator/19C208Pb_570MeV_EneSpr1_flat.reaction +++ b/Inputs/EventGenerator/19C208Pb_570MeV_EneSpr1_flat.reaction @@ -5,26 +5,26 @@ Beam Particle= 19C Energy= 570 - SigmaEnergy= 5.70 - SigmaX= 1. - SigmaY= 1. - SigmaThetaX= 0. - SigmaPhiY= 0. + SigmaEnergy= 5.70 + SigmaX= 1. + SigmaY= 1. + SigmaThetaX= 0. + SigmaPhiY= 0. MeanThetaX= 0 MeanPhiY= 0 MeanX= 0 MeanY= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 19C - Target= 208Pb - Light= 19C - Heavy= 208Pb - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 0.0 - CrossSectionPath= flat.txt CS - ShootLight= 1 - ShootHeavy= 0 + Beam= 19C + Target= 208Pb + Light= 19C + Heavy= 208Pb + ExcitationEnergyLight= 0.0 + ExcitationEnergyHeavy= 0.0 + CrossSectionPath= flat.txt CS + ShootLight= 1 + ShootHeavy= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %ShootLight= 1 -> therefore we shoot light particle %ShootHeavy= 0 -> therefore we DO NOT shoot heavy particle diff --git a/Inputs/EventGenerator/208Pbpp.reaction b/Inputs/EventGenerator/208Pbpp.reaction index 334ed1c4060a6811a0413b721e4b6c31aff4a47d..144ee28c7c133d64c881076c59aaabba2aefc7dc 100644 --- a/Inputs/EventGenerator/208Pbpp.reaction +++ b/Inputs/EventGenerator/208Pbpp.reaction @@ -3,28 +3,28 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%Beam energy given in MeV ; Excitation in MeV ; emmitance in rad Beam - Particle= 1H - Energy= 2.5 - SigmaEnergy= 2.5 - MeanX= 0 - MeanY= 0 - SigmaX= 0 - SigmaY= 0 - MeanThetaX= 0 - MeanThetaY= 0 - SigmaThetaX= 0 - SigmaPhiY= 0 + Particle= 1H + Energy= 2.5 + SigmaEnergy= 2.5 + MeanX= 0 + MeanY= 0 + SigmaX= 0 + SigmaY= 0 + MeanThetaX= 0 + MeanPhiY= 0 + SigmaThetaX= 0 + SigmaPhiY= 0 TwoBodyReaction - Beam= 1H - Target= 208Pb - Light= 1H - Heavy= 208Pb - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 0.0 - CrossSectionPath= flat.txt CS - ShootLight= 1 - ShootHeavy= 0 + Beam= 1H + Target= 208Pb + Light= 1H + Heavy= 208Pb + ExcitationEnergyLight= 0.0 + ExcitationEnergyHeavy= 0.0 + CrossSectionPath= flat.txt CS + ShootLight= 1 + ShootHeavy= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %ShootLight= 1 -> therefore we shoot light particle %ShootHeavy= 0 -> therefore we DO NOT shoot heavy particle diff --git a/Inputs/EventGenerator/24Nadp.reaction b/Inputs/EventGenerator/24Nadp.reaction index 89e3e5c4383c0ec716770b879b456ff2da52117b..d9666141dca0def459ae44c3a3d43d5bd74468c5 100644 --- a/Inputs/EventGenerator/24Nadp.reaction +++ b/Inputs/EventGenerator/24Nadp.reaction @@ -2,40 +2,37 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Beam - Particle= 24Na - ExcitationEnergy= 0 - Energy= 192 - SigmaEnergy= 1 - SigmaThetaX= 0.01 - SigmaPhiY= 0.01 - SigmaX= 0.5 - SigmaY= 0.5 - MeanThetaX= 0 - MeanPhiY= 0 - MeanX= 0 - MeanY= 0 - %EnergyProfilePath= - %XThetaXProfilePath= - %YPhiYProfilePath= + Particle= 24Na + ExcitationEnergy= 0 MeV + Energy= 192 MeV + SigmaEnergy= 1 MeV + SigmaThetaX= 0.01 deg + SigmaPhiY= 0.01 deg + SigmaX= 0.5 mm + SigmaY= 0.5 mm + MeanThetaX= 0 deg + MeanPhiY= 0 deg + MeanX= 0 mm + MeanY= 0 mm + %EnergyProfilePath= + %XThetaXProfilePath= + %YPhiYProfilePath= %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 24Na - Target= 2H - Light= 1H - Heavy= 25Na - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 2.2 - CrossSectionPath= flat.txt CSR - ShootLight= 1 - ShootHeavy= 1 + Beam= 24Na + Target= 2H + Light= 1H + Heavy= 25Na + ExcitationEnergyLight= 0.0 MeV + ExcitationEnergyHeavy= 2.2 MeV + CrossSectionPath= flat.txt CSR + ShootLight= 1 + ShootHeavy= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GammaDecay 25Na -Cascade +GammaCascade 25Na BranchingRatio= 70 - Energies= 2.2 - DifferentialCrossSection= 11Li(d,3He)10He.txt Gamma25Na -Cascade + Energies= 2.2 MeV + DifferentialCrossSection= flat.txt Gamma25Na +GammaCascade 25Na BranchingRatio= 30 - Energies= 1.0 1.2 - - + Energies= 1.0 1.2 MeV diff --git a/Inputs/EventGenerator/25Al3Hed.reaction b/Inputs/EventGenerator/25Al3Hed.reaction index 8f0beb1e967294de74adcc89b8af6aa3cd83bee5..8f7a47ca7b331c9dacbfe39b1829ecdc414e3b5a 100644 --- a/Inputs/EventGenerator/25Al3Hed.reaction +++ b/Inputs/EventGenerator/25Al3Hed.reaction @@ -6,23 +6,23 @@ Beam Energy= 375 SigmaEnergy= 0 SigmaX= 0 - SigmaY= 0 - SigmaThetaX= 0 - SigmaPhiY= 0 + SigmaY= 0 + SigmaThetaX= 0 + SigmaPhiY= 0 MeanThetaX= 0 MeanPhiY= 0 MeanX= 0 MeanY= 0 TwoBodyReaction - Beam= 25Al - Target= 3He - Light= 2H - Heavy= 26Al - ExcitationEnergyHeavy= 5.9 - ExcitationEnergyLight= 0.0 + Beam= 25Al + Target= 3He + Light= 2H + Heavy= 26Al + ExcitationEnergyHeavy= 5.9 + ExcitationEnergyLight= 0.0 CrossSectionPath= al25he3d_5.9_2s1.txt CS - ShootLight= 1 - ShootHeavy= 0 + ShootLight= 1 + ShootHeavy= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/EventGenerator/28Mgdp.reaction b/Inputs/EventGenerator/28Mgdp.reaction index d9e0b8827a38c5806c59b28aae0f7099643acb0e..2ee86497043abca23d6644e10a363b4d3fdd2cd4 100644 --- a/Inputs/EventGenerator/28Mgdp.reaction +++ b/Inputs/EventGenerator/28Mgdp.reaction @@ -19,22 +19,22 @@ Beam %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 28Mg - Target= 2H - Light= 1H - Heavy= 29Mg - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 0.0 + Beam= 28Mg + Target= 2H + Light= 1H + Heavy= 29Mg + ExcitationEnergyLight= 0.0 + ExcitationEnergyHeavy= 0.0 CrossSectionPath= flat.txt CSR - ShootLight= 1 - ShootHeavy= 1 + ShootLight= 1 + ShootHeavy= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %GammaDecay 25Na Cascade BranchingRatio= 70 Energies= 2.2 - DifferentialCrossSection= 11Li(d,3He)10He.txt Gamma25Na + DifferentialCrossSection= 11Li(d,3He)10He.txt Gamma25Na Cascade BranchingRatio= 30 Energies= 1.0 1.2 diff --git a/Inputs/EventGenerator/34Ar_pd.reaction b/Inputs/EventGenerator/34Ar_pd.reaction index 31fecb53291a524c0bc4fcd8b10a641c0a4f27f7..846bf62bd106cb2f6de9d1c912b1d5b61ded83d3 100644 --- a/Inputs/EventGenerator/34Ar_pd.reaction +++ b/Inputs/EventGenerator/34Ar_pd.reaction @@ -5,24 +5,24 @@ Beam Particle= 34Ar Energy= 2380 SigmaEnergy= 10 - SigmaX= 2 - SigmaY= 2 - SigmaThetaX= 0 - SigmaPhiY= 0 + SigmaX= 2 + SigmaY= 2 + SigmaThetaX= 0 + SigmaPhiY= 0 MeanThetaX= 0 MeanPhiY= 0 MeanX= 0 MeanY= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 34Ar - Target= 1H - Light= 2H - Heavy= 33Ar - ExcitationEnergyHeavy= 0.0 - ExcitationEnergyLight= 0.0 + Beam= 34Ar + Target= 1H + Light= 2H + Heavy= 33Ar + ExcitationEnergyHeavy= 0.0 + ExcitationEnergyLight= 0.0 CrossSectionPath= flat.txt CS - ShootLight= 1 - ShootHeavy= 0 + ShootLight= 1 + ShootHeavy= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/EventGenerator/34Si.reaction b/Inputs/EventGenerator/34Si.reaction index 1e5b5a69320d0988036f71b1348b0f175ccc9fa9..f25b472af80d7c39b8111dab593e4561c0c3fb87 100644 --- a/Inputs/EventGenerator/34Si.reaction +++ b/Inputs/EventGenerator/34Si.reaction @@ -21,18 +21,18 @@ Transfert %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%Beam energy given in MeV ; Excitation in MeV 748 612 %Transfert -% Beam= 34Si -% Target= 2H -% Light= 1H -% Heavy= 35Si -% ExcitationEnergy= 2.0 -% BeamEnergy= 748 -% BeamEnergySpread= 0 -% SigmaX= 0.5 -% SigmaY= 0.5 -% SigmaThetaX= 0 -% SigmaPhiY= 0 -% CrossSectionPath= flat.txt -% ShootLight= 1 -% ShootHeavy= 0 +% Beam= 34Si +% Target= 2H +% Light= 1H +% Heavy= 35Si +% ExcitationEnergy= 2.0 +% BeamEnergy= 748 +% BeamEnergySpread= 0 +% SigmaX= 0.5 +% SigmaY= 0.5 +% SigmaThetaX= 0 +% SigmaPhiY= 0 +% CrossSectionPath= flat.txt +% ShootLight= 1 +% ShootHeavy= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/EventGenerator/3He.source b/Inputs/EventGenerator/3He.source index c55cee0402905f01e71f2e2464481b6f63d5b730..8387000fedb1583aa317f5426fec624afe9773f8 100644 --- a/Inputs/EventGenerator/3He.source +++ b/Inputs/EventGenerator/3He.source @@ -1,17 +1,17 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% An Isotropic Source to be used as EventGenerator %%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Energy are given in MeV , Position in mm % +% Energy are given in MeV , Position in mm % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Isotropic - EnergyLow= 0 - EnergyHigh= 750 - HalfOpenAngleMin= 0 - HalfOpenAngleMax= 10 - x0= 0 - y0= 0 - z0= 0 - Multiplicity= 1 + EnergyLow= 0 + EnergyHigh= 750 + HalfOpenAngleMin= 0 + HalfOpenAngleMax= 10 + x0= 0 + y0= 0 + z0= 0 + Multiplicity= 1 Particle= 3He %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Supported particle type: proton, neutron, deuton, triton, He3 , alpha diff --git a/Inputs/EventGenerator/46Ar_pd.reaction b/Inputs/EventGenerator/46Ar_pd.reaction index f8b655b7719e94a44acad1ebdb8fb869fd62aaf0..d54ca9f6cebe0a1f7078b5b1b4c9140ef5dd95c7 100644 --- a/Inputs/EventGenerator/46Ar_pd.reaction +++ b/Inputs/EventGenerator/46Ar_pd.reaction @@ -5,24 +5,24 @@ Beam Particle= 46Ar Energy= 3220 SigmaEnergy= 14 - SigmaX= 2 - SigmaY= 2 - SigmaThetaX= 0 - SigmaPhiY= 0 + SigmaX= 2 + SigmaY= 2 + SigmaThetaX= 0 + SigmaPhiY= 0 MeanThetaX= 0 MeanPhiY= 0 MeanX= 0 MeanY= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 46Ar - Target= 1H - Light= 2H - Heavy= 45Ar - ExcitationEnergyHeavy= 0.542 - ExcitationEnergyLight= 0.0 + Beam= 46Ar + Target= 1H + Light= 2H + Heavy= 45Ar + ExcitationEnergyHeavy= 0.542 + ExcitationEnergyLight= 0.0 CrossSectionPath= flat.txt CS - ShootLight= 1 - ShootHeavy= 0 + ShootLight= 1 + ShootHeavy= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/EventGenerator/60Fe.reaction b/Inputs/EventGenerator/60Fe.reaction index 61ab4eed794683e53b3e93258a97ad08df14efc2..9c8bfee3eef6085c023c6c43d4c55989b093ac1a 100644 --- a/Inputs/EventGenerator/60Fe.reaction +++ b/Inputs/EventGenerator/60Fe.reaction @@ -2,27 +2,27 @@ %%%%%%%%% Reaction file for 60Fe(d,p)61Fe reaction %%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Beam - Particle= 60Fe - Energy= 540 - SigmaEnergy= 0 - SigmaX= 0 - SigmaY= 0 - SigmaThetaX= 0 - SigmaPhiY= 0 - MeanThetaX= 0 - MeanPhiY= 0 - MeanX= 0 - MeanY= 0 + Particle= 60Fe + Energy= 540 + SigmaEnergy= 0 + SigmaX= 0 + SigmaY= 0 + SigmaThetaX= 0 + SigmaPhiY= 0 + MeanThetaX= 0 + MeanPhiY= 0 + MeanX= 0 + MeanY= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 60Fe - Target= 2H - Light= 1H - Heavy= 61Fe - ExcitationEnergyHeavy= 4.0 - ExcitationEnergyLight= 0.0 - CrossSectionPath= CS_61dp_f.txt CS - ShootLight= 1 - ShootHeavy= 0 + Beam= 60Fe + Target= 2H + Light= 1H + Heavy= 61Fe + ExcitationEnergyHeavy= 4.0 + ExcitationEnergyLight= 0.0 + CrossSectionPath= flat.txt CS + ShootLight= 1 + ShootHeavy= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/EventGenerator/69Ni.reaction b/Inputs/EventGenerator/69Ni.reaction index 84fad85801ceb670ab07d91144daca1d24a89fba..1332ed09af4aca258a6a02802ca0155b5b797f00 100644 --- a/Inputs/EventGenerator/69Ni.reaction +++ b/Inputs/EventGenerator/69Ni.reaction @@ -6,9 +6,9 @@ Beam Energy= 1904 SigmaEnergy= 0 SigmaX= 1.5 - SigmaY= 1.5 - SigmaThetaX= 0.005 - SigmaPhiY= 0.005 + SigmaY= 1.5 + SigmaThetaX= 0.005 + SigmaPhiY= 0.005 MeanThetaX= 0 MeanPhiY= 0 MeanX= 0 @@ -17,14 +17,14 @@ Beam %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 68Ni - Target= 2H - Light= 1H - Heavy= 69Ni - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 2.0 - %CrossSectionPath= ./Data/CrossSection/ni69_d5_01.txt CS + Beam= 68Ni + Target= 2H + Light= 1H + Heavy= 69Ni + ExcitationEnergyLight= 0.0 + ExcitationEnergyHeavy= 2.0 + %CrossSectionPath= ./Data/CrossSection/ni69_d5_01.txt CS CrossSectionPath= flat.txt CS - ShootLight= 1 - ShootHeavy= 0 + ShootLight= 1 + ShootHeavy= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/EventGenerator/Angel.reaction b/Inputs/EventGenerator/Angel.reaction index 3ff0f666d38d29025d20b32551a073faac79bce1..841a9e865cbb55974d252b9cc4f6bfa4b45c15fd 100644 --- a/Inputs/EventGenerator/Angel.reaction +++ b/Inputs/EventGenerator/Angel.reaction @@ -4,19 +4,19 @@ %% Beam energy given in MeV ; Excitation in MeV ; SigmaXY in mm % SigmaThetaX/PhiY in deg Transfert - Beam= 5He - Target= 208Pb - Light= 5He - Heavy= 208Pb - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 0.0 - BeamEnergy= 22 - BeamEnergySpread= 10 - SigmaThetaX= 0 - SigmaPhiY= 0 - SigmaX= 0 - SigmaY= 0 - CrossSectionPath= flat.txt - ShootLight= 1 - ShootHeavy= 0 + Beam= 5He + Target= 208Pb + Light= 5He + Heavy= 208Pb + ExcitationEnergyLight= 0.0 + ExcitationEnergyHeavy= 0.0 + BeamEnergy= 22 + BeamEnergySpread= 10 + SigmaThetaX= 0 + SigmaPhiY= 0 + SigmaX= 0 + SigmaY= 0 + CrossSectionPath= flat.txt + ShootLight= 1 + ShootHeavy= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/EventGenerator/Example1.reaction b/Inputs/EventGenerator/Example1.reaction index 7e635ca2ebe10048e588f33d8501c5a696f6c57c..1b69a917b0a96e05b4c804ebb4f4362a8f2b75a9 100644 --- a/Inputs/EventGenerator/Example1.reaction +++ b/Inputs/EventGenerator/Example1.reaction @@ -2,37 +2,37 @@ %%%%%%%%% Reaction file for 11Li(d,3He)10He reaction %%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Beam - Particle= 11Li - Energy= 553 - SigmaEnergy= 20 - SigmaThetaX= 0.6138 - SigmaPhiY= 0.3812 - SigmaX= 6.216 - SigmaY= 6.109 - MeanThetaX= 0 - MeanPhiY= 0 - MeanX= 1.773 - MeanY= -0.1375 - %EnergyProfilePath= - %XThetaXProfilePath= - %YPhiYProfilePath= + Particle= 11Li + Energy= 553 MeV + SigmaEnergy= 20 MeV + SigmaThetaX= 0.6138 deg + SigmaPhiY= 0.3812 deg + SigmaX= 6.216 mm + SigmaY= 6.109 mm + MeanThetaX= 0 deg + MeanPhiY= 0 deg + MeanX= 1.773 mm + MeanY= -0.1375 mm + %EnergyProfilePath= + %XThetaXProfilePath= + %YPhiYProfilePath= %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 11Li - Target= 2H - Light= 3He - Heavy= 10He - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 1.4 - CrossSectionPath= 11Li(d,3He)10He.txt CS10He - ShootLight= 1 - ShootHeavy= 1 + Beam= 11Li + Target= 2H + Light= 3He + Heavy= 10He + ExcitationEnergy3= 0.0 MeV + ExcitationEnergy4= 1.4 MeV + CrossSectionPath= 11Li(d,3He)10He.txt CS10He + ShootLight= 1 + ShootHeavy= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ParticleDecay 10He - Daughter= 8He n n - ExcitationEnergy= 0 0 0 - shoot= 1 1 1 +%ParticleDecay 10He +% Daughter= 8He n n +% ExcitationEnergy= 0 0 0 MeV +% shoot= 1 1 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/EventGenerator/Example2.reaction b/Inputs/EventGenerator/Example2.reaction index 410e549c13b8cf47cf7c1cb8c0200db8f1e5be3b..63756e305039722aa60bd815226a3f1f128730dd 100644 --- a/Inputs/EventGenerator/Example2.reaction +++ b/Inputs/EventGenerator/Example2.reaction @@ -2,31 +2,31 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Beam Particle= 28Mg - ExcitationEnergy= 0 - Energy= 224 - SigmaEnergy= 0.448 - SigmaThetaX= 0.01 - SigmaPhiY= 0.01 - SigmaX= 0.5 - SigmaY= 0.5 - MeanThetaX= 0 - MeanPhiY= 0 - MeanX= 0 - MeanY= 0 + ExcitationEnergy= 0 MeV + Energy= 224 MeV + SigmaEnergy= 0.448 MeV + SigmaThetaX= 0.01 deg + SigmaPhiY= 0.01 deg + SigmaX= 0.5 mm + SigmaY= 0.5 mm + MeanThetaX= 0 deg + MeanPhiY= 0 deg + MeanX= 0 mm + MeanY= 0 mm %EnergyProfilePath= %XThetaXProfilePath= %YPhiYProfilePath= %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 28Mg - Target= 2H - Light= 1H - Heavy= 29Mg - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 0.0 + Beam= 28Mg + Target= 2H + Light= 1H + Heavy= 29Mg + ExcitationEnergyLight= 0.0 MeV + ExcitationEnergyHeavy= 0.0 MeV CrossSectionPath= flat.txt CSR - ShootLight= 1 - ShootHeavy= 1 + ShootLight= 1 + ShootHeavy= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/EventGenerator/alpha.source b/Inputs/EventGenerator/alpha.source index fced4f052b0cf41fdf67ec32541523ac38ac09e9..214253c1125949eb9c47cbfbb0bef7a76ddd7328 100644 --- a/Inputs/EventGenerator/alpha.source +++ b/Inputs/EventGenerator/alpha.source @@ -1,17 +1,17 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% An Isotropic Source to be used as EventGenerator %%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Energy are given in MeV , Position in mm % +% Energy are given in MeV , Position in mm % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Isotropic - EnergyLow= 0 - EnergyHigh= 850 - HalfOpenAngleMin= 0 - HalfOpenAngleMax= 10 - x0= 0 - y0= 0 - z0= 0 - Particle= alpha - ExcitationEnergy= 0 + EnergyLow= 0 MeV + EnergyHigh= 850 MeV + HalfOpenAngleMin= 0 deg + HalfOpenAngleMax= 10 deg + x0= 0 mm + y0= 0 mm + z0= 0 mm + Particle= alpha + ExcitationEnergy= 0 MeV % Supported particle type: proton, neutron, deuton, triton, He3 , alpha diff --git a/Inputs/EventGenerator/deuton.source b/Inputs/EventGenerator/deuton.source index 93e7c934e07f19aa129a5cb535fe0f6112392e28..4ab09fb2bc35167da5db890bb022637d7bbb7523 100644 --- a/Inputs/EventGenerator/deuton.source +++ b/Inputs/EventGenerator/deuton.source @@ -1,16 +1,16 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% An Isotropic Source to be used as EventGenerator %%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Energy are given in MeV , Position in mm % +% Energy are given in MeV , Position in mm % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Isotropic - EnergyLow= 0 - EnergyHigh= 300 - HalfOpenAngleMin= 0 - HalfOpenAngleMax= 10 - x0= 0 - y0= 0 - z0= 0 - particle= deuton + EnergyLow= 0 + EnergyHigh= 300 + HalfOpenAngleMin= 0 + HalfOpenAngleMax= 10 + x0= 0 + y0= 0 + z0= 0 + particle= deuton %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Supported particle type: proton, neutron, deuton, triton, He3 , alpha diff --git a/Inputs/EventGenerator/e569.reaction b/Inputs/EventGenerator/e569.reaction index de4defd9e40730d47c37afbbfa6861b9f40c84ed..b056a9dcc8a8097bfe18f931970e69f7077b523c 100644 --- a/Inputs/EventGenerator/e569.reaction +++ b/Inputs/EventGenerator/e569.reaction @@ -5,10 +5,10 @@ Beam Particle= 14O Energy= 252 SigmaEnergy= 0 - SigmaX= 2 - SigmaY= 1.5 - SigmaThetaX= 0 - SigmaPhiY= 0 + SigmaX= 2 + SigmaY= 1.5 + SigmaThetaX= 0 + SigmaPhiY= 0 MeanThetaX= 0 MeanPhiY= 0 MeanX= 0 @@ -17,15 +17,15 @@ Beam %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction - Beam= 14O - Target= 2H - Light= 3H - Heavy= 13O - ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 0.0 - %CrossSectionPath= ../Data/CrossSection/flat.txt CS + Beam= 14O + Target= 2H + Light= 3H + Heavy= 13O + ExcitationEnergyLight= 0.0 + ExcitationEnergyHeavy= 0.0 + %CrossSectionPath= ../Data/CrossSection/flat.txt CS CrossSectionPath= flat.txt CS - ShootLight= 1 - ShootHeavy= 0 + ShootLight= 1 + ShootHeavy= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/EventGenerator/gamma.source b/Inputs/EventGenerator/gamma.source index e4b78d00631dfda59982a08b929067641e2abd3a..618dee39d39cf2bdad81413653c20158aa22a5f1 100644 --- a/Inputs/EventGenerator/gamma.source +++ b/Inputs/EventGenerator/gamma.source @@ -1,16 +1,16 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% A "collimated" Source to be used as EventGenerator %%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Energy are given in MeV , Position in mm % +% Energy are given in MeV , Position in mm % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Isotropic - EnergyLow= 1. - EnergyHigh= 1. - HalfOpenAngleMin= 0 - HalfOpenAngleMax= 180 - x0= 0 - y0= 0 - z0= 0 - particle= gamma + EnergyLow= 1. + EnergyHigh= 1. + HalfOpenAngleMin= 0 + HalfOpenAngleMax= 180 + x0= 0 + y0= 0 + z0= 0 + particle= gamma %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Supported particle type: proton, neutron, deuton, triton, He3 , alpha diff --git a/Inputs/EventGenerator/isotropic.source b/Inputs/EventGenerator/isotropic.source index 359c73ddb2f208c51c15290297023911b3aa48cd..855f29bec9f1f9e0143e828efeb16ec3b1727ef2 100644 --- a/Inputs/EventGenerator/isotropic.source +++ b/Inputs/EventGenerator/isotropic.source @@ -1,16 +1,16 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% An Isotropic Source to be used as EventGenerator %%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Energy are given in MeV , Position in mm % +% Energy are given in MeV , Position in mm % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Isotropic - EnergyLow= 0.1 - EnergyHigh= 5. - HalfOpenAngleMin= 0 - HalfOpenAngleMax= 180 - x0= 0 - y0= 0 - z0= 0 - particle= alpha + EnergyLow= 0.1 + EnergyHigh= 5. + HalfOpenAngleMin= 0 + HalfOpenAngleMax= 180 + x0= 0 + y0= 0 + z0= 0 + particle= alpha %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Supported particle type: proton, neutron, deuton, triton, He3 , alpha diff --git a/Inputs/EventGenerator/np.source b/Inputs/EventGenerator/np.source index 0fc3b7342f98e48010358a8560e1fd6ef7932c3d..605b5b10815b42014ae705df7265a712ad225c29 100644 --- a/Inputs/EventGenerator/np.source +++ b/Inputs/EventGenerator/np.source @@ -1,17 +1,17 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% An Isotropic Source to be used as EventGenerator %%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Energy are given in MeV , Position in mm % +% Energy are given in MeV , Position in mm % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Isotropic - EnergyLow= 10 - EnergyHigh= 250 - HalfOpenAngleMin= 0 - HalfOpenAngleMax= 10 - x0= 0 - y0= 0 - z0= 0 - Multiplicity= 1 1 - Particle= neutron proton + EnergyLow= 10 MeV + EnergyHigh= 250 MeV + HalfOpenAngleMin= 0 deg + HalfOpenAngleMax= 10 deg + x0= 0 mm + y0= 0 mm + z0= 0 mm + Multiplicity= 1 1 + Particle= neutron proton %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Supported particle type: proton, neutron, deuton, triton, He3 , alpha diff --git a/Inputs/EventGenerator/proton.pbuu b/Inputs/EventGenerator/proton.pbuu index 62b7c81fbd8481838fd052f117fa9a08587fac24..57b4a3e78ef979771c997fff4fee8d04a394c971 100644 --- a/Inputs/EventGenerator/proton.pbuu +++ b/Inputs/EventGenerator/proton.pbuu @@ -1,15 +1,15 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% An Isotropic Source to be used as EventGenerator %%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Energy are given in MeV , Position in mm % +% Energy are given in MeV , Position in mm % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% In the TH2F histogram, angle ix X-axis and energy is Y-axis % +% In the TH2F histogram, angle ix X-axis and energy is Y-axis % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% pBUU - AngleEnergyHistPath= sn124sn124e50_flat_p.root h - x0= 0 - y0= 0 - z0= 0 - Particle= proton + AngleEnergyHistPath= sn124sn124e50_flat_p.root h + x0= 0 + y0= 0 + z0= 0 + Particle= proton %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Supported particle type: proton, neutron, deuton, triton, He3 , alpha diff --git a/Inputs/EventGenerator/proton.source b/Inputs/EventGenerator/proton.source index ec438c3191bc23fe876153f15690458689445577..e620c9beef98b6f85e4c249816239d2ffd1b3cd1 100644 --- a/Inputs/EventGenerator/proton.source +++ b/Inputs/EventGenerator/proton.source @@ -1,19 +1,19 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% An Isotropic Source to be used as EventGenerator %%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Energy are given in MeV , Position in mm % +% Energy are given in MeV , Position in mm % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Isotropic - EnergyLow= 0 - EnergyHigh= 160 + EnergyLow= 0 + EnergyHigh= 160 HalfOpenAngleMin= 0 - HalfOpenAngleMax= 180 - x0= 0 - y0= 0 - z0= 0 + HalfOpenAngleMax= 180 + x0= 0 + y0= 0 + z0= 0 SigmaX= 0 SigmaY= 0 Multiplicity= 1 - Particle= proton + Particle= proton %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Supported particle type: proton, neutron, deuton, triton, He3 , alpha diff --git a/Inputs/EventGenerator/triton.source b/Inputs/EventGenerator/triton.source index 950bc1053531be3e230b75c3ba8b982ca12d29b3..9e654b5b7b8d5c5a5afbeefc42837855dfa58c41 100644 --- a/Inputs/EventGenerator/triton.source +++ b/Inputs/EventGenerator/triton.source @@ -1,16 +1,16 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% An Isotropic Source to be used as EventGenerator %%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Energy are given in MeV , Position in mm % +% Energy are given in MeV , Position in mm % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Isotropic - EnergyLow= 0 - EnergyHigh= 350 - HalfOpenAngleMin= 0 - HalfOpenAngleMax= 10 - x0= 0 - y0= 0 - z0= 0 - particle= triton + EnergyLow= 0 + EnergyHigh= 350 + HalfOpenAngleMin= 0 + HalfOpenAngleMax= 10 + x0= 0 + y0= 0 + z0= 0 + particle= triton %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Supported particle type: proton, neutron, deuton, triton, He3 , alpha diff --git a/NPLib/CMakeLists.txt b/NPLib/CMakeLists.txt index 0d550ea6cb098fc4472dd68548b06e9a85798bb3..6aba8713fe3d72bf28656b43a4aafe54c9890c8a 100644 --- a/NPLib/CMakeLists.txt +++ b/NPLib/CMakeLists.txt @@ -12,9 +12,9 @@ include("ressources/CMake/NPTool_CMake_Preamble.cmake") # Major change in the Core/Physics (affecting the detector/analysis/simulation) set(NPLIB_VERSION_MAJOR 2) # Minor change in the Core/Physics (not affecting any other part) -set(NPLIB_VERSION_MINOR 1) +set(NPLIB_VERSION_MINOR 2) # Change any of the detector in NPA -set(NPLIB_VERSION_DETA 35) +set(NPLIB_VERSION_DETA 45) configure_file(Core/NPLibVersion.h.in Core/NPLibVersion.h @ONLY) set(DETLIST ${ETLIST}) diff --git a/NPLib/Core/CMakeLists.txt b/NPLib/Core/CMakeLists.txt index 9865e864bd23fc857164848a9b0a9d40d06d9da1..e5ef4df3709217bd4f734fe5ddeab98312e3d072 100644 --- a/NPLib/Core/CMakeLists.txt +++ b/NPLib/Core/CMakeLists.txt @@ -1,5 +1,5 @@ add_custom_command(OUTPUT TAsciiFileDict.cxx COMMAND ../scripts/build_dict.sh TAsciiFile.h TAsciiFileDict.cxx TAsciiFile.rootmap libNPCore.so) add_custom_command(OUTPUT NPVDetectorDict.cxx COMMAND ../scripts/build_dict.sh NPVDetector.h NPVDetectorDict.cxx NPVDetector.rootmap libNPCore.so NPCoreLinkdef.h) -add_library(NPCore SHARED NPVAnalysis.cxx NPAnalysisFactory.cxx NPCalibrationManager.cxx NPOptionManager.cxx RootOutput.cxx RootInput.cxx TAsciiFile.cxx TAsciiFileDict.cxx NPDetectorManager.cxx NPVDetector.cxx NPVDetectorDict.cxx NPVSpectra.cxx NPDetectorFactory.cxx NPSpectraServer.cxx ) +add_library(NPCore SHARED NPVAnalysis.cxx NPAnalysisFactory.cxx NPCalibrationManager.cxx NPOptionManager.cxx RootOutput.cxx RootInput.cxx TAsciiFile.cxx TAsciiFileDict.cxx NPDetectorManager.cxx NPVDetector.cxx NPVDetectorDict.cxx NPVSpectra.cxx NPDetectorFactory.cxx NPSpectraServer.cxx NPInputParser.cxx) target_link_libraries(NPCore ${ROOT_LIBRARIES}) -install(FILES NPVAnalysis.h NPAnalysisFactory.h NPCalibrationManager.h NPOptionManager.h RootInput.h RootOutput.h TAsciiFile.h NPDetectorManager.h NPVDetector.h NPGlobalSystemOfUnits.h NPPhysicalConstants.h NPSystemOfUnits.h NPVSpectra.h NPDetectorFactory.h NPSpectraServer.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) +install(FILES NPVAnalysis.h NPAnalysisFactory.h NPCalibrationManager.h NPOptionManager.h RootInput.h RootOutput.h TAsciiFile.h NPDetectorManager.h NPVDetector.h NPGlobalSystemOfUnits.h NPPhysicalConstants.h NPSystemOfUnits.h NPVSpectra.h NPDetectorFactory.h NPSpectraServer.h NPInputParser.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) diff --git a/NPLib/Core/NPDetectorFactory.h b/NPLib/Core/NPDetectorFactory.h index e6151cda4669a19224b25fb6fe4b23e76a1e1f79..fec4b91491e794fff9d17d790e0e9a209d3aa3ca 100644 --- a/NPLib/Core/NPDetectorFactory.h +++ b/NPLib/Core/NPDetectorFactory.h @@ -41,7 +41,7 @@ class DetectorFactory{ void ReadClassList(std::string FileList); void AddToken(std::string Token, std::string LibName); void AddDetector(std::string Token, ClassDetectorFactoryFn fn); - void CreateClassList(string FileName); + void CreateClassList(std::string FileName); private: static DetectorFactory* m_Instance; // Map that Match the Token with Constructor, once the lib is loaded diff --git a/NPLib/Core/NPDetectorManager.cxx b/NPLib/Core/NPDetectorManager.cxx index 015491e6e1fa4cd3f26f6b19fbd079203d33955f..1506250b03064c7afa10e3b0734ca41c542d4582 100644 --- a/NPLib/Core/NPDetectorManager.cxx +++ b/NPLib/Core/NPDetectorManager.cxx @@ -38,7 +38,9 @@ #include "RootInput.h" #include "NPOptionManager.h" #include "NPCalibrationManager.h" - +#include "NPInputParser.h" +#include "NPSystemOfUnits.h" +using namespace NPUNITS; //Root #include"TCanvas.h" ///////////////////////////////////////////////////////////////////////////////////////////////// @@ -85,159 +87,82 @@ void NPL::DetectorManager::ReadConfigurationFile(string Path) { NPL::DetectorFactory* theFactory = NPL::DetectorFactory::getInstance(); theFactory->ReadClassList(classlist); - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer,DataBuffer; set<string> check; - bool cGeneralTarget=false; - - if (ConfigFile.is_open()) { - cout << endl << "/////////// Detector geometry ///////////" << endl; - cout << "Configuration file " << Path << " loading " << endl; + NPL::InputParser parser(Path); + + //////////////////////////////////////////// + //////////// Search for Target ///////////// + //////////////////////////////////////////// + vector<NPL::InputBlock*> starget = parser.GetAllBlocksWithToken("Target"); + vector<NPL::InputBlock*> ctarget = parser.GetAllBlocksWithToken("CryoTarget"); + + if(starget.size()==1){ + if(NPOptionManager::getInstance()->GetVerboseLevel()){ + cout << "//// TARGET ////" << endl; + cout << "//// Solid Target found " << endl; + } + vector<string> token = {"Thickness","Radius","Material","Angle","X","Y","Z"}; + if(starget[0]->HasTokenList(token)){ + m_TargetThickness= starget[0]->GetDouble("Thickness","micrometer"); + m_TargetAngle=starget[0]->GetDouble("Angle","deg"); + m_TargetMaterial=starget[0]->GetString("Material"); + m_TargetX=starget[0]->GetDouble("X","mm"); + m_TargetY=starget[0]->GetDouble("Y","mm"); + m_TargetZ=starget[0]->GetDouble("Z","mm"); + } + else{ + cout << "ERROR: Target token list incomplete, check your input file" << endl; + exit(1); + } } - - while (!ConfigFile.eof()) { - // Pick-up next line - getline(ConfigFile, LineBuffer); - //Search for comment Symbol: % - if (LineBuffer.compare(0, 1, "%") == 0) { ;} - //////////////////////////////////////////// - //////////// Search for Target ///////////// - //////////////////////////////////////////// - - else if (LineBuffer.compare(0, 13, "GeneralTarget") == 0 && cGeneralTarget == false) { - cGeneralTarget = true ; - cout << "////////// Target ///////////" << endl; - - // jump one line - getline(ConfigFile, LineBuffer); - getline(ConfigFile, LineBuffer); - - bool check_Thickness = false; - // bool check_Angle = false; - bool check_Radius = false; - bool check_Material = false; - bool check_X = false; - bool check_Y = false; - bool check_Z = false; - bool check_WinMaterial = false; - bool check_WinThickness = false ; - - bool ReadingStatusTarget = true; - while (ReadingStatusTarget) { - ConfigFile >> DataBuffer; - // Search for comment Symbol % - if (DataBuffer.compare(0, 1, "%") == 0) {ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );getline(ConfigFile, LineBuffer);} - - else if (DataBuffer.compare(0, 10, "THICKNESS=") == 0) { - check_Thickness = true ; - ConfigFile >> DataBuffer; - m_TargetThickness = atof(DataBuffer.c_str()); - cout << "Target Thickness: " << m_TargetThickness << endl; - } - - else if (DataBuffer.compare(0, 6, "ANGLE=") == 0) { - ConfigFile >> DataBuffer; - m_TargetAngle = atof(DataBuffer.c_str()); - cout << "Target Angle: " << m_TargetAngle << endl; - } - - else if (DataBuffer.compare(0, 7, "RADIUS=") == 0) { - check_Radius = true ; - ConfigFile >> DataBuffer; - m_TargetRadius = atof(DataBuffer.c_str()); - cout << "Target Radius: " << m_TargetRadius << endl; - } - - else if (DataBuffer.compare(0, 9, "MATERIAL=") == 0) { - check_Material = true ; - ConfigFile >> DataBuffer; - m_TargetMaterial = DataBuffer; - cout << "Target Material: " << m_TargetMaterial << endl; - } - - else if (DataBuffer.compare(0, 17, "DENSITY=") == 0) { - ConfigFile >> DataBuffer; - /* Do Nothing */ - } - - - else if (DataBuffer.compare(0, 17, "WINDOWSTHICKNESS=") == 0) { - check_WinThickness = true ; - ConfigFile >> DataBuffer; - m_WindowsThickness = atof(DataBuffer.c_str()); - cout << "Windows Thickness: " - << m_WindowsThickness << " um" << endl ; - } - - else if (DataBuffer.compare(0, 16, "WINDOWSMATERIAL=") == 0) { - check_WinMaterial = true ; - ConfigFile >> DataBuffer; - m_WindowsMaterial = DataBuffer; - cout << "Windows Material: " << m_WindowsMaterial << endl; - } - - else if (DataBuffer.compare(0, 2, "X=") == 0) { - check_X = true ; - ConfigFile >> DataBuffer; - m_TargetX = atoi(DataBuffer.c_str()); - cout << "Target Coordinates (mm): ( " << m_TargetX << " ; "; - } - - else if (DataBuffer.compare(0, 2, "Y=") == 0) { - check_Y = true ; - ConfigFile >> DataBuffer; - m_TargetY = atoi(DataBuffer.c_str()); - cout << m_TargetY << " ; "; - } - - else if (DataBuffer.compare(0, 2, "Z=") == 0) { - check_Z = true ; - ConfigFile >> DataBuffer; - m_TargetZ = atoi(DataBuffer.c_str()); - cout << m_TargetZ << " )" << endl; - } - - /////////////////////////////////////////////////// - // If no Target Token and no comments, toggle out - else { - ReadingStatusTarget = false; - cout << "WARNING : Wrong Token Sequence: Getting out " << endl; - } - - /////////////////////////////////////////////////// - // If all Token found toggle out - if (check_Thickness && check_Radius && check_Material && check_X && check_Y && check_Z) - ReadingStatusTarget = false; - - } + else if(ctarget.size()==1){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// Cryogenic Target found " << endl; + + vector<string> token = {"Thickness","Radius","Material","Density","WindowsThickness","WindowsMaterial","Angle","X","Y","Z"}; + if(ctarget[0]->HasTokenList(token)){ + m_TargetThickness= ctarget[0]->GetDouble("Thickness","micrometer"); + m_TargetAngle=ctarget[0]->GetDouble("Angle","deg"); + m_TargetMaterial=ctarget[0]->GetString("Material"); + m_WindowsThickness=ctarget[0]->GetDouble("WindowsThickness","micrometer"); + m_WindowsMaterial=ctarget[0]->GetString("WindowsMaterial"); + m_TargetX=ctarget[0]->GetDouble("X","mm"); + m_TargetY=ctarget[0]->GetDouble("Y","mm"); + m_TargetZ =ctarget[0]->GetDouble("Z","mm"); } - - /////////////////////////////////////////// - /////////// Search for Detectors /////////// - //////////////////////////////////////////// else{ - istringstream oss(LineBuffer); - string token; - oss >> token ; - VDetector* detector = theFactory->Construct(token); - if(detector!=NULL && check.find(token)==check.end()){ - cout << "/////////////////////////////////////////" << endl; - cout << "//// Adding Detector " << token << endl; - detector->ReadConfiguration(Path); - cout << "/////////////////////////////////////////" << endl; - // Add array to the VDetector Vector - AddDetector(token, detector); - check.insert(token); - } - else if(detector!=NULL) - delete detector; + cout << "ERROR: Target token list incomplete, check your input file" << endl; + exit(1); } - } - cout << "\033[0m" ; - - ConfigFile.close(); + } + else{ + cout << "ERROR: One and only one target shall be declared in your detector file" << endl; + } + //////////////////////////////////////////// + /////////// Search for Detectors /////////// + //////////////////////////////////////////// + // Get the list of main token + std::vector<std::string> token = parser.GetAllBlocksToken(); + // Look for detectors among them + for(unsigned int i = 0 ; i < token.size() ; i++){ + VDetector* detector = theFactory->Construct(token[i]); + if(detector!=NULL && check.find(token[i])==check.end()){ + if(NPOptionManager::getInstance()->GetVerboseLevel()){ + cout << "/////////////////////////////////////////" << endl; + cout << "//// Adding Detector " << token[i] << endl; + } + detector->ReadConfiguration(parser); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "/////////////////////////////////////////" << endl; + + // Add array to the VDetector Vector + AddDetector(token[i], detector); + check.insert(token[i]); + } + else if(detector!=NULL) + delete detector; + } // Now That the detector lib are loaded, we can instantiate the root input string runToReadfileName = NPOptionManager::getInstance()->GetRunToReadFile(); RootInput::getInstance(runToReadfileName); @@ -277,7 +202,7 @@ void NPL::DetectorManager::BuildPhysicalEvent(){ m_CV.notify_all(); while(!IsDone()){ - // this_thread::yield(); + // this_thread::yield(); } #else @@ -442,7 +367,7 @@ void NPL::DetectorManager::StartThread(NPL::VDetector* det,unsigned int id){ while(!m_Ready[id]){ m_CV.wait(lk); } - + // Do the job (det->*m_ClearEventPhysicsPtr)(); (det->*m_BuildPhysicalPtr)(); diff --git a/NPLib/Core/NPInputParser.cxx b/NPLib/Core/NPInputParser.cxx new file mode 100644 index 0000000000000000000000000000000000000000..1a8f1070fd1882b92f978b7a7f45033c70eab7a8 --- /dev/null +++ b/NPLib/Core/NPInputParser.cxx @@ -0,0 +1,831 @@ +#include"NPInputParser.h" +using namespace NPL; +#include"NPSystemOfUnits.h" +#include"NPOptionManager.h" + +#include<sstream> +#include<iostream> +#include<fstream> +#include<algorithm> + +//////////////////////////////////////////////////////////////////////////////// +std::string NPL::StripSpaces(std::string line){ + // Remove preceding spaces + while(line.front()==' ') + line = line.substr(1,line.length()); + + // Remove trailing spaces + if(line.length()>0) + while(line.back()==' ') + line = line.substr(0,line.length()-1); + return line; + +} +//////////////////////////////////////////////////////////////////////////////// +unsigned int NPL::GetLevel(std::string line){ + unsigned int level = 0 ; + if(line.length()==0) + return 1000; + + for(unsigned int i = 0 ; i < line.length() ; i++){ + if(line.compare(i,1," ")==0) + level++; + else + break; + } + + return level; +} + +//////////////////////////////////////////////////////////////////////////////// +std::string NPL::ToLower(std::string line){ + std::transform(line.begin(), line.end(), line.begin(), ::tolower); + return line; +} + +//////////////////////////////////////////////////////////////////////////////// +InputBlock::InputBlock(std::string line){ + m_Level = GetLevel(line); + m_MainToken = StripSpaces(ExtractToken(line," ")); + m_MainValue = StripSpaces(ExtractValue(line," ")); +} + +//////////////////////////////////////////////////////////////////////////////// +std::string InputBlock::ExtractToken(std::string line,std::string separator){ + // Find the separator + if(separator=="") + separator = NPL::token_separator; + std::size_t pos = line.find(separator.c_str()); + return line.substr (0,pos); +} + +//////////////////////////////////////////////////////////////////////////////// +std::string InputBlock::ExtractValue(std::string line,std::string separator){ + // Find the separator + if(separator=="") + separator = NPL::token_separator; + std::size_t pos = line.find(separator.c_str()); + if(pos!=std::string::npos) + return line.substr (pos+1); + else + return ""; +} + +//////////////////////////////////////////////////////////////////////////////// +void InputBlock::AddLine(std::string line){ + m_Token.push_back(ToLower(StripSpaces(ExtractToken(line)))); + m_Value.push_back(StripSpaces(ExtractValue(line))); +} +//////////////////////////////////////////////////////////////////////////////// +void InputBlock::Dump(){ + std::cout << "//////////// Block ////////////" << std::endl; + std::cout << " * Main Token: " << m_MainToken << std::endl ; + std::cout << " * Main Value: " << m_MainValue << std::endl; + std::cout << " * Number of Line: " << GetSize() << std::endl; + for(unsigned int i = 0 ; i < GetSize() ; i++) + std::cout << " - " << i+1 << " " << m_Token[i] << ": " << m_Value[i] << std::endl; +} +//////////////////////////////////////////////////////////////////////////////// +bool InputBlock::HasTokenList(std::vector<std::string> Token){ + if(m_Token.size()==0) + return false; + + bool res = true; + for(unsigned int i = 0 ; i < Token.size() ; i++) + res = res && HasToken(Token[i]); + + return res; +} + +//////////////////////////////////////////////////////////////////////////////// +bool InputBlock::HasToken(std::string Token){ + for(unsigned int i = 0 ; i < m_Token.size() ; i++){ + if(m_Token[i] == ToLower(Token)){ + return true; + } + } + return false; +} +//////////////////////////////////////////////////////////////////////////////// +std::string InputBlock::GetValue(std::string Token){ + for(unsigned int i = 0 ; i < m_Token.size() ; i++){ + if(m_Token[i]==ToLower(Token)) + return m_Value[i]; + } + return ""; + +} +//////////////////////////////////////////////////////////////////////////////// +double InputBlock::GetDouble(std::string Token,std::string default_unit){ + int verbose = NPOptionManager::getInstance()->GetVerboseLevel(); + std::stringstream iss(GetValue(Token)); + double val; + std::string unit; + iss >> val >> unit ; + if(unit==""){ + if(default_unit!="void") + std::cout <<"WARNING: Using default units for token " << Token << std::endl; + val = ApplyUnit(val,default_unit); + } + else{ + val = ApplyUnit(val,unit); + } + + if(verbose) + cout << " " << Token << " (" <<default_unit << "): " << val/ApplyUnit(1,default_unit) << endl; + + return val; +} +//////////////////////////////////////////////////////////////////////////////// +int InputBlock::GetInt(std::string Token){ + int verbose = NPOptionManager::getInstance()->GetVerboseLevel(); + std::stringstream iss(GetValue(Token)); + int val; + iss >> val ; + + if(verbose) + cout << " " << Token << ": " << val << endl; + + + return val; +} +//////////////////////////////////////////////////////////////////////////////// +std::string InputBlock::GetString(std::string Token){ + int verbose = NPOptionManager::getInstance()->GetVerboseLevel(); + if(verbose) + cout << " " << Token << ": " << GetValue(Token) << endl; + + return GetValue(Token); +} +//////////////////////////////////////////////////////////////////////////////// +TVector3 InputBlock::GetTVector3(std::string Token,std::string default_unit){ + int verbose = NPOptionManager::getInstance()->GetVerboseLevel(); + std::stringstream iss(GetValue(Token)); + + double x,y,z; + std::string unit; + iss >> x >> y >> z >> unit ; + if(unit==""){ + if(default_unit!="void") + std::cout <<"WARNING: Using default units for token " << Token << std::endl; + x = ApplyUnit(x,default_unit); + y = ApplyUnit(y,default_unit); + z = ApplyUnit(z,default_unit); + } + else{ + x = ApplyUnit(x,unit); + y = ApplyUnit(y,unit); + z = ApplyUnit(z,unit); + } + + if(verbose) + cout << " " << Token << " (" <<default_unit << "): (" + << x/ApplyUnit(1,default_unit) << " ; " + << y/ApplyUnit(1,default_unit) << " ; " + << z/ApplyUnit(1,default_unit) << ")" << endl; + + + return TVector3(x,y,z); +} +//////////////////////////////////////////////////////////////////////////////// +std::vector<std::string> InputBlock::GetVectorString(std::string Token){ + int verbose = NPOptionManager::getInstance()->GetVerboseLevel(); + + std::stringstream iss(GetValue(Token)); + + std::vector<std::string> val; + std::string buffer; + while(iss>>buffer) + val.push_back(buffer); + + + if(verbose){ + cout << " " << Token << ": "; + for(unsigned int i = 0 ; i < val.size() ; i++) + cout << val[i] << " " ; + cout << endl; + } + return val; +} + +//////////////////////////////////////////////////////////////////////////////// +std::vector<double> InputBlock::GetVectorDouble(std::string Token,std::string default_unit){ + int verbose = NPOptionManager::getInstance()->GetVerboseLevel(); + + std::stringstream iss(GetValue(Token)); + + std::vector<double> val; + double buffer; + while(iss>>buffer) + val.push_back(buffer); + + // Try to read the unit + iss.clear(); + std::string unit; + iss>>unit; + + if(unit==""){ + if(default_unit!="void") + std::cout <<"WARNING: Using default units for token " << Token << std::endl; + for(unsigned int i = 0 ; i < val.size() ; i++) + val[i]=ApplyUnit(val[i],default_unit); + } + else{ + for(unsigned int i = 0 ; i < val.size() ; i++) + val[i]=ApplyUnit(val[i],unit); + } + + if(verbose){ + cout << " " << Token << " (" << default_unit << "): "; + for(unsigned int i = 0 ; i < val.size() ; i++) + cout << val[i]/ApplyUnit(1,default_unit) << " " ; + cout << endl; + } + +return val; +} + +//////////////////////////////////////////////////////////////////////////////// +std::vector<int> InputBlock::GetVectorInt(std::string Token){ + int verbose = NPOptionManager::getInstance()->GetVerboseLevel(); + + std::stringstream iss(GetValue(Token)); + std::vector<int> val; + int buffer; + while(iss>>buffer) + val.push_back(buffer); + + if(verbose){ + cout << " " << Token << ": "; + for(unsigned int i = 0 ; i < val.size() ; i++) + cout << val[i] << " " ; + cout << endl; + } + + + return val; +} + +//////////////////////////////////////////////////////////////////////////////// +std::vector<NPL::InputBlock*> InputBlock::GetSubBlock(std::string Token){ + std::vector<NPL::InputBlock*> blocks; + for(unsigned int i = 0 ; i < m_SubBlock.size() ; i++){ + if(Token == m_SubBlock[i]->GetMainToken()) + blocks.push_back(m_SubBlock[i]); + } + return blocks; +} + + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +void InputParser::Dump(){ + for(unsigned int i = 0 ; i < m_Block.size() ; i++) + m_Block[i]->Dump(); +} +//////////////////////////////////////////////////////////////////////////////// +bool InputParser::IsNotComment(std::string line){ + line = StripSpaces(line); + if(line.length()==0) + return false; + + std::size_t pos = line.find("%"); + if(pos==std::string::npos) + return true; + else + return false; +} + +//////////////////////////////////////////////////////////////////////////////// +std::vector<InputBlock*> InputParser::GetAllBlocksWithToken(std::string Token){ + std::vector<InputBlock*> res; + for(unsigned int i = 0 ; i < m_Block.size(); i++){ + if(m_Block[i]->GetMainToken() == Token){ + res.push_back(m_Block[i]); + } + } + + return res; + +} +//////////////////////////////////////////////////////////////////////////////// +std::vector<InputBlock*> InputParser::GetAllBlocksWithTokenAndValue(std::string Token,std::string Value){ + std::vector<InputBlock*> res; + for(unsigned int i = 0 ; i < m_Block.size(); i++){ + if(m_Block[i]->GetMainToken() == Token){ + if(m_Block[i]->GetMainValue() == Value) + res.push_back(m_Block[i]); + } + } + + return res; +} + +//////////////////////////////////////////////////////////////////////////////// +std::vector<std::string> InputParser::GetAllBlocksToken(){ + std::vector<std::string> token; + for(unsigned int i = 0 ; i < m_Block.size() ; i++) + token.push_back(m_Block[i]->GetMainToken()); + + return token; +} + +//////////////////////////////////////////////////////////////////////////////// +void InputParser::ReadFile(std::string filename){ + std::ifstream file(filename.c_str()); + if(!file.is_open()){ + std::cout <<"ERROR : file " << filename << " not found " << std::endl; + exit(1); + } + + std::string line; + InputBlock* block = 0; + while(!file.eof()){ + getline(file,line); + if(IsNotComment(line) && GetLevel(line)==0) { + if(block) + m_Block.push_back(block); + + block = new InputBlock(line); + if(!file.eof()) + getline(file,line); + } + if(block && IsNotComment(line)){ + block->AddLine(line); + } + } + // Add the last block + if(block) + m_Block.push_back(block); +} +//////////////////////////////////////////////////////////////////////////////// +double NPL::ApplyUnit(double value, std::string unit){ + if(unit=="void") // apply no unit + return value; + + else if(unit=="millimeter"){ + return value*NPUNITS::millimeter; + } + + else if(unit=="millimeter2"){ + return value*NPUNITS::millimeter2; + } + + else if(unit=="millimeter3"){ + return value*NPUNITS::millimeter3; + } + + else if(unit=="centimeter"){ + return value*NPUNITS::centimeter; + } + + else if(unit=="centimeter2"){ + return value*NPUNITS::centimeter2; + } + + else if(unit=="centimeter3"){ + return value*NPUNITS::centimeter3; + } + + else if(unit=="meter"){ + return value*NPUNITS::meter; + } + + else if(unit=="meter2"){ + return value*NPUNITS::meter2; + } + + else if(unit=="meter3"){ + return value*NPUNITS::meter3; + } + + else if(unit=="kilometer"){ + return value*NPUNITS::kilometer; + } + + else if(unit=="kilometer2"){ + return value*NPUNITS::kilometer2; + } + + else if(unit=="kilometer3"){ + return value*NPUNITS::kilometer3; + } + + else if(unit=="parsec"){ + return value*NPUNITS::parsec; + } + + else if(unit=="micrometer"){ + return value*NPUNITS::micrometer; + } + + else if(unit=="nanometer"){ + return value*NPUNITS::nanometer; + } + + else if(unit=="angstrom"){ + return value*NPUNITS::angstrom; + } + + else if(unit=="fermi"){ + return value*NPUNITS::fermi; + } + + else if(unit=="barn"){ + return value*NPUNITS::barn; + } + + else if(unit=="millibarn"){ + return value*NPUNITS::millibarn; + } + + else if(unit=="microbarn"){ + return value*NPUNITS::microbarn; + } + + else if(unit=="nanobarn"){ + return value*NPUNITS::nanobarn; + } + + else if(unit=="picobarn"){ + return value*NPUNITS::picobarn; + } + + else if(unit=="mm"){ + return value*NPUNITS::mm; + } + + else if(unit=="um"){ + return value*NPUNITS::um; + } + + else if(unit=="nm"){ + return value*NPUNITS::nm; + } + + else if(unit=="mm2"){ + return value*NPUNITS::mm2; + } + + else if(unit=="mm3"){ + return value*NPUNITS::mm3; + } + + else if(unit=="cm"){ + return value*NPUNITS::cm; + } + + else if(unit=="cm2"){ + return value*NPUNITS::cm2; + } + + else if(unit=="cm3"){ + return value*NPUNITS::cm3; + } + + else if(unit=="m"){ + return value*NPUNITS::m; + } + + else if(unit=="m2"){ + return value*NPUNITS::m2; + } + + else if(unit=="m3"){ + return value*NPUNITS::m3; + } + + else if(unit=="km"){ + return value*NPUNITS::km; + } + + else if(unit=="km2"){ + return value*NPUNITS::km2; + } + + else if(unit=="km3"){ + return value*NPUNITS::km3; + } + + else if(unit=="pc"){ + return value*NPUNITS::pc; + } + + else if(unit=="radian"){ + return value*NPUNITS::radian; + } + + else if(unit=="milliradian"){ + return value*NPUNITS::milliradian; + } + + else if(unit=="degree"){ + return value*NPUNITS::degree; + } + + else if(unit=="steradian"){ + return value*NPUNITS::steradian; + } + + else if(unit=="rad"){ + return value*NPUNITS::rad; + } + + else if(unit=="mrad"){ + return value*NPUNITS::mrad; + } + + else if(unit=="sr"){ + return value*NPUNITS::sr; + } + + else if(unit=="deg"){ + return value*NPUNITS::deg; + } + + else if(unit=="nanosecond"){ + return value*NPUNITS::nanosecond; + } + + else if(unit=="second"){ + return value*NPUNITS::second; + } + + else if(unit=="millisecond"){ + return value*NPUNITS::millisecond; + } + + else if(unit=="microsecond"){ + return value*NPUNITS::microsecond; + } + + else if(unit=="picosecond"){ + return value*NPUNITS::picosecond; + } + + else if(unit=="hertz"){ + return value*NPUNITS::hertz; + } + + else if(unit=="kilohertz"){ + return value*NPUNITS::kilohertz; + } + + else if(unit=="megahertz"){ + return value*NPUNITS::megahertz; + } + + else if(unit=="ns"){ + return value*NPUNITS::ns; + } + + else if(unit=="s"){ + return value*NPUNITS::s; + } + + else if(unit=="ms"){ + return value*NPUNITS::ms; + } + + else if(unit=="eplus"){ + return value*NPUNITS::eplus; + } + + else if(unit=="e_SI"){ + return value*NPUNITS::e_SI; + } + + else if(unit=="coulomb"){ + return value*NPUNITS::coulomb; + } + + else if(unit=="megaelectron"){ + return value*NPUNITS::megaelectronvolt; + } + + else if(unit=="electronvolt"){ + return value*NPUNITS::electronvolt; + } + + else if(unit=="kiloelectron"){ + return value*NPUNITS::kiloelectronvolt; + } + + else if(unit=="gigaelectron"){ + return value*NPUNITS::gigaelectronvolt; + } + + else if(unit=="teraelectron"){ + return value*NPUNITS::teraelectronvolt; + } + + else if(unit=="petaelectron"){ + return value*NPUNITS::petaelectronvolt; + } + + else if(unit=="joule"){ + return value*NPUNITS::joule; + } + + else if(unit=="MeV"){ + return value*NPUNITS::MeV; + } + + else if(unit=="eV"){ + return value*NPUNITS::eV; + } + + else if(unit=="keV"){ + return value*NPUNITS::keV; + } + + else if(unit=="GeV"){ + return value*NPUNITS::GeV; + } + + else if(unit=="TeV"){ + return value*NPUNITS::TeV; + } + + else if(unit=="PeV"){ + return value*NPUNITS::PeV; + } + + else if(unit=="kilogram"){ + return value*NPUNITS::kilogram; + } + + else if(unit=="gram"){ + return value*NPUNITS::gram; + } + + else if(unit=="milligram"){ + return value*NPUNITS::milligram; + } + + else if(unit=="kg"){ + return value*NPUNITS::kg; + } + + else if(unit=="g"){ + return value*NPUNITS::g; + } + + else if(unit=="mg"){ + return value*NPUNITS::mg; + } + + else if(unit=="watt"){ + return value*NPUNITS::watt; + } + + else if(unit=="newton"){ + return value*NPUNITS::newton; + } + + else if(unit=="hep_pascal"){ + return value*NPUNITS::hep_pascal; + } + + else if(unit=="bar"){ + return value*NPUNITS::bar; + } + + else if(unit=="atmosphere"){ + return value*NPUNITS::atmosphere; + } + + else if(unit=="ampere"){ + return value*NPUNITS::ampere; + } + + else if(unit=="milliampere"){ + return value*NPUNITS::milliampere; + } + + else if(unit=="microampere"){ + return value*NPUNITS::microampere; + } + + else if(unit=="nanoampere"){ + return value*NPUNITS::nanoampere; + } + + else if(unit=="megavolt"){ + return value*NPUNITS::megavolt; + } + + else if(unit=="kilovolt"){ + return value*NPUNITS::kilovolt; + } + + else if(unit=="volt"){ + return value*NPUNITS::volt; + } + + else if(unit=="ohm"){ + return value*NPUNITS::ohm; + } + + else if(unit=="farad"){ + return value*NPUNITS::farad; + } + + else if(unit=="millifarad"){ + return value*NPUNITS::millifarad; + } + + else if(unit=="microfarad"){ + return value*NPUNITS::microfarad; + } + + else if(unit=="nanofarad"){ + return value*NPUNITS::nanofarad; + } + + else if(unit=="picofarad"){ + return value*NPUNITS::picofarad; + } + + else if(unit=="weber"){ + return value*NPUNITS::weber; + } + + else if(unit=="tesla" || unit=="T"){ + return value*NPUNITS::tesla; + } + + else if(unit=="gauss"){ + return value*NPUNITS::gauss; + } + + else if(unit=="kilogauss"){ + return value*NPUNITS::kilogauss; + } + + else if(unit=="henry"){ + return value*NPUNITS::henry; + } + + else if(unit=="kelvin"){ + return value*NPUNITS::kelvin; + } + + else if(unit=="mole"){ + return value*NPUNITS::mole; + } + + else if(unit=="becquerel"){ + return value*NPUNITS::becquerel; + } + + else if(unit=="curie"){ + return value*NPUNITS::curie; + } + + else if(unit=="gray"){ + return value*NPUNITS::gray; + } + + else if(unit=="kilogray"){ + return value*NPUNITS::kilogray; + } + + else if(unit=="milligray"){ + return value*NPUNITS::milligray; + } + + else if(unit=="microgray"){ + return value*NPUNITS::microgray; + } + + else if(unit=="candela"){ + return value*NPUNITS::candela; + } + + else if(unit=="lumen"){ + return value*NPUNITS::lumen; + } + + else if(unit=="lux"){ + return value*NPUNITS::lux; + } + + else if(unit=="perCent"){ + return value*NPUNITS::perCent; + } + + else if(unit=="perThousand"){ + return value*NPUNITS::perThousand; + } + + else if(unit=="perMillion"){ + return value*NPUNITS::perMillion; + } + + else{ + std::cout << "WARNING: Unknown unit " << unit << std::endl; + return value; + } +} diff --git a/NPLib/Core/NPInputParser.h b/NPLib/Core/NPInputParser.h new file mode 100644 index 0000000000000000000000000000000000000000..946f4b46e7a2288da011e6759413246d2a761c84 --- /dev/null +++ b/NPLib/Core/NPInputParser.h @@ -0,0 +1,92 @@ +#ifndef NPINPUTPARSER +#define NPINPUTPARSER + +// STL +#include<string> +#include<vector> + +// ROOT +#include"TVector3.h" + + +namespace NPL{ + + static std::string token_separator = "="; + std::string StripSpaces(std::string line); + std::string ToLower(std::string line); + double ApplyUnit(double value, std::string unit); + unsigned int GetLevel(std::string line); + + class InputBlock{ + public: + InputBlock(std::string line); + ~InputBlock(){}; + + private: + unsigned int m_Level; + std::string m_MainToken; + std::string m_MainValue; + std::vector<std::string> m_Token; + std::vector<std::string> m_Value; + std::vector<NPL::InputBlock*> m_SubBlock; + + public: + void AddLine(std::string line); + std::string ExtractToken(std::string line,std::string separator=""); + std::string ExtractValue(std::string line,std::string separator=""); + + public: + std::string GetToken(unsigned int i){return m_Token[i];}; + std::string GetValue(unsigned int i){return m_Value[i];}; + std::string GetValue(std::string Token); + + public: + bool HasTokenList(std::vector<std::string> TokenList); + bool HasToken(std::string Token); + + public: + std::string GetMainToken(){return m_MainToken;}; + std::string GetMainValue(){return m_MainValue;}; + + unsigned int GetSize(){return m_Token.size();}; + double GetDouble(std::string Token,std::string default_unit); + int GetInt(std::string Token); + std::string GetString(std::string Token); + TVector3 GetTVector3(std::string Token,std::string default_unit); + std::vector<double> GetVectorDouble(std::string Token,std::string default_unit); + std::vector<int> GetVectorInt(std::string Token); + std::vector<std::string> GetVectorString(std::string Token); + std::vector<NPL::InputBlock*> GetSubBlock(std::string Token); + + public: + void Dump(); + }; + //////////////////////////////////////////////////////////////////////////////// + class InputParser{ + public: + InputParser(){}; + InputParser(std::string filename) {ReadFile(filename);} + ~InputParser(){}; + + private: + std::vector<InputBlock*> m_Block; + + private: + int m_verbose; + + public: + void ReadFile(std::string filename); + void Dump(); + void Print() {Dump();} + std::vector<InputBlock*> GetAllBlocksWithToken(std::string Token); + std::vector<InputBlock*> GetAllBlocksWithTokenAndValue(std::string Token,std::string Value); + + std::vector<std::string> GetAllBlocksToken(); + + + private: + bool IsNotComment(std::string line); + }; +} + +#endif diff --git a/NPLib/Core/NPVDetector.h b/NPLib/Core/NPVDetector.h index a79f34a1bb3d794cd1b7b200fa9666554090a711..af1efcab019fb78a5f00367bb8a1f84def21c30f 100644 --- a/NPLib/Core/NPVDetector.h +++ b/NPLib/Core/NPVDetector.h @@ -26,14 +26,16 @@ * Adding Fill Spectra Method to fill control Histogramm * *****************************************************************************/ -// ROOT headers +// ROOT #include "TH1.h" #include "TCanvas.h" -// STL header +// STL #include <string> #include <vector> #include <map> -using namespace std; + +// NPL +#include "NPInputParser.h" namespace NPL { std::string itoa(const int&); @@ -46,7 +48,7 @@ namespace NPL { virtual ~VDetector() ; // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - virtual void ReadConfiguration(string) {} ; + virtual void ReadConfiguration(NPL::InputParser) {} ; // Add Parameter to the CalibrationManger virtual void AddParameterToCalibrationManager() {} ; @@ -86,9 +88,9 @@ namespace NPL { // Used for Online only, clear all the spectra hold by the Spectra class virtual void ClearSpectra() {}; // Used for Online only, get all the spectra hold by the Spectra class - virtual map< string , TH1*> GetSpectra() {map< string, TH1* > x; return x;}; + virtual std::map< std::string , TH1*> GetSpectra() {std::map< std::string, TH1* > x; return x;}; // Used for Online only, get all the canvases - virtual vector<TCanvas*> GetCanvas(){vector<TCanvas*> x ; return x;}; + virtual std::vector<TCanvas*> GetCanvas(){std::vector<TCanvas*> x ; return x;}; private: // The list below is here to help you building your own detector /* diff --git a/NPLib/Detectors/AGATA/TAGATAPhysics.cxx b/NPLib/Detectors/AGATA/TAGATAPhysics.cxx index db2e1aa679ee957e180f8ac45226103f08122033..82c1fab4af52e48cdb2cf45c69f55bb20f020f96 100644 --- a/NPLib/Detectors/AGATA/TAGATAPhysics.cxx +++ b/NPLib/Detectors/AGATA/TAGATAPhysics.cxx @@ -34,7 +34,7 @@ using namespace std; #include "RootInput.h" #include "RootOutput.h" #include "NPDetectorFactory.h" - +#include "NPOptionManager.h" // ROOT #include "TChain.h" @@ -191,90 +191,32 @@ void TAGATAPhysics::Clear() { /////////////////////////////////////////////////////////////////////////// -void TAGATAPhysics::ReadConfiguration(string Path) { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool ReadingStatus = false ; - - while (!ConfigFile.eof()){ - - getline(ConfigFile, LineBuffer); - - // If line is a Start Up AGATA bloc, Reading toggle to true - string name="AGATA"; - if (LineBuffer.compare(0, name.length(), name) == 0){ - cout << "///" << endl ; - cout << "AGATA found: " << endl ; - ReadingStatus = true ; +void TAGATAPhysics::ReadConfiguration(NPL::InputParser parser) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("AGATA"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> token = {"R","Theta","Phi"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + cout << "//// AGATA triple cluster " << i + 1 << endl; + + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + // To be done + //AddDetector(R,Theta,Phi); } - // Reading Block - while(ReadingStatus) - { - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, name.length(), name) == 0) { - cout << "\033[1;311mWARNING: Another detector is find before standard sequence of Token, Error may occured in detector definition\033[0m" << endl ; - ReadingStatus = false ; - } - - //Angle method - else if (DataBuffer=="THETA=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - cout << "Theta: " << atof(DataBuffer.c_str()) << "deg" << endl; - } - - else if (DataBuffer=="PHI=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - cout << "Phi: " << atof( DataBuffer.c_str() ) << "deg" << endl; - } - - else if (DataBuffer=="R=") { - check_R = true; - ConfigFile >> DataBuffer ; - cout << "R: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_Theta && check_Phi && check_R){ - m_NumberOfDetectors++; - - // Reinitialisation of Check Boolean - check_Theta = false ; - check_Phi = false ; - check_R = false ; - ReadingStatus = false ; - cout << "///"<< endl ; - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } } - /////////////////////////////////////////////////////////////////////////// void TAGATAPhysics::InitSpectra() { m_Spectra = new TAGATASpectra(m_NumberOfDetectors); diff --git a/NPLib/Detectors/AGATA/TAGATAPhysics.h b/NPLib/Detectors/AGATA/TAGATAPhysics.h index e43d8d9a09f3e6edb028a0f2c04067882509f7bd..3f2ade2e4d13d13d92694f8daaed32cdca5e94d9 100644 --- a/NPLib/Detectors/AGATA/TAGATAPhysics.h +++ b/NPLib/Detectors/AGATA/TAGATAPhysics.h @@ -1,20 +1,20 @@ #ifndef TAGATAPHYSICS_H #define TAGATAPHYSICS_H /***************************************************************************** - * Copyright (C) 2009-2016 this file is part of the NPTool Project * + * Copyright (C) 2009-2016 this file is part of the NPTool Project * * * * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * * For the list of contributors see $NPTOOL/Licence/Contributors * *****************************************************************************/ /***************************************************************************** - * Original Author: Adrien Matta contact address: a.matta@surrey.ac.uk * + * Original Author: Adrien Matta contact address: a.matta@surrey.ac.uk * * * - * Creation Date : January 2016 * + * Creation Date : January 2016 * * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class hold AGATA Treated data * + * This class hold AGATA Treated data * * * *---------------------------------------------------------------------------* * Comment: * @@ -38,7 +38,7 @@ using namespace std; #include "TAGATASpectra.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" - +#include "NPInputParser.h" // forward declaration class TAGATASpectra; @@ -73,7 +73,7 @@ class TAGATAPhysics : public TObject, public NPL::VDetector { // methods inherited from the VDetector ABC class public: // read stream from ConfigFile to pick-up detector parameters - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // add parameters to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/Detectors/AnnularS1/TAnnularS1Physics.cxx b/NPLib/Detectors/AnnularS1/TAnnularS1Physics.cxx index cd7ab6b85867b597de06c932b65c54e86e6eefc8..c8a1739c2dbe6f4360e59075cee8208dbf7e06a6 100644 --- a/NPLib/Detectors/AnnularS1/TAnnularS1Physics.cxx +++ b/NPLib/Detectors/AnnularS1/TAnnularS1Physics.cxx @@ -34,6 +34,8 @@ using namespace ANNULARS1_LOCAL; #include "TAsciiFile.h" #include "NPOptionManager.h" #include "NPDetectorFactory.h" +#include "NPSystemOfUnits.h" +using namespace NPUNITS; // ROOT #include "TChain.h" /////////////////////////////////////////////////////////////////////////// @@ -378,62 +380,22 @@ void TAnnularS1Physics::Clear(){ //// Innherited from VDetector Class //// /////////////////////////////////////////////////////////////////////////// -void TAnnularS1Physics::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double Z = 0; - TVector3 Pos; - bool check_Z = false ; - - bool ReadingStatus = false ; - - bool VerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); ; - - while (!ConfigFile.eof()){ - - getline(ConfigFile, LineBuffer); - - // cout << LineBuffer << endl; - if (LineBuffer.compare(0, 9, "AnnularS1") == 0) - ReadingStatus = true; - - while (ReadingStatus && !ConfigFile.eof()) { - if(VerboseLevel) cout << "///" << endl ; - if(VerboseLevel) cout << "AnnularS1 found: " << endl ; - - // Take next word - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - //Position method - else if (DataBuffer == "Z=") { - check_Z = true; - ConfigFile >> DataBuffer ; - Z= atof(DataBuffer.c_str()); - if(VerboseLevel) cout << " Z= " << Z << "mm" << endl; - } +void TAnnularS1Physics::ReadConfiguration(NPL::InputParser parser){ - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; - cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << endl ; - exit(1); - } + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("AnnularS1"); + cout << "//// " << blocks.size() << " detectors found " << endl; - ///////////////////////////////////////////////// - // If All necessary information there, toggle out + vector<string> token = {"Z"}; - if (check_Z){ - ReadingStatus = false; - AddDetector(Z); - // Reinitialisation of Check Boolean - check_Z = false ; - } + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + double Z = blocks[i]->GetDouble("Z","mm"); + AddDetector(Z); + } + + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } diff --git a/NPLib/Detectors/AnnularS1/TAnnularS1Physics.h b/NPLib/Detectors/AnnularS1/TAnnularS1Physics.h index a5dcd6e5478a555b398bc3c9c1842c8aac8aa71c..e0a96bb071c93ea8e9f2829653e0e9931388ed39 100644 --- a/NPLib/Detectors/AnnularS1/TAnnularS1Physics.h +++ b/NPLib/Detectors/AnnularS1/TAnnularS1Physics.h @@ -29,6 +29,7 @@ #include "TS1Data.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" +#include "NPInputParser.h" // ROOT #include "TVector2.h" #include "TVector3.h" @@ -73,7 +74,7 @@ class TAnnularS1Physics : public TObject, public NPL::VDetector{ public: // Innherited from VDetector Class // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string) ; + void ReadConfiguration(NPL::InputParser) ; // Add Parameter to the CalibrationManger void AddParameterToCalibrationManager() ; diff --git a/NPLib/Detectors/AnnularS2/TS2Physics.cxx b/NPLib/Detectors/AnnularS2/TS2Physics.cxx index 40e2072cc51de918684c7f27c80bcb75f09a5973..9f4d46541651520ec3f5e16172a9f4d638844165 100644 --- a/NPLib/Detectors/AnnularS2/TS2Physics.cxx +++ b/NPLib/Detectors/AnnularS2/TS2Physics.cxx @@ -32,7 +32,8 @@ using namespace S2_LOCAL; #include "RootInput.h" #include "RootOutput.h" #include "NPDetectorFactory.h" - +#include "NPSystemOfUnits.h" +using namespace NPUNITS; // ROOT #include "TChain.h" /////////////////////////////////////////////////////////////////////////// @@ -643,189 +644,30 @@ void TS2Physics::ReadCalibrationRun() //// Innherited from VDetector Class //// // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token -void TS2Physics::ReadConfiguration(string Path) -{ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - // A:Theta1_Phi1 --> Theta:1 Phi:1 - // B:Theta128_Phi1 --> Theta:128 Phi:1 - // C:Theta1_Phi128 --> Theta:1 Phi:128 - // D:Theta128_Phi128 --> Theta:128 Phi:128 - - double Centerx, Centery, Centerz; - double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - TVector3 A , B , C , D, Center ; - // double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ; - - bool check_Center = false ; - bool check_A = false ; - bool check_C = false ; - bool check_B = false ; - bool check_D = false ; - - bool ReadingStatus = false ; - - - while (!ConfigFile.eof()) - { - - getline(ConfigFile, LineBuffer); - - // If line is a Start Up S2 bloc, Reading toggle to true - if (LineBuffer.compare(0, 11, "AnnularS2")==0) - { - cout << "///" << endl ; - cout << "Annular found: " << endl ; - ReadingStatus = true ; - - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus) - { - - ConfigFile >> DataBuffer ; - // Comment Line - if(DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer=="AnnularS2") { - cout << "WARNING: Another Annular is find before standard sequence of Token, Error may occured in Telecope definition" << endl ; - ReadingStatus = false ; - } - - // Position method - else if (DataBuffer=="CalculatedCenter=") { - check_Center = true; - ConfigFile >> DataBuffer ; - Centerx = atof(DataBuffer.c_str()) ; - Centerx = Centerx ; - ConfigFile >> DataBuffer ; - Centery = atof(DataBuffer.c_str()) ; - Centery = Centery ; - ConfigFile >> DataBuffer ; - Centerz = atof(DataBuffer.c_str()) ; - Centerz = Centerz ; - - Center = TVector3(Centerx, Centery, Centerz); - cout << "Center position : (" << Center.X() << ";" << Center.Y() << ";" << Center.Z() << ")" << endl; - } - - else if (DataBuffer=="Phi2_Phi3=") { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az ; - - A = TVector3(Ax, Ay, Az); - cout << "Phi2 Phi3 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; - - } - - - else if (DataBuffer=="Phi6_Phi7=") { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz ; - - B = TVector3(Bx, By, Bz); - cout << "Phi6 Phi7 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; - - } - - - else if (DataBuffer=="Phi10_Phi11=") { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz ; - - C = TVector3(Cx, Cy, Cz); - cout << "Phi10 Phi11 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; - - } - - else if (DataBuffer=="Phi14_Phi15=") { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz ; - - D = TVector3(Dx, Dy, Dz); - cout << "Phi14 Phi15 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; - - } - - // End Position Method +void TS2Physics::ReadConfiguration(NPL::InputParser parser) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("AnnularS2"); + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> token = {"CalculatedCenter","Phi2_Phi3","Phi6_Phi7","Phi10_Phi11","Phi14_Phi15"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + TVector3 Center = blocks[i]->GetTVector3("CalculatedCenter","mm"); + TVector3 A = blocks[i]->GetTVector3("Phi2_Phi3","mm"); + TVector3 B = blocks[i]->GetTVector3("Phi6_Phi7","mm"); + TVector3 C = blocks[i]->GetTVector3("Phi10_Phi11","mm"); + TVector3 D = blocks[i]->GetTVector3("Phi14_Phi15","mm"); + AddAnnular(Center, A,B,C,D) ; + } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ( (check_Center && check_A && check_B && check_C && check_D)) // || (check_Theta && check_Phi && check_R && check_beta) ) - { - ReadingStatus = false; - - ///Add The previously define telescope - //With position method - if ( check_Center && check_A && check_B && check_C && check_D ) - { - AddAnnular(Center, - A , - B , - C , - D ) ; - } - - //with angle method - - check_Center = false ; - check_A = false ; - check_B = false ; - check_C = false ; - check_D = false ; - } - - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } - InitializeStandardParameter(); - ReadAnalysisConfig(); - - cout << endl << "/////////////////////////////" << endl << endl; + } + InitializeStandardParameter(); + ReadAnalysisConfig(); } // Add Parameter to the CalibrationManger diff --git a/NPLib/Detectors/AnnularS2/TS2Physics.h b/NPLib/Detectors/AnnularS2/TS2Physics.h index 4da38cc784a4759fab9dcf9fc2c43a2e5099c8d4..ab9e8329370b26786233a6e561f97dc56d978cf0 100644 --- a/NPLib/Detectors/AnnularS2/TS2Physics.h +++ b/NPLib/Detectors/AnnularS2/TS2Physics.h @@ -29,6 +29,7 @@ #include "TS2Data.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" +#include "NPInputParser.h" // ROOT #include "TVector2.h" #include "TVector3.h" @@ -96,7 +97,7 @@ class TS2Physics : public TObject, public NPL::VDetector public: // Innherited from VDetector Class // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string) ; + void ReadConfiguration(NPL::InputParser) ; // Add Parameter to the CalibrationManger diff --git a/NPLib/Detectors/CATS/TCATSPhysics.cxx b/NPLib/Detectors/CATS/TCATSPhysics.cxx index 9f44115768578552f55f3e3754cc65e4e1d77fa4..9322f54fa7b655f39a1f4e2206b84e75f414c11b 100644 --- a/NPLib/Detectors/CATS/TCATSPhysics.cxx +++ b/NPLib/Detectors/CATS/TCATSPhysics.cxx @@ -35,6 +35,7 @@ using namespace std; #include "RootInput.h" #include "NPDetectorFactory.h" #include "RootOutput.h" +#include "NPOptionManager.h" // ROOT #include "TChain.h" #include "TF1.h" @@ -259,142 +260,29 @@ void TCATSPhysics::BuildPhysicalEvent(){ /////////////////////////////////////////////////////////////////////////// // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token -void TCATSPhysics::ReadConfiguration(string Path){ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer ; - string DataBuffer ; +void TCATSPhysics::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("CATSDetector"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; - double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - TVector3 A , B , C , D ; + vector<string> token = {"X1_Y1","X28_Y1","X1_Y28","X28_Y28"}; - bool check_A = false ; - bool check_B = false ; - bool check_C = false ; - bool check_D = false ; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + TVector3 A = blocks[i]->GetTVector3("X1_Y1","mm"); + TVector3 B = blocks[i]->GetTVector3("X28_Y1","mm"); + TVector3 C = blocks[i]->GetTVector3("X1_Y28","mm"); + TVector3 D = blocks[i]->GetTVector3("X28_Y28","mm"); - bool ReadingStatus = false ; - - - while (!ConfigFile.eof()) - { - getline(ConfigFile, LineBuffer); - - //If line is a Start Up CATS bloc, Reading toggle to true - if (LineBuffer.compare(0, 12, "CATSDetector") == 0) - { - cout << "CATS Detector found: " << endl ; - ReadingStatus = true ; + AddCATS(A,B,C,D); } - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus) - { - ConfigFile >> DataBuffer ; - // Comment Line - if(DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 12, "CATSDetector") == 0) { - cout << "Warning: Another CATS is found before standard sequence of Token, Error may have occurred in CATS definition" << endl ; - ReadingStatus = false ; - } - - // Corner Position method - - else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az ; - - A = TVector3(Ax, Ay, Az); - cout << " X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; - } - - else if (DataBuffer.compare(0, 7, "X28_Y1=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz ; - - B = TVector3(Bx, By, Bz); - cout << " X28 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; - } - - else if (DataBuffer.compare(0, 7, "X1_Y28=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz ; - - C = TVector3(Cx, Cy, Cz); - cout << " X1 Y28 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; - } - - else if (DataBuffer.compare(0, 8, "X28_Y28=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz ; - - D = TVector3(Dx, Dy, Dz); - cout << " X28 Y28 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; - - } - - // End Corner Position Method - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if (check_A && check_B && check_C && check_D) - { - ReadingStatus = false; - - ///Add The previously define telescope - - AddCATS( A , - B , - C , - D ); - - check_A = false; - check_B = false; - check_C = false; - check_D = false; - } - } - + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } } + InitializeStandardParameter(); ReadAnalysisConfig(); } diff --git a/NPLib/Detectors/CATS/TCATSPhysics.h b/NPLib/Detectors/CATS/TCATSPhysics.h index 2264e280b43c812f3b07fbd9d18a228dea350487..64fd27f7c909b0489f51e7004b4aa302e30deddf 100644 --- a/NPLib/Detectors/CATS/TCATSPhysics.h +++ b/NPLib/Detectors/CATS/TCATSPhysics.h @@ -32,11 +32,10 @@ // NPLib #include "TCATSData.h" #include "TCATSSpectra.h" - #include "NPVDetector.h" #include "NPCalibrationManager.h" #include "NPDetectorFactory.h" - +#include "NPInputParser.h" // forward declaration class TCATSSpectra; using namespace std ; @@ -175,7 +174,7 @@ class TCATSPhysics : public TObject, public NPL::VDetector void InitializeStandardParameter(); void AddParameterToCalibrationManager(); void ReadAnalysisConfig(); - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); void AddCATS(TVector3 C_X1_Y1, TVector3 C_X28_Y1, TVector3 C_X1_Y28, TVector3 C_X28_Y28); public: diff --git a/NPLib/Detectors/Charissa/TCharissaPhysics.cxx b/NPLib/Detectors/Charissa/TCharissaPhysics.cxx index 455f2ca9d2767b92dc6906e5cc9948453bb463b9..af27491f1f69202690bd4e27c33a03d4879cdc20 100644 --- a/NPLib/Detectors/Charissa/TCharissaPhysics.cxx +++ b/NPLib/Detectors/Charissa/TCharissaPhysics.cxx @@ -744,215 +744,42 @@ void TCharissaPhysics::Clear(){ //// Innherited from VDetector Class //// /////////////////////////////////////////////////////////////////////////// -void TCharissaPhysics::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - // A:X1_Y1 --> X:1 Y:1 - // B:X m_NumberOfStrip_Y1 --> X: m_NumberOfStrip Y:1 - // C:X1_Y m_NumberOfStrip --> X:1 Y: m_NumberOfStrip - // D:X m_NumberOfStrip_Y m_NumberOfStrip --> X: m_NumberOfStrip Y: m_NumberOfStrip - - double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz; - TVector3 A , B , C , D; - double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0; - - bool check_A = false ; - bool check_C = false ; - bool check_B = false ; - bool check_D = false ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool check_beta = false ; - - bool ReadingStatus = false ; - - - while (!ConfigFile.eof()) - { - - getline(ConfigFile, LineBuffer); - - // If line is a Start Up CharissaCHARISSA bloc, Reading toggle to true - if (LineBuffer.compare(0, 17, "CharissaTelescope")==0) - { - cout << "///" << endl ; - cout << "Telescope found: " << endl ; - ReadingStatus = true ; - +void TCharissaPhysics::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("CharissaTelescope"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " Telescope found " << endl; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + // Cartesian Case + vector<string> cart = {"X1_Y1","X1_Y16","X16_Y1","X16_Y16","SI","SILI","CSI"}; + // Spherical Case + vector<string> sphe= {"R","THETA","PHI","BETA","SI","SILI","CSI"}; + + if(blocks[i]->HasTokenList(cart)){ + cout << endl << "//// Charissa telecope " << i+1 << endl; + TVector3 A = blocks[i]->GetTVector3("X1_Y1","mm"); + TVector3 B = blocks[i]->GetTVector3("X16_Y1","mm"); + TVector3 C = blocks[i]->GetTVector3("X1_Y16","mm"); + TVector3 D = blocks[i]->GetTVector3("X16_Y16","mm"); + AddTelescope(A,B,C,D) ; } - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus) - { - - ConfigFile >> DataBuffer ; - // Comment Line - if(DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer=="CharissaTelescope") { - cout << "WARNING: Another Telescope is find before standard sequence of Token, Error may occured in Telecope definition" << endl ; - ReadingStatus = false ; - } - - // Position method - - else if (DataBuffer=="X1_Y1=") { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - - A = TVector3(Ax, Ay, Az); - cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; - - } - - - else if (DataBuffer=="X16_Y1=") { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - - B = TVector3(Bx, By, Bz); - cout << "X16 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; - - } - - - else if (DataBuffer=="X1_Y16=") { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - - C = TVector3(Cx, Cy, Cz); - cout << "X1 Y16 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; - - } - - else if (DataBuffer=="X16_Y16=") { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - - D = TVector3(Dx, Dy, Dz); - cout << "X16 Y16 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; - - } - - // End Position Method - - // Angle method - else if (DataBuffer=="THETA=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - cout << "Theta: " << Theta << endl; - - } - - //Angle method - else if (DataBuffer=="PHI=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - cout << "Phi: " << Phi << endl; - - } - - //Angle method - else if (DataBuffer=="R=") { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - cout << "R: " << R << endl; - - } - - //Angle method - else if (DataBuffer=="BETA=") { - check_beta = true; - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - cout << "Beta: " << beta_u << " " << beta_v << " " << beta_w << endl ; - - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) - { - ReadingStatus = false; - - ///Add The previously define telescope - //With position method - if ( check_A && check_B && check_C && check_D ) - { - AddTelescope( A, - B, - C, - D) ; - } - - //with angle method - else if ( check_Theta && check_Phi && check_R && check_beta ) - { - AddTelescope( Theta, - Phi, - R, - beta_u, - beta_v, - beta_w); - } - - check_A = false ; - check_B = false ; - check_C = false ; - check_D = false ; + else if(blocks[i]->HasTokenList(sphe)){ + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi= blocks[i]->GetDouble("PHI","deg"); + double R = blocks[i]->GetDouble("R","mm"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + AddTelescope( Theta,Phi,R,beta[0],beta[1],beta[2]); + } - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_beta = false ; - } + else{ + cout << "ERROR: Missing token for CharissaTelescope blocks, check your input file" << endl; + exit(1); } + } InitializeStandardParameter(); ReadAnalysisConfig(); - - cout << endl << "/////////////////////////////" << endl << endl; - } /////////////////////////////////////////////////////////////////////////// void TCharissaPhysics::InitSpectra(){ diff --git a/NPLib/Detectors/Charissa/TCharissaPhysics.h b/NPLib/Detectors/Charissa/TCharissaPhysics.h index f766e01a49f915f8238df8e7ebede5750531870f..7f22dffefa0b4af8f5a143a49630df308db5e1d8 100644 --- a/NPLib/Detectors/Charissa/TCharissaPhysics.h +++ b/NPLib/Detectors/Charissa/TCharissaPhysics.h @@ -30,6 +30,7 @@ #include "TCharissaSpectra.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" +#include "NPInputParser.h" // ROOT #include "TVector2.h" #include "TVector3.h" @@ -102,7 +103,7 @@ class TCharissaPhysics : public TObject, public NPL::VDetector{ public: // Innherited from VDetector Class // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string) ; + void ReadConfiguration(NPL::InputParser) ; // Add Parameter to the CalibrationManger diff --git a/NPLib/Detectors/ChateauCristal/TChateauCristalPhysics.cxx b/NPLib/Detectors/ChateauCristal/TChateauCristalPhysics.cxx index 2829ea8f3870bdbaafea834d4637aa6d4eaf870f..9008fff07cd5579f6eebb92e4a931bb7e7d97cea 100644 --- a/NPLib/Detectors/ChateauCristal/TChateauCristalPhysics.cxx +++ b/NPLib/Detectors/ChateauCristal/TChateauCristalPhysics.cxx @@ -25,6 +25,7 @@ #include "RootOutput.h" #include "RootInput.h" #include "NPDetectorFactory.h" +#include "NPOptionManager.h" // C++ #include <iostream> #include <sstream> @@ -88,77 +89,27 @@ void TChateauCristalPhysics::Clear() } /////////////////////////////////////////////////////////////////////////// -void TChateauCristalPhysics::ReadConfiguration(string Path) -{ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - string AngleFile; - - bool check_A = false; - bool ReadingStatus = false; - - while (!ConfigFile.eof()) { - - getline(ConfigFile, LineBuffer); - - // If line is a Start Up ChateauCristal bloc, Reading toggle to true - if (LineBuffer.compare(0, 14, "ChateauCristal") == 0) //whole array at once - //if (LineBuffer.compare(0, 4, "BAF2") == 0) //individual detector - { - cout << "Chateau de Cristal found: " << endl ; - // m_NumberOfDetectors=64;//simplify matters to read whole array at once sf - ReadingStatus = true ; - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus) - { - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // // Finding another telescope (safety), toggle out - // else if (DataBuffer=="BAF2") { - // cout << "WARNING: Another Telescope is founnd before standard sequence of Token, Error may occured in detector definition" << endl ; - // ReadingStatus = false ; - // } - - // File angle method +void TChateauCristalPhysics::ReadConfiguration(NPL::InputParser parser) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("ChateauCristal"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; - if (DataBuffer.compare(0, 12, "ANGLES_FILE=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - AngleFile = DataBuffer; + vector<string> token = {"ANGLES_FILE"}; - cout << "File angle used : " << DataBuffer << endl; - } - - // End File angle Method - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if (check_A) - { - ReadingStatus = false; - - ///Add The previously define telescope - - AddModule(AngleFile); + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + string AngleFile = blocks[i]->GetString("ANGLE_FILE"); + AddModule(AngleFile); + } - check_A = false; - } - } - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } - InitializeStandardParameter() ; - ReadAnalysisConfig() ; + InitializeStandardParameter(); + ReadAnalysisConfig(); } /////////////////////////////////////////////////////////////////////////// diff --git a/NPLib/Detectors/ChateauCristal/TChateauCristalPhysics.h b/NPLib/Detectors/ChateauCristal/TChateauCristalPhysics.h index fd9c61b56d58082d685c157fcc54f5ef829ef81d..e01a9575161f89897c57a326ff99b9444bcd8b3e 100644 --- a/NPLib/Detectors/ChateauCristal/TChateauCristalPhysics.h +++ b/NPLib/Detectors/ChateauCristal/TChateauCristalPhysics.h @@ -33,9 +33,9 @@ using namespace std ; #include "TChateauCristalData.h" #include "NPVDetector.h" #include "NPCalibrationManager.h" +#include "NPInputParser.h" -class TChateauCristalPhysics : public TObject, public NPL::VDetector -{ +class TChateauCristalPhysics : public TObject, public NPL::VDetector{ public: // Constructor and Destructor TChateauCristalPhysics(); ~TChateauCristalPhysics(); @@ -49,7 +49,7 @@ class TChateauCristalPhysics : public TObject, public NPL::VDetector public: // inherited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManager void AddParameterToCalibrationManager(); diff --git a/NPLib/Detectors/Chio/TChio_anPhysics.cxx b/NPLib/Detectors/Chio/TChio_anPhysics.cxx index a871b15b6763bebce294fad1630d301bcf3463b8..09edc31e779cfb6c72c19573d79ccea5661ee5f7 100644 --- a/NPLib/Detectors/Chio/TChio_anPhysics.cxx +++ b/NPLib/Detectors/Chio/TChio_anPhysics.cxx @@ -34,6 +34,7 @@ #include "RootInput.h" #include "RootOutput.h" #include "NPDetectorFactory.h" +#include "NPOptionManager.h" // ROOT #include "TChain.h" #include "TRandom.h" @@ -56,141 +57,31 @@ TChio_anPhysics::~TChio_anPhysics() // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token -void TChio_anPhysics::ReadConfiguration(string Path) -{ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer ; - string DataBuffer ; - - double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - TVector3 A , B , C , D ; - - bool check_A = false ; - bool check_B = false ; - bool check_C = false ; - bool check_D = false ; +void TChio_anPhysics::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Chio"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; - bool ReadingStatus = false ; + vector<string> token = {"A","B","C","D"}; - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + TVector3 A = blocks[i]->GetTVector3("A","mm"); + TVector3 B = blocks[i]->GetTVector3("B","mm"); + TVector3 C = blocks[i]->GetTVector3("C","mm"); + TVector3 D = blocks[i]->GetTVector3("D","mm"); - //If line is a Start Up chio bloc, Reading toggle to true - if (LineBuffer.compare(0, 4, "Chio") == 0) { - cout << "///" << endl ; - cout << "Chio Detector found: " << endl ; - ReadingStatus = true ; + // AddChio(A,B,C,D); } - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while (ReadingStatus) { - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 4, "Chio") == 0) { - cout << "WARNING: Another chio is found before standard sequence of Token, Error may have occured in chio definition" << endl ; - ReadingStatus = false ; - } - - // Corner Position method - - else if (DataBuffer.compare(0, 2, "A=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az ; - - A = TVector3(Ax, Ay, Az); - cout << "A corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; - } - - else if (DataBuffer.compare(0, 2, "B=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz ; - - B = TVector3(Bx, By, Bz); - cout << "B corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; - } - - else if (DataBuffer.compare(0, 2, "C=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz ; - - C = TVector3(Cx, Cy, Cz); - cout << "C corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; - } - - else if (DataBuffer.compare(0, 2, "D=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz ; - - D = TVector3(Dx, Dy, Dz); - cout << "D corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; - - } - - // End Corner Position Method - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if (check_A && check_B && check_C && check_D) { - ReadingStatus = false; - - ///Add The previously define telescope - - // AddChio( A , - // B , - // C , - // D ); - - check_A = false; - check_B = false; - check_C = false; - check_D = false; - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } - } - cout << endl << "/////////////////////////////" << endl << endl; +// InitializeStandardParameter(); +// ReadAnalysisConfig(); } diff --git a/NPLib/Detectors/Chio/TChio_anPhysics.h b/NPLib/Detectors/Chio/TChio_anPhysics.h index 9c99b987adcff27eeb686336c57e5ae6352d378e..3a2e5fb3766731b8794e2c3ba00ccd4f3c1b48a4 100644 --- a/NPLib/Detectors/Chio/TChio_anPhysics.h +++ b/NPLib/Detectors/Chio/TChio_anPhysics.h @@ -35,7 +35,7 @@ #include "TChio_anData.h" #include "NPVDetector.h" #include "NPCalibrationManager.h" - +#include "NPInputParser.h" using namespace std ; class TChio_anPhysics : public TObject, public NPL::VDetector @@ -83,7 +83,7 @@ class TChio_anPhysics : public TObject, public NPL::VDetector public: // Inherited from VDetector Class // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/Detectors/Chio/TChio_digPhysics.cxx b/NPLib/Detectors/Chio/TChio_digPhysics.cxx index 4950a905aecf7b0a5ac2fdef2877ea9925390d4a..471d3507a4884af3e126bab8db89c39403d22aeb 100644 --- a/NPLib/Detectors/Chio/TChio_digPhysics.cxx +++ b/NPLib/Detectors/Chio/TChio_digPhysics.cxx @@ -34,6 +34,7 @@ #include "RootInput.h" #include "RootOutput.h" #include "NPDetectorFactory.h" +#include "NPOptionManager.h" // ROOT #include "TChain.h" #include "TRandom.h" @@ -56,145 +57,33 @@ TChio_digPhysics::~TChio_digPhysics() // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token -void TChio_digPhysics::ReadConfiguration(string Path) -{ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer ; - string DataBuffer ; - - double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - TVector3 A , B , C , D ; +void TChio_digPhysics::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Chio"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; - bool check_A = false ; - bool check_B = false ; - bool check_C = false ; - bool check_D = false ; + vector<string> token = {"A","B","C","D"}; - bool ReadingStatus = false ; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + TVector3 A = blocks[i]->GetTVector3("A","mm"); + TVector3 B = blocks[i]->GetTVector3("B","mm"); + TVector3 C = blocks[i]->GetTVector3("C","mm"); + TVector3 D = blocks[i]->GetTVector3("D","mm"); - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - //If line is a Start Up chio bloc, Reading toggle to true - if (LineBuffer.compare(0, 4, "Chio") == 0) { - cout << "///" << endl ; - cout << "Chio Detector found: " << endl ; - ReadingStatus = true ; + // AddChio(A,B,C,D); } - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while (ReadingStatus) { - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 4, "Chio") == 0) { - cout << "WARNING: Another chio is found before standard sequence of Token, Error may have occured in chio definition" << endl ; - ReadingStatus = false ; - } - - // Corner Position method - - else if (DataBuffer.compare(0, 2, "A=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az ; - - A = TVector3(Ax, Ay, Az); - cout << "A corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; - } - - else if (DataBuffer.compare(0, 2, "B=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz ; - - B = TVector3(Bx, By, Bz); - cout << "B corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; - } - - else if (DataBuffer.compare(0, 2, "C=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz ; - - C = TVector3(Cx, Cy, Cz); - cout << "C corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; - } - - else if (DataBuffer.compare(0, 2, "D=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz ; - - D = TVector3(Dx, Dy, Dz); - cout << "D corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; - - } - - // End Corner Position Method - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if (check_A && check_B && check_C && check_D) { - ReadingStatus = false; - - ///Add The previously define telescope - - // AddChio( A , - // B , - // C , - // D ); - - check_A = false; - check_B = false; - check_C = false; - check_D = false; - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } - } - cout << endl << "/////////////////////////////" << endl << endl; +// InitializeStandardParameter(); +// ReadAnalysisConfig(); } - - // Add Parameter to the CalibrationManger void TChio_digPhysics::AddParameterToCalibrationManager() { diff --git a/NPLib/Detectors/Chio/TChio_digPhysics.h b/NPLib/Detectors/Chio/TChio_digPhysics.h index 72d7b4002f0c288f1db26d0c839142529a452b8c..8be25ecdfd34a674b32768cf7476349957cd267b 100644 --- a/NPLib/Detectors/Chio/TChio_digPhysics.h +++ b/NPLib/Detectors/Chio/TChio_digPhysics.h @@ -35,7 +35,7 @@ #include "TChio_digData.h" #include "NPVDetector.h" #include "NPCalibrationManager.h" - +#include "NPInputParser.h" using namespace std ; class TChio_digPhysics : public TObject, public NPL::VDetector @@ -83,7 +83,7 @@ class TChio_digPhysics : public TObject, public NPL::VDetector public: // Inherited from VDetector Class // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/Detectors/ComptonTelescope/TComptonTelescopePhysics.cxx b/NPLib/Detectors/ComptonTelescope/TComptonTelescopePhysics.cxx index a118963491565ca6675171121f2ad5ae4086df7c..433d83432b6494974f6cdbd8f61ec197a193a9ba 100644 --- a/NPLib/Detectors/ComptonTelescope/TComptonTelescopePhysics.cxx +++ b/NPLib/Detectors/ComptonTelescope/TComptonTelescopePhysics.cxx @@ -12,7 +12,7 @@ * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class hold ComptonTelescope treated data * + * This class hold ComptonTelescope treated data * * * *---------------------------------------------------------------------------* * Comment: * @@ -43,66 +43,66 @@ using namespace std; ClassImp(TComptonTelescopePhysics) -/////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// TComptonTelescopePhysics::TComptonTelescopePhysics() - : m_EventData(new TComptonTelescopeData), - m_PreTreatedData(new TComptonTelescopeData), - m_EventPhysics(this), - m_MaximumStripMultiplicityAllowed(10), - m_StripEnergyMatchingSigma(0.060), // MeV - m_StripEnergyMatchingNumberOfSigma(3), // MeV - m_StripFront_E_RAW_Threshold(0), - m_StripFront_E_Threshold(0), - m_StripBack_E_RAW_Threshold(0), - m_StripBack_E_Threshold(0), - m_Take_E_Front(true), // p-side - m_NumberOfDetectors(0), - m_NumberOfStrips(32) + : m_EventData(new TComptonTelescopeData), + m_PreTreatedData(new TComptonTelescopeData), + m_EventPhysics(this), + m_MaximumStripMultiplicityAllowed(10), + m_StripEnergyMatchingSigma(0.060), // MeV + m_StripEnergyMatchingNumberOfSigma(3), // MeV + m_StripFront_E_RAW_Threshold(0), + m_StripFront_E_Threshold(0), + m_StripBack_E_RAW_Threshold(0), + m_StripBack_E_Threshold(0), + m_Take_E_Front(true), // p-side + m_NumberOfDetectors(0), + m_NumberOfStrips(32) { - EventMultiplicity = 0; + EventMultiplicity = 0; } /////////////////////////////////////////////////////////////////////////// void TComptonTelescopePhysics::BuildPhysicalEvent() { - BuildSimplePhysicalEvent(); + BuildSimplePhysicalEvent(); } /////////////////////////////////////////////////////////////////////////// void TComptonTelescopePhysics::BuildSimplePhysicalEvent() { - // select active channels and apply threhsolds - PreTreat(); - - if (CheckEvent() == 1) { // case where multiplicity front = multiplicity back - vector<TVector2> couple = Match_Front_Back(); - EventMultiplicity = couple.size(); - - for (UShort_t i = 0; i < couple.size(); ++i) { // loop on selected events - Int_t N = m_PreTreatedData->GetCTTrackerFrontEDetectorNbr(couple[i].X()); - Int_t Front = m_PreTreatedData->GetCTTrackerFrontEStripNbr(couple[i].X()); - Int_t Back = m_PreTreatedData->GetCTTrackerBackEStripNbr(couple[i].Y()); - Double_t Front_E = m_PreTreatedData->GetCTTrackerFrontEEnergy(couple[i].X()); - Double_t Back_E = m_PreTreatedData->GetCTTrackerBackEEnergy(couple[i].Y()); - - // Fill TComptonTelescopePhysics private members - DetectorNumber.push_back(N); - StripFront_E.push_back(Front_E); - StripBack_E.push_back(Back_E); - - if (m_Take_E_Front) - Strip_E.push_back(Front_E); - else - Strip_E.push_back(Back_E); - - Strip_Front.push_back(Front); - Strip_Back.push_back(Back); - } - } + // select active channels and apply threhsolds + PreTreat(); + + if (CheckEvent() == 1) { // case where multiplicity front = multiplicity back + vector<TVector2> couple = Match_Front_Back(); + EventMultiplicity = couple.size(); + + for (UShort_t i = 0; i < couple.size(); ++i) { // loop on selected events + Int_t N = m_PreTreatedData->GetCTTrackerFrontEDetectorNbr(couple[i].X()); + Int_t Front = m_PreTreatedData->GetCTTrackerFrontEStripNbr(couple[i].X()); + Int_t Back = m_PreTreatedData->GetCTTrackerBackEStripNbr(couple[i].Y()); + Double_t Front_E = m_PreTreatedData->GetCTTrackerFrontEEnergy(couple[i].X()); + Double_t Back_E = m_PreTreatedData->GetCTTrackerBackEEnergy(couple[i].Y()); + + // Fill TComptonTelescopePhysics private members + DetectorNumber.push_back(N); + StripFront_E.push_back(Front_E); + StripBack_E.push_back(Back_E); + + if (m_Take_E_Front) + Strip_E.push_back(Front_E); + else + Strip_E.push_back(Back_E); + + Strip_Front.push_back(Front); + Strip_Back.push_back(Back); + } + } -// if (DetectorNumber.size() == 1) return; + // if (DetectorNumber.size() == 1) return; } @@ -110,39 +110,39 @@ void TComptonTelescopePhysics::BuildSimplePhysicalEvent() /////////////////////////////////////////////////////////////////////////// void TComptonTelescopePhysics::PreTreat() { - // Clear pre treated object - ClearPreTreatedData(); - - // Front, energy - for (UShort_t i = 0; i < m_EventData->GetCTTrackerFrontEMult(); ++i) { - if (m_EventData->GetCTTrackerFrontEEnergy(i) > m_StripFront_E_RAW_Threshold && - IsValidChannel("Front", m_EventData->GetCTTrackerFrontEDetectorNbr(i), m_EventData->GetCTTrackerFrontEStripNbr(i))) { - Double_t E = fStrip_Front_E(m_EventData, i); - if (E > m_StripFront_E_Threshold) { - m_PreTreatedData->SetCTTrackerFrontETowerNbr(m_EventData->GetCTTrackerFrontETowerNbr(i)); - m_PreTreatedData->SetCTTrackerFrontEDetectorNbr(m_EventData->GetCTTrackerFrontEDetectorNbr(i)); - m_PreTreatedData->SetCTTrackerFrontEStripNbr(m_EventData->GetCTTrackerFrontEStripNbr(i)); - m_PreTreatedData->SetCTTrackerFrontEEnergy(E); - - } + // Clear pre treated object + ClearPreTreatedData(); + + // Front, energy + for (UShort_t i = 0; i < m_EventData->GetCTTrackerFrontEMult(); ++i) { + if (m_EventData->GetCTTrackerFrontEEnergy(i) > m_StripFront_E_RAW_Threshold && + IsValidChannel("Front", m_EventData->GetCTTrackerFrontEDetectorNbr(i), m_EventData->GetCTTrackerFrontEStripNbr(i))) { + Double_t E = fStrip_Front_E(m_EventData, i); + if (E > m_StripFront_E_Threshold) { + m_PreTreatedData->SetCTTrackerFrontETowerNbr(m_EventData->GetCTTrackerFrontETowerNbr(i)); + m_PreTreatedData->SetCTTrackerFrontEDetectorNbr(m_EventData->GetCTTrackerFrontEDetectorNbr(i)); + m_PreTreatedData->SetCTTrackerFrontEStripNbr(m_EventData->GetCTTrackerFrontEStripNbr(i)); + m_PreTreatedData->SetCTTrackerFrontEEnergy(E); + } - } - - // Back, energy - for (UShort_t i = 0; i < m_EventData->GetCTTrackerBackEMult(); ++i) { - if (m_EventData->GetCTTrackerBackEEnergy(i) > m_StripBack_E_RAW_Threshold && - IsValidChannel("Back", m_EventData->GetCTTrackerBackEDetectorNbr(i), m_EventData->GetCTTrackerBackEStripNbr(i))) { - Double_t E = fStrip_Back_E(m_EventData, i); - if (E > m_StripBack_E_Threshold) { - m_PreTreatedData->SetCTTrackerBackETowerNbr(m_EventData->GetCTTrackerBackETowerNbr(i)); - m_PreTreatedData->SetCTTrackerBackEDetectorNbr( m_EventData->GetCTTrackerBackEDetectorNbr(i)); - m_PreTreatedData->SetCTTrackerBackEStripNbr( m_EventData->GetCTTrackerBackEStripNbr(i)); - m_PreTreatedData->SetCTTrackerBackEEnergy(E); - } + } + } + + // Back, energy + for (UShort_t i = 0; i < m_EventData->GetCTTrackerBackEMult(); ++i) { + if (m_EventData->GetCTTrackerBackEEnergy(i) > m_StripBack_E_RAW_Threshold && + IsValidChannel("Back", m_EventData->GetCTTrackerBackEDetectorNbr(i), m_EventData->GetCTTrackerBackEStripNbr(i))) { + Double_t E = fStrip_Back_E(m_EventData, i); + if (E > m_StripBack_E_Threshold) { + m_PreTreatedData->SetCTTrackerBackETowerNbr(m_EventData->GetCTTrackerBackETowerNbr(i)); + m_PreTreatedData->SetCTTrackerBackEDetectorNbr( m_EventData->GetCTTrackerBackEDetectorNbr(i)); + m_PreTreatedData->SetCTTrackerBackEStripNbr( m_EventData->GetCTTrackerBackEStripNbr(i)); + m_PreTreatedData->SetCTTrackerBackEEnergy(E); } - } + } + } - // DSSSD time information and LaBr3 still have to be done... + // DSSSD time information and LaBr3 still have to be done... } @@ -153,7 +153,7 @@ int TComptonTelescopePhysics::CheckEvent() // same multiplicity on front and back side if (m_PreTreatedData->GetCTTrackerBackEMult() == m_PreTreatedData->GetCTTrackerFrontEMult()) return 1 ; // Regular Event - + else return -1 ; // Rejected Event } @@ -163,33 +163,33 @@ int TComptonTelescopePhysics::CheckEvent() /////////////////////////////////////////////////////////////////////////// vector<TVector2> TComptonTelescopePhysics::Match_Front_Back() { - vector<TVector2> ArrayOfGoodCouple; - - // Select allowed multiplicity events. If multiplicity is too - // high, then return "empty" vector - if (m_PreTreatedData->GetCTTrackerFrontEMult() > m_MaximumStripMultiplicityAllowed || - m_PreTreatedData->GetCTTrackerBackEMult() > m_MaximumStripMultiplicityAllowed) - return ArrayOfGoodCouple; - - // Loop on front multiplicity - for (UShort_t i = 0; i < m_PreTreatedData->GetCTTrackerFrontEMult(); i++) { - // Loop on back multiplicity - for (UShort_t j = 0; j < m_PreTreatedData->GetCTTrackerBackEMult(); j++) { - // if same tower and same detector check energy - if ((m_PreTreatedData->GetCTTrackerFrontETowerNbr(i) == m_PreTreatedData->GetCTTrackerBackETowerNbr(j)) && - (m_PreTreatedData->GetCTTrackerFrontEDetectorNbr(i) == m_PreTreatedData->GetCTTrackerBackEDetectorNbr(j))) { - // equal energy - if (abs((m_PreTreatedData->GetCTTrackerFrontEEnergy(i) - m_PreTreatedData->GetCTTrackerBackEEnergy(j))/2.) < m_StripEnergyMatchingNumberOfSigma*m_StripEnergyMatchingSigma) { - ArrayOfGoodCouple.push_back(TVector2(i,j)); - } // end test energy - } // end test same tower and detector - } // end loop back multiplicity - } // end loop front multiplicity - - // prevent treating event with ambiguous matchin beetween X and Y - if (ArrayOfGoodCouple.size() > m_PreTreatedData->GetCTTrackerFrontEMult()) ArrayOfGoodCouple.clear(); - - return ArrayOfGoodCouple; + vector<TVector2> ArrayOfGoodCouple; + + // Select allowed multiplicity events. If multiplicity is too + // high, then return "empty" vector + if (m_PreTreatedData->GetCTTrackerFrontEMult() > m_MaximumStripMultiplicityAllowed || + m_PreTreatedData->GetCTTrackerBackEMult() > m_MaximumStripMultiplicityAllowed) + return ArrayOfGoodCouple; + + // Loop on front multiplicity + for (UShort_t i = 0; i < m_PreTreatedData->GetCTTrackerFrontEMult(); i++) { + // Loop on back multiplicity + for (UShort_t j = 0; j < m_PreTreatedData->GetCTTrackerBackEMult(); j++) { + // if same tower and same detector check energy + if ((m_PreTreatedData->GetCTTrackerFrontETowerNbr(i) == m_PreTreatedData->GetCTTrackerBackETowerNbr(j)) && + (m_PreTreatedData->GetCTTrackerFrontEDetectorNbr(i) == m_PreTreatedData->GetCTTrackerBackEDetectorNbr(j))) { + // equal energy + if (abs((m_PreTreatedData->GetCTTrackerFrontEEnergy(i) - m_PreTreatedData->GetCTTrackerBackEEnergy(j))/2.) < m_StripEnergyMatchingNumberOfSigma*m_StripEnergyMatchingSigma) { + ArrayOfGoodCouple.push_back(TVector2(i,j)); + } // end test energy + } // end test same tower and detector + } // end loop back multiplicity + } // end loop front multiplicity + + // prevent treating event with ambiguous matchin beetween X and Y + if (ArrayOfGoodCouple.size() > m_PreTreatedData->GetCTTrackerFrontEMult()) ArrayOfGoodCouple.clear(); + + return ArrayOfGoodCouple; } @@ -197,13 +197,13 @@ vector<TVector2> TComptonTelescopePhysics::Match_Front_Back() //////////////////////////////////////////////////////////////////////////// bool TComptonTelescopePhysics::IsValidChannel(const string DetectorType, const int detector, const int channel) { - if (DetectorType == "Front") - return *(m_FrontChannelStatus[detector-1].begin()+channel); + if (DetectorType == "Front") + return *(m_FrontChannelStatus[detector-1].begin()+channel); - else if (DetectorType == "Back") - return *(m_BackChannelStatus[detector-1].begin()+channel); + else if (DetectorType == "Back") + return *(m_BackChannelStatus[detector-1].begin()+channel); - else return false; + else return false; } @@ -211,131 +211,131 @@ bool TComptonTelescopePhysics::IsValidChannel(const string DetectorType, const i /////////////////////////////////////////////////////////////////////////// void TComptonTelescopePhysics::ReadAnalysisConfig() { - bool ReadingStatus = false; - - cout << "\t/////////// Reading ConfigComptonTelescope.dat file ///////////" << endl; - - // path to file - string FileName = "./configs/ConfigComptonTelescope.dat"; - - // open analysis config file - ifstream AnalysisConfigFile; - AnalysisConfigFile.open(FileName.c_str()); - - if (!AnalysisConfigFile.is_open()) { - cout << "\tNo ConfigComptonTelescope.dat found: default parameters loaded for Analysis " << FileName << endl; - return; - } - cout << "\tLoading user parameters from ConfigComptonTelescope.dat " << endl; - - // storing config file in the ROOT output file - TAsciiFile* asciiConfig = RootOutput::getInstance()->GetAsciiFileAnalysisConfig(); - asciiConfig->AppendLine("%%% ConfigComptonTelescope.dat %%%"); - asciiConfig->Append(FileName.c_str()); - asciiConfig->AppendLine(""); - - // read analysis config file - string LineBuffer, DataBuffer, whatToDo; - while (!AnalysisConfigFile.eof()) { - // Pick-up next line - getline(AnalysisConfigFile, LineBuffer); - - // search for "header" - if (LineBuffer.compare(0, 22, "ConfigComptonTelescope") == 0) ReadingStatus = true; - - // loop on tokens and data - while (ReadingStatus) { - whatToDo = ""; - AnalysisConfigFile >> whatToDo; - - // Search for comment symbol (%) - if (whatToDo.compare(0, 1, "%") == 0) { - AnalysisConfigFile.ignore(numeric_limits<streamsize>::max(), '\n' ); - } - - else if (whatToDo == "MAX_STRIP_MULTIPLICITY") { - AnalysisConfigFile >> DataBuffer; - m_MaximumStripMultiplicityAllowed = atoi(DataBuffer.c_str()); - cout << "\t" << whatToDo << "\t" << m_MaximumStripMultiplicityAllowed << endl; - } - - else if (whatToDo == "FRONT_BACK_ENERGY_MATCHING_SIGMA") { - AnalysisConfigFile >> DataBuffer; - m_StripEnergyMatchingSigma = atof(DataBuffer.c_str()); - cout << "\t" << whatToDo << "\t" << m_StripEnergyMatchingSigma << endl; - } - - else if (whatToDo == "FRONT_BACK_ENERGY_MATCHING_NUMBER_OF_SIGMA") { - AnalysisConfigFile >> DataBuffer; - m_StripEnergyMatchingNumberOfSigma = atoi(DataBuffer.c_str()); - cout << "\t" << whatToDo << "\t" << m_StripEnergyMatchingNumberOfSigma << endl; - } - - else if (whatToDo == "DISABLE_ALL") { - AnalysisConfigFile >> DataBuffer; - cout << "\t" << whatToDo << "\t" << DataBuffer << endl; - Int_t Detector = atoi(DataBuffer.substr(2,1).c_str()); - vector< bool > ChannelStatus; - ChannelStatus.resize(m_NumberOfStrips, false); - m_FrontChannelStatus[Detector-1] = ChannelStatus; - m_BackChannelStatus[Detector-1] = ChannelStatus; - } - - else if (whatToDo == "DISABLE_CHANNEL") { - AnalysisConfigFile >> DataBuffer; - cout << "\t" << whatToDo << "\t" << DataBuffer << endl; - Int_t Detector = atoi(DataBuffer.substr(2,1).c_str()); - Int_t channel = -1; - if (DataBuffer.compare(3,4,"FRONT") == 0) { - channel = atoi(DataBuffer.substr(7).c_str()); - *(m_FrontChannelStatus[Detector-1].begin()+channel) = false; - } - else if (DataBuffer.compare(3,4,"BACK") == 0) { - channel = atoi(DataBuffer.substr(7).c_str()); - *(m_BackChannelStatus[Detector-1].begin()+channel) = false; - } - } - - else if (whatToDo=="TAKE_E_FRONT") { - m_Take_E_Front = true; - cout << whatToDo << endl; - } - - else if (whatToDo=="TAKE_E_BACK") { - m_Take_E_Front = false; - cout << whatToDo << endl; - } - - else if (whatToDo=="STRIP_FRONT_E_RAW_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_StripFront_E_RAW_Threshold = atoi(DataBuffer.c_str()); - cout << whatToDo << " " << m_StripFront_E_RAW_Threshold << endl; - } - - else if (whatToDo=="STRIP_BACK_E_RAW_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_StripBack_E_RAW_Threshold = atoi(DataBuffer.c_str()); - cout << whatToDo << " " << m_StripBack_E_RAW_Threshold << endl; - } - - else if (whatToDo=="STRIP_FRONT_E_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_StripFront_E_Threshold = atoi(DataBuffer.c_str()); - cout << whatToDo << " " << m_StripFront_E_Threshold << endl; - } - - else if (whatToDo=="STRIP_BACK_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_StripBack_E_Threshold = atoi(DataBuffer.c_str()); - cout << whatToDo << " " << m_StripBack_E_Threshold << endl; - } - - else { - ReadingStatus = false; - } + bool ReadingStatus = false; + + cout << "\t/////////// Reading ConfigComptonTelescope.dat file ///////////" << endl; + + // path to file + string FileName = "./configs/ConfigComptonTelescope.dat"; + + // open analysis config file + ifstream AnalysisConfigFile; + AnalysisConfigFile.open(FileName.c_str()); + + if (!AnalysisConfigFile.is_open()) { + cout << "\tNo ConfigComptonTelescope.dat found: default parameters loaded for Analysis " << FileName << endl; + return; + } + cout << "\tLoading user parameters from ConfigComptonTelescope.dat " << endl; + + // storing config file in the ROOT output file + TAsciiFile* asciiConfig = RootOutput::getInstance()->GetAsciiFileAnalysisConfig(); + asciiConfig->AppendLine("%%% ConfigComptonTelescope.dat %%%"); + asciiConfig->Append(FileName.c_str()); + asciiConfig->AppendLine(""); + + // read analysis config file + string LineBuffer, DataBuffer, whatToDo; + while (!AnalysisConfigFile.eof()) { + // Pick-up next line + getline(AnalysisConfigFile, LineBuffer); + + // search for "header" + if (LineBuffer.compare(0, 22, "ConfigComptonTelescope") == 0) ReadingStatus = true; + + // loop on tokens and data + while (ReadingStatus) { + whatToDo = ""; + AnalysisConfigFile >> whatToDo; + + // Search for comment symbol (%) + if (whatToDo.compare(0, 1, "%") == 0) { + AnalysisConfigFile.ignore(numeric_limits<streamsize>::max(), '\n' ); + } + + else if (whatToDo == "MAX_STRIP_MULTIPLICITY") { + AnalysisConfigFile >> DataBuffer; + m_MaximumStripMultiplicityAllowed = atoi(DataBuffer.c_str()); + cout << "\t" << whatToDo << "\t" << m_MaximumStripMultiplicityAllowed << endl; + } + + else if (whatToDo == "FRONT_BACK_ENERGY_MATCHING_SIGMA") { + AnalysisConfigFile >> DataBuffer; + m_StripEnergyMatchingSigma = atof(DataBuffer.c_str()); + cout << "\t" << whatToDo << "\t" << m_StripEnergyMatchingSigma << endl; + } + + else if (whatToDo == "FRONT_BACK_ENERGY_MATCHING_NUMBER_OF_SIGMA") { + AnalysisConfigFile >> DataBuffer; + m_StripEnergyMatchingNumberOfSigma = atoi(DataBuffer.c_str()); + cout << "\t" << whatToDo << "\t" << m_StripEnergyMatchingNumberOfSigma << endl; + } + + else if (whatToDo == "DISABLE_ALL") { + AnalysisConfigFile >> DataBuffer; + cout << "\t" << whatToDo << "\t" << DataBuffer << endl; + Int_t Detector = atoi(DataBuffer.substr(2,1).c_str()); + vector< bool > ChannelStatus; + ChannelStatus.resize(m_NumberOfStrips, false); + m_FrontChannelStatus[Detector-1] = ChannelStatus; + m_BackChannelStatus[Detector-1] = ChannelStatus; + } + + else if (whatToDo == "DISABLE_CHANNEL") { + AnalysisConfigFile >> DataBuffer; + cout << "\t" << whatToDo << "\t" << DataBuffer << endl; + Int_t Detector = atoi(DataBuffer.substr(2,1).c_str()); + Int_t channel = -1; + if (DataBuffer.compare(3,4,"FRONT") == 0) { + channel = atoi(DataBuffer.substr(7).c_str()); + *(m_FrontChannelStatus[Detector-1].begin()+channel) = false; + } + else if (DataBuffer.compare(3,4,"BACK") == 0) { + channel = atoi(DataBuffer.substr(7).c_str()); + *(m_BackChannelStatus[Detector-1].begin()+channel) = false; + } + } + + else if (whatToDo=="TAKE_E_FRONT") { + m_Take_E_Front = true; + cout << whatToDo << endl; + } + + else if (whatToDo=="TAKE_E_BACK") { + m_Take_E_Front = false; + cout << whatToDo << endl; + } + + else if (whatToDo=="STRIP_FRONT_E_RAW_THRESHOLD") { + AnalysisConfigFile >> DataBuffer; + m_StripFront_E_RAW_Threshold = atoi(DataBuffer.c_str()); + cout << whatToDo << " " << m_StripFront_E_RAW_Threshold << endl; + } + + else if (whatToDo=="STRIP_BACK_E_RAW_THRESHOLD") { + AnalysisConfigFile >> DataBuffer; + m_StripBack_E_RAW_Threshold = atoi(DataBuffer.c_str()); + cout << whatToDo << " " << m_StripBack_E_RAW_Threshold << endl; + } + + else if (whatToDo=="STRIP_FRONT_E_THRESHOLD") { + AnalysisConfigFile >> DataBuffer; + m_StripFront_E_Threshold = atoi(DataBuffer.c_str()); + cout << whatToDo << " " << m_StripFront_E_Threshold << endl; + } + + else if (whatToDo=="STRIP_BACK_THRESHOLD") { + AnalysisConfigFile >> DataBuffer; + m_StripBack_E_Threshold = atoi(DataBuffer.c_str()); + cout << whatToDo << " " << m_StripBack_E_Threshold << endl; + } + + else { + ReadingStatus = false; } - } - cout << "\t/////////////////////////////////////////////////" << endl; + } + } + cout << "\t/////////////////////////////////////////////////" << endl; } @@ -343,23 +343,23 @@ void TComptonTelescopePhysics::ReadAnalysisConfig() /////////////////////////////////////////////////////////////////////////// void TComptonTelescopePhysics::Clear() { - EventMultiplicity = 0; - - // Provide a Classification of Event - EventType.clear(); - - // Detector - DetectorNumber.clear(); - - // DSSD - Strip_E.clear(); - Strip_T.clear(); - StripFront_E.clear(); - StripFront_T.clear(); - StripBack_E.clear(); - StripBack_T.clear(); - Strip_Front.clear(); - Strip_Back.clear(); + EventMultiplicity = 0; + + // Provide a Classification of Event + EventType.clear(); + + // Detector + DetectorNumber.clear(); + + // DSSD + Strip_E.clear(); + Strip_T.clear(); + StripFront_E.clear(); + StripFront_T.clear(); + StripBack_E.clear(); + StripBack_T.clear(); + Strip_Front.clear(); + Strip_Back.clear(); } @@ -368,164 +368,39 @@ void TComptonTelescopePhysics::Clear() //// Innherited from VDetector Class //// /////////////////////////////////////////////////////////////////////////// -void TComptonTelescopePhysics::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double R,Phi,Z; - R = 0 ; Phi = 0 ; Z = 0; - TVector3 Pos; - bool check_R = false ; - bool check_Phi = false ; - bool check_Z = false ; - - bool ReadingStatusQQQ = false ; - bool ReadingStatusBOX = false ; - bool ReadingStatus = false ; - - bool VerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); ; - - while (!ConfigFile.eof()){ - - getline(ConfigFile, LineBuffer); - // cout << LineBuffer << endl; - if (LineBuffer.compare(0, 16, "ComptonTelescope") == 0) - ReadingStatus = true; - - while (ReadingStatus && !ConfigFile.eof()) { - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // CD case - if (DataBuffer=="ComptonTelescopeQQQ"){ - if(VerboseLevel) cout << "///" << endl ; - if(VerboseLevel) cout << "QQQ Quadrant found: " << endl ; - ReadingStatusQQQ = true ; - } - - // Box case - else if (DataBuffer=="ComptonTelescopeBOX"){ - if(VerboseLevel) cout << "///" << endl ; - if(VerboseLevel) cout << "Box Detector found: " << endl ; - ReadingStatusBOX = true ; - } - - // Reading Block - while(ReadingStatusQQQ){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - //Position method - else if (DataBuffer == "Z=") { - check_Z = true; - ConfigFile >> DataBuffer ; - Z= atof(DataBuffer.c_str()); - if(VerboseLevel) cout << " Z= " << Z << "mm" << endl; - } - - else if (DataBuffer == "R=") { - check_R = true; - ConfigFile >> DataBuffer ; - R= atof(DataBuffer.c_str()); - if(VerboseLevel) cout << " R= " << R << "mm" << endl; - } - - else if (DataBuffer == "Phi=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi= atof(DataBuffer.c_str()); - if(VerboseLevel) cout << " Phi= " << Phi << "deg" << endl; - } - - else if (DataBuffer == "ThicknessDector=") { - /*ignore that*/ - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatusQQQ = false; - cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << endl ; - exit(1); - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_R && check_Phi && check_Z){ - - ReadingStatusQQQ = false; -// AddQQQDetector(R,Phi,Z); - // Reinitialisation of Check Boolean - check_R = false ; - check_Phi = false ; - } - - } - - while(ReadingStatusBOX){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - //Position method - else if (DataBuffer == "Z=") { - check_Z = true; - ConfigFile >> DataBuffer ; - Z= atof(DataBuffer.c_str()); - if(VerboseLevel) cout << " Z= " << Z << "mm" << endl; - } - - else if (DataBuffer == "ThicknessDector1=") { - /*ignore this */ - } - - else if (DataBuffer == "ThicknessDector2=") { - /*ignore this */ - } - - else if (DataBuffer == "ThicknessDector3=") { - /*ignore this */ - } - - else if (DataBuffer == "ThicknessDector4=") { - /*ignore this */ - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatusBOX = false; - cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << endl ; - exit(1); - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_Z){ - ReadingStatusBOX = false; -// AddBoxDetector(Z); - // Reinitialisation of Check Boolean - check_R = false ; - check_Phi = false ; - check_Z = false ; - - } - } +void TComptonTelescopePhysics::ReadConfiguration(NPL::InputParser parser){ + + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("ComptonTelescope"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> token = {"R","THETA","PHI","BETA","SIZE_DSSSD","NUMBER_DSSSD","DISTANCE_INTER_DSSSD","THICKNESS_DSSSD","NUMBER_STRIPS","DISTANCE_TRACKER_CALORIMETER","THICKNESS_CALORIMETER","TRACKER","CALORIMETER","VIS"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + double size = blocks[i]->GetDouble("SIZE_DSSSD","mm"); + int nbr_det = blocks[i]->GetInt("NUMBER_DSSSD"); + double inter = blocks[i]->GetDouble("DISTANCE_INTER_DSSSD","mm"); + double thickness = blocks[i]->GetDouble("THICKNESS_DSSSD","mm"); + int nbr_strip = blocks[i]->GetInt("NUMBER_STRIPS"); + double distance_cal = blocks[i]->GetDouble("DISTANCE_TRACKER_CALORIMETER","mm"); + double thickness_cal = blocks[i]->GetDouble("THICKNESS_CALORIMETER","mm"); + int tracker = blocks[i]->GetInt("TRACKER"); + int calorimeter = blocks[i]->GetInt("CALORIMETER"); + int vis= blocks[i]->GetInt("VIS"); + AddComptonTelescope(R); + } + + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } - AddComptonTelescope(15); - InitializeStandardParameter(); ReadAnalysisConfig(); } @@ -534,56 +409,56 @@ void TComptonTelescopePhysics::ReadConfiguration(string Path){ /////////////////////////////////////////////////////////////////////////// void TComptonTelescopePhysics::AddParameterToCalibrationManager() { - CalibrationManager* Cal = CalibrationManager::getInstance(); + CalibrationManager* Cal = CalibrationManager::getInstance(); - for (int i = 0; i < m_NumberOfDetectors; ++i) { - for (int j = 0; j < m_NumberOfStrips; ++j) { - Cal->AddParameter("COMPTONTELESCOPE", "D"+ NPL::itoa(i+1)+"_STRIP_FRONT"+ NPL::itoa(j)+"_E", "COMPTONTELESCOPE_D"+ NPL::itoa(i+1)+"_STRIP_FRONT"+ NPL::itoa(j)+"_E"); - Cal->AddParameter("COMPTONTELESCOPE", "D"+ NPL::itoa(i+1)+"_STRIP_FRONT"+ NPL::itoa(j)+"_T", "COMPTONTELESCOPE_D"+ NPL::itoa(i+1)+"_STRIP_FRONT"+ NPL::itoa(j)+"_T"); - } - for (int j = 0; j < m_NumberOfStrips; ++j) { - Cal->AddParameter("COMPTONTELESCOPE", "D"+ NPL::itoa(i+1)+"_STRIP_BACK"+ NPL::itoa(j)+"_E", "COMPTONTELESCOPE_D"+ NPL::itoa(i+1)+"_STRIP_BACK"+ NPL::itoa(j)+"_E"); - Cal->AddParameter("COMPTONTELESCOPE", "D"+ NPL::itoa(i+1)+"_STRIP_BACK"+ NPL::itoa(j)+"_T", "COMPTONTELESCOPE_D"+ NPL::itoa(i+1)+"_STRIP_BACK"+ NPL::itoa(j)+"_T"); - } - } + for (int i = 0; i < m_NumberOfDetectors; ++i) { + for (int j = 0; j < m_NumberOfStrips; ++j) { + Cal->AddParameter("COMPTONTELESCOPE", "D"+ NPL::itoa(i+1)+"_STRIP_FRONT"+ NPL::itoa(j)+"_E", "COMPTONTELESCOPE_D"+ NPL::itoa(i+1)+"_STRIP_FRONT"+ NPL::itoa(j)+"_E"); + Cal->AddParameter("COMPTONTELESCOPE", "D"+ NPL::itoa(i+1)+"_STRIP_FRONT"+ NPL::itoa(j)+"_T", "COMPTONTELESCOPE_D"+ NPL::itoa(i+1)+"_STRIP_FRONT"+ NPL::itoa(j)+"_T"); + } + for (int j = 0; j < m_NumberOfStrips; ++j) { + Cal->AddParameter("COMPTONTELESCOPE", "D"+ NPL::itoa(i+1)+"_STRIP_BACK"+ NPL::itoa(j)+"_E", "COMPTONTELESCOPE_D"+ NPL::itoa(i+1)+"_STRIP_BACK"+ NPL::itoa(j)+"_E"); + Cal->AddParameter("COMPTONTELESCOPE", "D"+ NPL::itoa(i+1)+"_STRIP_BACK"+ NPL::itoa(j)+"_T", "COMPTONTELESCOPE_D"+ NPL::itoa(i+1)+"_STRIP_BACK"+ NPL::itoa(j)+"_T"); + } + } - return; + return; } /////////////////////////////////////////////////////////////////////////// void TComptonTelescopePhysics::InitializeRootInputRaw() { - TChain* inputChain = RootInput::getInstance()->GetChain(); - inputChain->SetBranchStatus("ComptonTelescope", true); - inputChain->SetBranchStatus("fCT_*", true); - inputChain->SetBranchAddress("ComptonTelescope", &m_EventData); + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus("ComptonTelescope", true); + inputChain->SetBranchStatus("fCT_*", true); + inputChain->SetBranchAddress("ComptonTelescope", &m_EventData); } /////////////////////////////////////////////////////////////////////////// void TComptonTelescopePhysics::InitializeRootInputPhysics() { - TChain* inputChain = RootInput::getInstance()->GetChain(); - inputChain->SetBranchStatus("EventMultiplicity", true); - inputChain->SetBranchStatus("EventType", true); - inputChain->SetBranchStatus("DetectorNumber", true); - inputChain->SetBranchStatus("Strip_E", true); - inputChain->SetBranchStatus("Strip_T", true); - inputChain->SetBranchStatus("StripFront_E", true); - inputChain->SetBranchStatus("StripBack_T", true); - inputChain->SetBranchStatus("StripFront_E", true); - inputChain->SetBranchStatus("StripBack_T", true); - inputChain->SetBranchStatus("Strip_Front", true); - inputChain->SetBranchStatus("Strip_Back", true); + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus("EventMultiplicity", true); + inputChain->SetBranchStatus("EventType", true); + inputChain->SetBranchStatus("DetectorNumber", true); + inputChain->SetBranchStatus("Strip_E", true); + inputChain->SetBranchStatus("Strip_T", true); + inputChain->SetBranchStatus("StripFront_E", true); + inputChain->SetBranchStatus("StripBack_T", true); + inputChain->SetBranchStatus("StripFront_E", true); + inputChain->SetBranchStatus("StripBack_T", true); + inputChain->SetBranchStatus("Strip_Front", true); + inputChain->SetBranchStatus("Strip_Back", true); } /////////////////////////////////////////////////////////////////////////// void TComptonTelescopePhysics::InitializeRootOutput() { - TTree* outputTree = RootOutput::getInstance()->GetTree(); - outputTree->Branch("ComptonTelescope", "TComptonTelescopePhysics", &m_EventPhysics); + TTree* outputTree = RootOutput::getInstance()->GetTree(); + outputTree->Branch("ComptonTelescope", "TComptonTelescopePhysics", &m_EventPhysics); } @@ -591,44 +466,44 @@ void TComptonTelescopePhysics::InitializeRootOutput() void TComptonTelescopePhysics::AddComptonTelescope(double Z) { - m_NumberOfDetectors++; - // empty at the moment - // needed if solid angle analysis are needed + m_NumberOfDetectors++; + // empty at the moment + // needed if solid angle analysis are needed } TVector3 TComptonTelescopePhysics::GetDetectorNormal( const int i) const{ /* TVector3 U = TVector3 ( GetStripPositionX( DetectorNumber[i] , 24 , 1 ) , - GetStripPositionY( DetectorNumber[i] , 24 , 1 ) , - GetStripPositionZ( DetectorNumber[i] , 24 , 1 ) ) - - -TVector3 ( GetStripPositionX( DetectorNumber[i] , 1 , 1 ) , - GetStripPositionY( DetectorNumber[i] , 1 , 1 ) , - GetStripPositionZ( DetectorNumber[i] , 1 , 1 ) ); - - TVector3 V = TVector3 ( GetStripPositionX( DetectorNumber[i] , 24 , 48 ) , - GetStripPositionY( DetectorNumber[i] , 24 , 48 ) , - GetStripPositionZ( DetectorNumber[i] , 24 , 48 ) ) - - -TVector3 ( GetStripPositionX( DetectorNumber[i] , 24 , 1 ) , - GetStripPositionY( DetectorNumber[i] , 24 , 1 ) , - GetStripPositionZ( DetectorNumber[i] , 24 , 1 ) ); - - TVector3 Normal = U.Cross(V); - - return(Normal.Unit()) ;*/ - + GetStripPositionY( DetectorNumber[i] , 24 , 1 ) , + GetStripPositionZ( DetectorNumber[i] , 24 , 1 ) ) + + -TVector3 ( GetStripPositionX( DetectorNumber[i] , 1 , 1 ) , + GetStripPositionY( DetectorNumber[i] , 1 , 1 ) , + GetStripPositionZ( DetectorNumber[i] , 1 , 1 ) ); + + TVector3 V = TVector3 ( GetStripPositionX( DetectorNumber[i] , 24 , 48 ) , + GetStripPositionY( DetectorNumber[i] , 24 , 48 ) , + GetStripPositionZ( DetectorNumber[i] , 24 , 48 ) ) + + -TVector3 ( GetStripPositionX( DetectorNumber[i] , 24 , 1 ) , + GetStripPositionY( DetectorNumber[i] , 24 , 1 ) , + GetStripPositionZ( DetectorNumber[i] , 24 , 1 ) ); + + TVector3 Normal = U.Cross(V); + + return(Normal.Unit()) ;*/ + return (TVector3(0,0,i)); - + } TVector3 TComptonTelescopePhysics::GetPositionOfInteraction(const int i) const{ TVector3 Position = TVector3 ( GetStripPositionX( DetectorNumber[i] , Strip_Front[i] , Strip_Back[i] ) , - GetStripPositionY( DetectorNumber[i] , Strip_Front[i] , Strip_Back[i] ) , - GetStripPositionZ( DetectorNumber[i] , Strip_Front[i] , Strip_Back[i] ) ) ; + GetStripPositionY( DetectorNumber[i] , Strip_Front[i] , Strip_Back[i] ) , + GetStripPositionZ( DetectorNumber[i] , Strip_Front[i] , Strip_Back[i] ) ) ; return(Position) ; - + } @@ -636,18 +511,18 @@ TVector3 TComptonTelescopePhysics::GetPositionOfInteraction(const int i) const{ /////////////////////////////////////////////////////////////////////////// void TComptonTelescopePhysics::InitializeStandardParameter() { - // Enable all channels - vector<bool> ChannelStatus; - m_FrontChannelStatus.clear(); - m_BackChannelStatus.clear(); - - ChannelStatus.resize(m_NumberOfStrips, true); - for(Int_t i = 0; i < m_NumberOfDetectors; ++i) { - m_FrontChannelStatus[i] = ChannelStatus; - m_BackChannelStatus[i] = ChannelStatus; - } - - m_MaximumStripMultiplicityAllowed = m_NumberOfDetectors; + // Enable all channels + vector<bool> ChannelStatus; + m_FrontChannelStatus.clear(); + m_BackChannelStatus.clear(); + + ChannelStatus.resize(m_NumberOfStrips, true); + for(Int_t i = 0; i < m_NumberOfDetectors; ++i) { + m_FrontChannelStatus[i] = ChannelStatus; + m_BackChannelStatus[i] = ChannelStatus; + } + + m_MaximumStripMultiplicityAllowed = m_NumberOfDetectors; } @@ -655,7 +530,7 @@ void TComptonTelescopePhysics::InitializeStandardParameter() /////////////////////////////////////////////////////////////////////////// void TComptonTelescopePhysics::InitSpectra() { - m_Spectra = new TComptonTelescopeSpectra(m_NumberOfDetectors); + m_Spectra = new TComptonTelescopeSpectra(m_NumberOfDetectors); } @@ -663,9 +538,9 @@ void TComptonTelescopePhysics::InitSpectra() /////////////////////////////////////////////////////////////////////////// void TComptonTelescopePhysics::FillSpectra() { - m_Spectra->FillRawSpectra(m_EventData); - m_Spectra->FillPreTreatedSpectra(m_PreTreatedData); - m_Spectra->FillPhysicsSpectra(m_EventPhysics); + m_Spectra->FillRawSpectra(m_EventData); + m_Spectra->FillPreTreatedSpectra(m_PreTreatedData); + m_Spectra->FillPhysicsSpectra(m_EventPhysics); } @@ -673,7 +548,7 @@ void TComptonTelescopePhysics::FillSpectra() /////////////////////////////////////////////////////////////////////////// void TComptonTelescopePhysics::CheckSpectra() { - m_Spectra->CheckSpectra(); + m_Spectra->CheckSpectra(); } @@ -681,7 +556,7 @@ void TComptonTelescopePhysics::CheckSpectra() /////////////////////////////////////////////////////////////////////////// void TComptonTelescopePhysics::ClearSpectra() { - // To be done + // To be done } @@ -689,7 +564,7 @@ void TComptonTelescopePhysics::ClearSpectra() /////////////////////////////////////////////////////////////////////////// void TComptonTelescopePhysics::WriteSpectra() { - m_Spectra->WriteSpectra(); + m_Spectra->WriteSpectra(); } @@ -697,12 +572,12 @@ void TComptonTelescopePhysics::WriteSpectra() /////////////////////////////////////////////////////////////////////////// map<string, TH1*> TComptonTelescopePhysics::GetSpectra() { - if (m_Spectra) - return m_Spectra->GetMapHisto(); - else { - map<string, TH1*> empty; - return empty; - } + if (m_Spectra) + return m_Spectra->GetMapHisto(); + else { + map<string, TH1*> empty; + return empty; + } } @@ -710,18 +585,18 @@ map<string, TH1*> TComptonTelescopePhysics::GetSpectra() /////////////////////////////////////////////////////////////////////////// namespace ComptonTelescope_LOCAL { - // DSSD - // Front - Double_t fStrip_Front_E(const TComptonTelescopeData* m_EventData, const int i) - { - return CalibrationManager::getInstance()->ApplyCalibration("COMPTONTELESCOPE/D" + NPL::itoa(m_EventData->GetCTTrackerFrontEDetectorNbr(i)) + "_STRIP_FRONT" + NPL::itoa(m_EventData->GetCTTrackerFrontEStripNbr(i)) + "_E", m_EventData->GetCTTrackerFrontEEnergy(i)); - } - - // Back - Double_t fStrip_Back_E(const TComptonTelescopeData* m_EventData, const int i) - { - return CalibrationManager::getInstance()->ApplyCalibration("COMPTONTELESCOPE/D" + NPL::itoa(m_EventData->GetCTTrackerBackEDetectorNbr(i)) + "_STRIP_BACK" + NPL::itoa(m_EventData->GetCTTrackerBackEStripNbr(i)) + "_E", m_EventData->GetCTTrackerBackEEnergy(i)); - } + // DSSD + // Front + Double_t fStrip_Front_E(const TComptonTelescopeData* m_EventData, const int i) + { + return CalibrationManager::getInstance()->ApplyCalibration("COMPTONTELESCOPE/D" + NPL::itoa(m_EventData->GetCTTrackerFrontEDetectorNbr(i)) + "_STRIP_FRONT" + NPL::itoa(m_EventData->GetCTTrackerFrontEStripNbr(i)) + "_E", m_EventData->GetCTTrackerFrontEEnergy(i)); + } + + // Back + Double_t fStrip_Back_E(const TComptonTelescopeData* m_EventData, const int i) + { + return CalibrationManager::getInstance()->ApplyCalibration("COMPTONTELESCOPE/D" + NPL::itoa(m_EventData->GetCTTrackerBackEDetectorNbr(i)) + "_STRIP_BACK" + NPL::itoa(m_EventData->GetCTTrackerBackEStripNbr(i)) + "_E", m_EventData->GetCTTrackerBackEEnergy(i)); + } } diff --git a/NPLib/Detectors/ComptonTelescope/TComptonTelescopePhysics.h b/NPLib/Detectors/ComptonTelescope/TComptonTelescopePhysics.h index f4aa0fa3a30a6993353774d2f2d2eed7d3c6e879..10da70e5647e5bce2602ded33d3895c4d9b02b10 100644 --- a/NPLib/Detectors/ComptonTelescope/TComptonTelescopePhysics.h +++ b/NPLib/Detectors/ComptonTelescope/TComptonTelescopePhysics.h @@ -32,6 +32,7 @@ using namespace std; #include "NPCalibrationManager.h" #include "NPVDetector.h" +#include "NPInputParser.h" // ROOT #include "TVector2.h" @@ -69,7 +70,7 @@ class TComptonTelescopePhysics : public TObject, public NPL::VDetector public: // inherited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add parameters to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/Detectors/CsI/TCsIPhysics.cxx b/NPLib/Detectors/CsI/TCsIPhysics.cxx index e1c7223ef45b300d9b738620175678595b09014d..99240cc2819f94a89a319f0e2caaa1eb736380d3 100644 --- a/NPLib/Detectors/CsI/TCsIPhysics.cxx +++ b/NPLib/Detectors/CsI/TCsIPhysics.cxx @@ -12,7 +12,7 @@ * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class hold CsI Physics * + * This class hold CsI Physics * * * *---------------------------------------------------------------------------* * Comment: * @@ -26,6 +26,7 @@ #include "RootOutput.h" #include "NPDetectorFactory.h" #include "NPCalibrationManager.h" +#include "NPOptionManager.h" // STL #include <iostream> @@ -69,244 +70,78 @@ void TCsIPhysics::Clear() } /////////////////////////////////////////////////////////////////////////// -void TCsIPhysics::ReadConfiguration(string Path) -{ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double Theta = 0 , Phi = 0 , R = 0 , Thickness = 0 , Radius = 0 ; - double LeadThickness = 0, X = 0 , Y = 0 , Z = 0 , FaceFront = 0 , FaceBack = 0 ; - string Scintillator, Shape ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool check_Thickness = false ; - bool check_Radius = false ; - bool check_LeadThickness = false ; - bool check_Scintillator = false ; - bool check_FaceFront = false ; - bool check_FaceBack = false ; - bool check_Shape = false ; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - bool ReadingStatus = false ; - - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Start Up CsI bloc, Reading toggle to true - if (LineBuffer.compare(0, 3, "CsI") == 0) { - cout << "///" << endl ; - cout << "CsI found: " << endl ; - ReadingStatus = true ; - - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 3, "CsI") == 0) { - cout << "WARNING: Another Telescope is find before standard sequence of Token, Error may occured in Telecope definition" << endl ; - ReadingStatus = false ; - } - - //Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta ; - cout << "Theta: " << Theta << " deg" << endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi ; - cout << "Phi: " << Phi << " deg" << endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R ; - cout << "R: " << R << " mm" << endl; - } - - //Position method - else if (DataBuffer.compare(0, 2, "X=") == 0) { - check_X = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - X = X ; - cout << "X: " << X << " mm" << endl; - } - - else if (DataBuffer.compare(0, 2, "Y=") == 0) { - check_Y = true; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - Y = Y ; - cout << "Y: " << Y << " mm" << endl; - } - - else if (DataBuffer.compare(0, 2, "Z=") == 0) { - check_Z = true; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - Z = Z ; - cout << "Z: " << Z << " mm" << endl; - } - - - //General - else if (DataBuffer.compare(0, 6, "Shape=") == 0) { - check_Shape = true; - ConfigFile >> DataBuffer ; - Shape = DataBuffer ; - cout << "Shape: " << Shape << endl; - } - - // Cylindrical shape - else if (DataBuffer.compare(0, 7, "Radius=") == 0) { - check_Radius = true; - ConfigFile >> DataBuffer ; - Radius = atof(DataBuffer.c_str()) ; - Radius = Radius ; - cout << "CsI Radius: " << Radius << " mm" << endl; - } - - // Trapezoidal shape - else if (DataBuffer.compare(0, 10, "FaceFront=") == 0) { - check_FaceFront = true; - ConfigFile >> DataBuffer ; - FaceFront = atof(DataBuffer.c_str()) ; - FaceFront = FaceFront; - cout << "CsI FaceFront: " << FaceFront << " mm" << endl; - } - - else if (DataBuffer.compare(0, 9, "FaceBack=") == 0) { - check_FaceBack = true; - ConfigFile >> DataBuffer ; - FaceBack = atof(DataBuffer.c_str()) ; - FaceBack = FaceBack ; - cout << "CsI FaceBack: " << FaceBack << " mm" << endl; - } - - // Common - else if (DataBuffer.compare(0, 10, "Thickness=") == 0) { - check_Thickness = true; - ConfigFile >> DataBuffer ; - Thickness = atof(DataBuffer.c_str()) ; - Thickness = Thickness; - cout << "CsI Thickness: " << Thickness << " mm" << endl; - } - - else if (DataBuffer.compare(0, 13, "Scintillator=") == 0) { - check_Scintillator = true ; - ConfigFile >> DataBuffer ; - Scintillator = DataBuffer ; - cout << "CsI Scintillator type: " << Scintillator << endl; - } - - else if (DataBuffer.compare(0, 14, "LeadThickness=") == 0) { - check_LeadThickness = true; - ConfigFile >> DataBuffer ; - LeadThickness = atof(DataBuffer.c_str()) ; - LeadThickness = LeadThickness ; - cout << "Lead Thickness : " << LeadThickness << " mm" << endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; - cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (( check_Theta && check_Phi && check_R && check_Thickness - && check_Radius && check_LeadThickness && check_Scintillator - && check_Shape) // Cylindrical case - || - ( check_X && check_Y && check_Z && check_Thickness && check_Radius - && check_LeadThickness && check_Scintillator ) - || - ( check_Theta && check_Phi && check_R && check_Thickness - && check_FaceBack && check_FaceFront && check_LeadThickness - && check_Scintillator && check_Shape ) // Trapezoidal case - || - ( check_X && check_Y && check_Z && check_Thickness && check_FaceBack - && check_FaceFront && check_LeadThickness && check_Scintillator )) { - - if (check_X && check_Y && check_Z){ - R = sqrt (X*X+Y*Y+Z*Z); - Theta = acos(Z / (R) ); - Phi = atan2(Y,X); - } - - /*if (Shape == "Cylinder") - AddCsI( R , - Theta , - Phi , - Thickness , - Radius , - Scintillator , - LeadThickness ); - - else if (Shape == "Trapezoidal") - AddCsI( R , - Theta , - Phi , - FaceFront , - FaceBack , - Thickness , - Scintillator , - LeadThickness );*/ - - // Reinitialisation of Check Boolean - - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_Thickness = false ; - check_Radius = false ; - check_LeadThickness = false ; - check_Scintillator = false ; - check_FaceFront = false ; - check_FaceBack = false ; - check_Shape = false ; - check_X = false ; - check_Y = false ; - check_Z = false ; - ReadingStatus = false ; - cout << "///"<< endl ; - } - } +void TCsIPhysics::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("CsI"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> cart = {"X","Y","Z"}; + vector<string> sphe = {"R","Theta","Phi"}; + vector<string> trapez= {"Shape","FaceFront","FaceBack","Thickness","Scintillator","LeadThickness"}; + vector<string> cylind= {"Shape","Radius","Thickness","Scintillator","LeadThickness"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Plastic " << i+1 << endl; + double X = blocks[i]->GetDouble("X","mm"); + double Y = blocks[i]->GetDouble("Y","mm"); + double Z = blocks[i]->GetDouble("Z","mm"); + double R = sqrt (X*X+Y*Y+Z*Z); + double Theta = acos(Z / (R) ); + double Phi = atan2(Y,X); + + if(blocks[i]->HasTokenList(trapez)){ + string Shape = blocks[i]->GetString("Shape"); + double FaceFront = blocks[i]->GetDouble("FaceFront","mm"); + double FaceBack = blocks[i]->GetDouble("FaceBack","mm"); + double Thickness = blocks[i]->GetDouble("Thickness","mm"); + string Scintillator= blocks[i]->GetString("Scintillator"); + double LeadThickness = blocks[i]->GetDouble("LeadThickness","mm"); + } + + else if(blocks[i]->HasTokenList(cylind)){ + string Shape = blocks[i]->GetString("Shape"); + double Radius = blocks[i]->GetDouble("Radius","mm"); + double Thickness = blocks[i]->GetDouble("Thickness","mm"); + string Scintillator= blocks[i]->GetString("Scintillator"); + double LeadThickness = blocks[i]->GetDouble("LeadThickness","mm"); + } + } -} + else if(blocks[i]->HasTokenList(sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Plastic " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + + if(blocks[i]->HasTokenList(trapez)){ + string Shape = blocks[i]->GetString("Shape"); + double FaceFront = blocks[i]->GetDouble("FaceFront","mm"); + double FaceBack = blocks[i]->GetDouble("FaceBack","mm"); + double Thickness = blocks[i]->GetDouble("Thickness","mm"); + string Scintillator = blocks[i]->GetString("Scintillator"); + double LeadThickness = blocks[i]->GetDouble("LeadThickness","mm"); + } + + else if(blocks[i]->HasTokenList(cylind)){ + string Shape = blocks[i]->GetString("Shape"); + double Radius = blocks[i]->GetDouble("Radius","mm"); + double Thickness = blocks[i]->GetDouble("Thickness","mm"); + string Scintillator = blocks[i]->GetString("Scintillator"); + double LeadThickness = blocks[i]->GetDouble("LeadThickness","mm"); + } -/////////////////////////////////////////////////////////////////////////// + } + + + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } +}/////////////////////////////////////////////////////////////////////////// void TCsIPhysics::AddParameterToCalibrationManager() { CalibrationManager* Cal = CalibrationManager::getInstance(); diff --git a/NPLib/Detectors/CsI/TCsIPhysics.h b/NPLib/Detectors/CsI/TCsIPhysics.h index 9ca30b7a9b7ebf0ac794cdbe5c8622204295c0b0..cfcc60a58ad397e6cd4e541fbfb1baeaf801d244 100644 --- a/NPLib/Detectors/CsI/TCsIPhysics.h +++ b/NPLib/Detectors/CsI/TCsIPhysics.h @@ -32,6 +32,7 @@ using namespace std ; // NPL #include "TCsIData.h" #include "NPVDetector.h" +#include "NPInputParser.h" //#include "../include/CalibrationManager.h" @@ -52,7 +53,7 @@ class TCsIPhysics : public TObject, public NPL::VDetector public: // inherrited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManger diff --git a/NPLib/Detectors/EXL/TExlPhysics.cxx b/NPLib/Detectors/EXL/TExlPhysics.cxx index 593c54cd14e252ece3ae19bc6467478068d2fc0f..cf3180dad3eeac95d5a8159fa4534d6781df05ba 100644 --- a/NPLib/Detectors/EXL/TExlPhysics.cxx +++ b/NPLib/Detectors/EXL/TExlPhysics.cxx @@ -25,7 +25,7 @@ #include "RootOutput.h" #include "RootInput.h" #include "NPDetectorFactory.h" - +#include "NPOptionManager.h" // STL #include <sstream> #include <iostream> @@ -69,132 +69,26 @@ void TExlPhysics::Clear() } /////////////////////////////////////////////////////////////////////////// -void TExlPhysics::ReadConfiguration(string Path) - { - - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double Centerx , Centery , Centerz; - double CenterR, CenterTheta, CenterPhi; - TVector3 Center; - vector <TVector3> Center_CsI_Crystals; - - bool check_CsI_X_Y_Z = false ; - bool check_NumberOfCrystal = false ; - bool check_CsI_R_Theta_Phi = false ; - bool ReadingStatus = false ; - - while (!ConfigFile.eof()) - { - - getline(ConfigFile, LineBuffer); - - // If line is a Start Up EXL bloc, Reading toggle to true - if (LineBuffer.compare(0, 3, "EXL") == 0) - { - cout << "///" << endl ; - cout << "EXL found ! " << endl ; - ReadingStatus = true ; - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus) - { - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 3, "EXL") == 0) { - cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in EXL definition" << endl ; - ReadingStatus = false ; - } - - else if (DataBuffer=="NumberOfCrystal=") { - check_NumberOfCrystal = true; - ConfigFile >> DataBuffer ; - NumberOfCrystal=atof(DataBuffer.c_str()); - cout << "NumberOfCrystal: " << atof(DataBuffer.c_str()) << endl; - } - - // Position method - else if (DataBuffer=="CsI_X_Y_Z=") { - check_CsI_X_Y_Z = true; - ConfigFile >> DataBuffer ; - Centerx = atof(DataBuffer.c_str()) ; - Centerx = Centerx ; - ConfigFile >> DataBuffer ; - Centery = atof(DataBuffer.c_str()) ; - Centery = Centery ; - ConfigFile >> DataBuffer ; - Centerz = atof(DataBuffer.c_str()) ; - Centerz = Centerz ; - - Center = TVector3(Centerx, Centery, Centerz); - Center_CsI_Crystals.push_back(Center); - cout << "CsI crystal position : (" << Center.X() << ";" << Center.Y() << ";" << Center.Z() << ")" << endl; - } - - // Angle method - else if (DataBuffer=="CsI_R_Theta_Phi=") { - check_CsI_R_Theta_Phi = true; - ConfigFile >> DataBuffer ; - CenterR = atof(DataBuffer.c_str()) ; - CenterR = CenterR ; - ConfigFile >> DataBuffer ; - CenterTheta = atof(DataBuffer.c_str()) ; - CenterTheta = CenterTheta*3.141592654/180 ; - ConfigFile >> DataBuffer ; - CenterPhi = atof(DataBuffer.c_str()) ; - CenterPhi = CenterPhi*3.141592654/180 ; - - Center = TVector3(CenterR*sin(CenterTheta)*cos(CenterPhi), CenterR*sin(CenterTheta)*sin(CenterPhi), CenterR*cos(CenterTheta)); - Center_CsI_Crystals.push_back(Center); - cout << "CsI crystal position : (" << Center.X() << ";" << Center.Y() << ";" << Center.Z() << ")" << endl; - } - - - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else - {ReadingStatus = false; cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ;} - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if ((NumberOfCrystal == Center_CsI_Crystals.size() && check_CsI_R_Theta_Phi && check_NumberOfCrystal) || (NumberOfCrystal == Center_CsI_Crystals.size() && check_CsI_X_Y_Z && check_NumberOfCrystal)) - { - //with angle method - if (check_CsI_R_Theta_Phi) - { - AddEXL(Center_CsI_Crystals) ; - } - //With position method - if (check_CsI_X_Y_Z) - { - AddEXL(Center_CsI_Crystals) ; - } - // Reinitialisation of Check Boolean - ReadingStatus = false; - check_NumberOfCrystal = false; - check_CsI_X_Y_Z = false; - check_CsI_R_Theta_Phi = false ; - Center_CsI_Crystals.clear(); - cout << "///"<< endl ; - } - } - } +void TExlPhysics::ReadConfiguration(NPL::InputParser parser) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("EXL"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> token= {"POS"}; + vector<TVector3> Center_CsI_Crystals; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + TVector3 pos = blocks[i]->GetTVector3("POS","mm"); + Center_CsI_Crystals.push_back(pos); + } - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } + AddEXL(Center_CsI_Crystals) ; +} /////////////////////////////////////////////////////////////////////////// void TExlPhysics::AddEXL(vector <TVector3> Center_CsI_Crystals) { diff --git a/NPLib/Detectors/EXL/TExlPhysics.h b/NPLib/Detectors/EXL/TExlPhysics.h index cb05b6ae3a9696678362463694cca4db891a6048..dc634f19296743e77637f121175045b50121ad7b 100644 --- a/NPLib/Detectors/EXL/TExlPhysics.h +++ b/NPLib/Detectors/EXL/TExlPhysics.h @@ -35,7 +35,7 @@ using namespace std ; #include "TExlData.h" #include "NPVDetector.h" #include "NPCalibrationManager.h" - +#include "NPInputParser.h" class TExlPhysics : public TObject, public NPL::VDetector { public: // Constructor and Destructor @@ -53,7 +53,7 @@ class TExlPhysics : public TObject, public NPL::VDetector public: // inherrited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManger diff --git a/NPLib/Detectors/Exogam/TExogamPhysics.cxx b/NPLib/Detectors/Exogam/TExogamPhysics.cxx index 580b64ea9d947e673f161177b2b1b43856cb9e96..ae2bc294666a2e2af119c2b2c4a214960aa4e031 100644 --- a/NPLib/Detectors/Exogam/TExogamPhysics.cxx +++ b/NPLib/Detectors/Exogam/TExogamPhysics.cxx @@ -32,6 +32,7 @@ using namespace EXOGAM_LOCAL; #include "NPDetectorFactory.h" #include "RootOutput.h" #include "NPVDetector.h" +#include "NPOptionManager.h" // ROOT #include "TChain.h" @@ -458,83 +459,24 @@ void TExogamPhysics::Clear() //// Innherited from VDetector Class //// // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token -void TExogamPhysics::ReadConfiguration(string Path) -{ - - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer ; - string DataBuffer ; - string AngleFile ; - - - bool check_C = false ; - - bool ReadingStatus = false ; - - +void TExogamPhysics::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("EXOGAMClover"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; - while (!ConfigFile.eof()) - { - getline(ConfigFile, LineBuffer); + vector<string> token = {"EXOGAMClover"}; - //If line is a Start Up CATS bloc, Reading toggle to true - if (LineBuffer.compare(0, 12, "EXOGAMClover") == 0) - { - cout << "///" << endl ; - cout << "EXOGAM Detector found: " << endl ; - ReadingStatus = true ; - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus) - { - ConfigFile >> DataBuffer ; - // Comment Line - if(DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 12, "EXOGAMClover") == 0) { - cout << "WARNING: Another EXOGAM is found before standard sequence of Token, Error may occured in EXOGAM definition" << endl ; - ReadingStatus = false ; - } - - - // File angle method - - if (DataBuffer.compare(0, 12, "ANGLES_FILE=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - AngleFile = DataBuffer; - - cout << "File angle used : " << DataBuffer << endl; - } - - - // End File angle Method - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if (check_C) - { - ReadingStatus = false; - - ///Add The previously define telescope - - AddClover(AngleFile); - - check_C = false; - - } - } - + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + string AngleFile = blocks[i]->GetString("ANGLE_FILE"); + AddClover(AngleFile); } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } } /////////////////////////////////////////////////////////////////////////// diff --git a/NPLib/Detectors/Exogam/TExogamPhysics.h b/NPLib/Detectors/Exogam/TExogamPhysics.h index d79b478dd2865bac3dd0ae842c5146e5b3540a71..848e81eeedd0e202f544374e78c98ef17fccb04d 100644 --- a/NPLib/Detectors/Exogam/TExogamPhysics.h +++ b/NPLib/Detectors/Exogam/TExogamPhysics.h @@ -9,8 +9,8 @@ /***************************************************************************** * Original Author: S. Giron contact address: giron@ipno.in2p3.fr * - * B. Le Crom lecrom@ipno.in2p3.fr * - * Creation Date : march 2014 * + * B. Le Crom lecrom@ipno.in2p3.fr * + * Creation Date : march 2014 * * Last update : * *---------------------------------------------------------------------------* * Decription: * @@ -31,6 +31,7 @@ #include "NPVDetector.h" #include "TExogamData.h" #include "TExogamSpectra.h" +#include "NPInputParser.h" // ROOT #include "TVector2.h" #include "TVector3.h" @@ -41,8 +42,7 @@ using namespace std ; // Forward Declaration class TExogamSpectra; -class TExogamPhysics : public TObject, public NPL::VDetector -{ +class TExogamPhysics : public TObject, public NPL::VDetector{ public: TExogamPhysics() ; ~TExogamPhysics() {}; @@ -97,7 +97,7 @@ class TExogamPhysics : public TObject, public NPL::VDetector public: // Innherited from VDetector Class // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string) ; + void ReadConfiguration(NPL::InputParser) ; // Add Parameter to the CalibrationManger diff --git a/NPLib/Detectors/FPDTamu/TFPDTamuPhysics.cxx b/NPLib/Detectors/FPDTamu/TFPDTamuPhysics.cxx index 0c5aea2a0829c22277c2c45f143b7d0ea3920332..04dcc76a3d861125f5e305ccba6ffc98fda9ea1d 100644 --- a/NPLib/Detectors/FPDTamu/TFPDTamuPhysics.cxx +++ b/NPLib/Detectors/FPDTamu/TFPDTamuPhysics.cxx @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (C) 2009-2016 this file is part of the NPTool Project * + * Copyright (C) 2009-2016 this file is part of the NPTool Project * * * * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * * For the list of contributors see $NPTOOL/Licence/Contributors * @@ -36,27 +36,27 @@ using namespace std; #include "RootOutput.h" #include "NPDetectorFactory.h" #include "NPSystemOfUnits.h" - +#include "NPOptionManager.h" // ROOT #include "TChain.h" ClassImp(TFPDTamuPhysics) -/////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// TFPDTamuPhysics::TFPDTamuPhysics() - : m_EventData(new TFPDTamuData), - m_PreTreatedData(new TFPDTamuData), - m_EventPhysics(this), - m_Spectra(0), - m_E_RAW_Threshold(0), // adc channels - m_E_Threshold(0), // MeV - m_NumberOfDetectors(0), - m_NumberOfDelta(0), - m_NumberOfMicro(0), - m_NumberOfAWire(0), - m_NumberOfPlast(0){ -} + : m_EventData(new TFPDTamuData), + m_PreTreatedData(new TFPDTamuData), + m_EventPhysics(this), + m_Spectra(0), + m_E_RAW_Threshold(0), // adc channels + m_E_Threshold(0), // MeV + m_NumberOfDetectors(0), + m_NumberOfDelta(0), + m_NumberOfMicro(0), + m_NumberOfAWire(0), + m_NumberOfPlast(0){ + } @@ -76,12 +76,12 @@ void TFPDTamuPhysics::BuildPhysicalEvent() { // match the energy and time together (not implemented yet) and fill the vectors unsigned int mysizeE = m_PreTreatedData->Get_Delta_Energy_Mult(); for (UShort_t e = 0; e < mysizeE ; e++) { - DeltaDetNumber.push_back(m_PreTreatedData->Get_Delta_E_DetectorNbr(e)); - DeltaEnergy.push_back(m_PreTreatedData->Get_Delta_Energy(e)); - } + DeltaDetNumber.push_back(m_PreTreatedData->Get_Delta_E_DetectorNbr(e)); + DeltaEnergy.push_back(m_PreTreatedData->Get_Delta_Energy(e)); + } //Micro - // Time and energy can't be matched since the we have only an OR on time + // Time and energy can't be matched since we have only an OR on time // fill the vectors, calculate positions mysizeE = m_PreTreatedData->Get_Micro_Energy_Mult(); for (UShort_t e = 0; e < mysizeE ; e++) { @@ -103,7 +103,7 @@ void TFPDTamuPhysics::BuildPhysicalEvent() { MicroTime.push_back(m_PreTreatedData->Get_Micro_Time(t)); } - //AWire + //AWire //separate Left and right detectors vector<double> awireLeftDetNumber, awireRightDetNumber; vector<double> awireLeftCharge, awireRightCharge; @@ -144,11 +144,11 @@ void TFPDTamuPhysics::BuildPhysicalEvent() { } } } - // Calculate beam direction from X and Z position //check me! + // Calculate beam direction from X and Z position //check me! double a = 1, b = 0, Zplast = +547; // X = aZ + b // check me! IonDirection.SetXYZ(1,0,a); //(1,a) is the direction vector in the plane X,Z. no information about Y IonDirection.Unit(); - //Calculate position on Plastic from AWire data provided Z of the Plastic + //Calculate position on Plastic from AWire data provided Z of the Plastic PlastPositionX_AW = a*Zplast + b; //cout << " AWire Left and Right sizes are in agreement, L: " << mysizeL << " R: "<< mysizeR<<endl; //m_PreTreatedData->Dump(); @@ -168,11 +168,11 @@ void TFPDTamuPhysics::BuildPhysicalEvent() { //collect info int side = m_PreTreatedData->Get_Plast_E_DetectorSide(e); double charge = m_PreTreatedData->Get_Plast_Energy(e); - + // skip values lower than a certain threshold if (charge<100) continue; - + //redistribute if (side==1) plastRightCharge.push_back(charge); @@ -186,16 +186,16 @@ void TFPDTamuPhysics::BuildPhysicalEvent() { if (mysizeL==mysizeR){ for (UShort_t l = 0; l < mysizeL ; l++) { for (UShort_t r = 0; r < mysizeR ; r++) { - // Pass the left charge, right charge - double EnergyL = plastLeftCharge.at(l); - double EnergyR = plastRightCharge.at(r); - PlastLeftCharge.push_back(EnergyL); - PlastRightCharge.push_back(EnergyR); - // calculate position in X, Z is known - double plast_length = 2*PlastLeftPos.X()/NPUNITS::cm; //check me! - PlastCharge.push_back(sqrt(EnergyL*EnergyR)); - PlastPositionX.push_back(plast_length*(EnergyL-EnergyR)/(EnergyL+EnergyR)); - PlastPositionZ.push_back(PlastLeftPos.Z()/NPUNITS::cm); //check me!, directly from configuration + // Pass the left charge, right charge + double EnergyL = plastLeftCharge.at(l); + double EnergyR = plastRightCharge.at(r); + PlastLeftCharge.push_back(EnergyL); + PlastRightCharge.push_back(EnergyR); + // calculate position in X, Z is known + double plast_length = 2*PlastLeftPos.X()/NPUNITS::cm; //check me! + PlastCharge.push_back(sqrt(EnergyL*EnergyR)); + PlastPositionX.push_back(plast_length*(EnergyL-EnergyR)/(EnergyL+EnergyR)); + PlastPositionZ.push_back(PlastLeftPos.Z()/NPUNITS::cm); //check me!, directly from configuration } } } @@ -205,7 +205,7 @@ void TFPDTamuPhysics::BuildPhysicalEvent() { //cin.get(); } - //separate Left and right detectors + //time: separate Left and right detectors mysizeT = m_PreTreatedData->Get_Plast_Time_Mult(); for (UShort_t t = 0; t < mysizeT ; t++) { //collect info @@ -227,13 +227,13 @@ void TFPDTamuPhysics::BuildPhysicalEvent() { unsigned int mysizeT = m_PreTreatedData->Get_Delta_Time_Mult(); cout << " " << mysizeE << " " << mysizeT << endl ; for (UShort_t e = 0; e < mysizeE ; e++) { - for (UShort_t t = 0; t < mysizeT ; t++) { - if (m_PreTreatedData->Get_Delta_E_DetectorNbr(e) == m_PreTreatedData->Get_Delta_T_DetectorNbr(t)) { - DeltaDetNumber.push_back(m_PreTreatedData->Get_Delta_E_DetectorNbr(e)); - DeltaEnergy.push_back(m_PreTreatedData->Get_Delta_Energy(e)); - DeltaTime.push_back(m_PreTreatedData->Get_Delta_Time(t)); - } - } + for (UShort_t t = 0; t < mysizeT ; t++) { + if (m_PreTreatedData->Get_Delta_E_DetectorNbr(e) == m_PreTreatedData->Get_Delta_T_DetectorNbr(t)) { + DeltaDetNumber.push_back(m_PreTreatedData->Get_Delta_E_DetectorNbr(e)); + DeltaEnergy.push_back(m_PreTreatedData->Get_Delta_Energy(e)); + DeltaTime.push_back(m_PreTreatedData->Get_Delta_Time(t)); + } + } } */ @@ -243,7 +243,7 @@ double TFPDTamuPhysics::GetMicroGroupEnergy(int lrow, int hrow, int lcol, int hc int dummy,row,col; double energy = 0; - + //avoid zeros if (lrow==0 || hrow==0 || lcol==0 || hcol==0) cout << " \033[1;311mWARNING: '0' value detected, TFPDTamuPhysics::GetMicroGroupEnergy() uses values >=1 " << endl; @@ -275,7 +275,7 @@ double TFPDTamuPhysics::GetMicroRowGeomEnergy(int lrow, int hrow){ int dummy; double energy = 0; int sample = 0; - + //avoid zeros if (lrow==0 || hrow==0 ) cout << " \033[1;311mWARNING: '0' value detected, TFPDTamuPhysics::GetMicroRowGeomEnergy() uses values >=1 " << endl; @@ -287,11 +287,11 @@ double TFPDTamuPhysics::GetMicroRowGeomEnergy(int lrow, int hrow){ } // group energies for (int r = lrow; r < hrow ; r++) { - double esample = GetMicroGroupEnergy(r,r,1,7); - if( esample > 0 ){ - sample++; - energy *= esample ; - } + double esample = GetMicroGroupEnergy(r,r,1,7); + if( esample > 0 ){ + sample++; + energy *= esample ; + } } return pow(energy,1./sample) ; @@ -326,13 +326,13 @@ void TFPDTamuPhysics::PreTreat() { // Time mysize = m_EventData->Get_Delta_Time_Mult(); for (UShort_t i = 0; i < mysize ; ++i) { - name = "FPDTamu/Delta_R" ; - name+= NPL::itoa( m_EventData->Get_Delta_T_DetectorNbr(i)+1) ; - name+= "_C1_T" ; - Double_t Time = Cal->ApplyCalibration(name, m_EventData->Get_Delta_Time(i)); - m_PreTreatedData->Set_Delta_T(m_EventData->Get_Delta_T_DetectorNbr(i), Time); - } - + name = "FPDTamu/Delta_R" ; + name+= NPL::itoa( m_EventData->Get_Delta_T_DetectorNbr(i)+1) ; + name+= "_C1_T" ; + Double_t Time = Cal->ApplyCalibration(name, m_EventData->Get_Delta_Time(i)); + m_PreTreatedData->Set_Delta_T(m_EventData->Get_Delta_T_DetectorNbr(i), Time); + } + // Micromega // Energy mysize = m_EventData->Get_Micro_Energy_Mult(); @@ -365,7 +365,7 @@ void TFPDTamuPhysics::PreTreat() { } } -// AWire + // AWire // Energy mysize = m_EventData->Get_AWire_Energy_Mult(); for (UShort_t i = 0; i < mysize ; ++i) { @@ -398,7 +398,7 @@ void TFPDTamuPhysics::PreTreat() { } -// Plastic + // Plastic // Energy mysize = m_EventData->Get_Plast_Energy_Mult(); for (UShort_t i = 0; i < mysize ; ++i) { @@ -498,8 +498,8 @@ void TFPDTamuPhysics::ReadAnalysisConfig() { /////////////////////////////////////////////////////////////////////////// void TFPDTamuPhysics::Clear() { - - // Delta + + // Delta DeltaDetNumber.clear(); DeltaCharge.clear(); DeltaEnergy.clear(); @@ -529,7 +529,7 @@ void TFPDTamuPhysics::Clear() { //Calculated PlastPositionX_AW = -99 ; //from AWire and Plastic Z IonDirection.SetXYZ(0,0,0); // from AWire - + } ////////////////////////////////////////////////////////////////////// @@ -543,54 +543,54 @@ void TFPDTamuPhysics::Dump() const { cout << "E Mult: " << mysize << endl; for (size_t i = 0 ; i < mysize ; i++){ cout << "DetNbr: " << DeltaDetNumber[i] - << " Charge: " << DeltaCharge[i] - << " Energy: " << DeltaEnergy[i] - <<endl; + << " Charge: " << DeltaCharge[i] + << " Energy: " << DeltaEnergy[i] + <<endl; } // Time mysize = DeltaTime.size(); cout << "T Mult: " << mysize << endl; for (size_t i = 0 ; i < mysize ; i++){ cout << "DetNbr: " << DeltaDetNumber[i] - << " Time: " << DeltaTime[i] - <<endl; + << " Time: " << DeltaTime[i] + <<endl; } - cout << " ...oooOOOooo... Avalanche Wire ...oooOOOooo... " << endl; + cout << " ...oooOOOooo... Avalanche Wire ...oooOOOooo... " << endl; // Energy mysize = AWireLeftCharge.size(); cout << "Charge Mult: " << mysize << endl; for (size_t i = 0 ; i < mysize ; i++){ cout << "DetNbr: " << AWireDetNumber[i] - << " Left: " << AWireLeftCharge[i] - << " Right: " << AWireRightCharge[i] - << " XPos: " << AWirePositionX[i] - << " ZPos: " << AWirePositionZ[i] - <<endl; + << " Left: " << AWireLeftCharge[i] + << " Right: " << AWireRightCharge[i] + << " XPos: " << AWirePositionX[i] + << " ZPos: " << AWirePositionZ[i] + <<endl; } - cout << " ...oooOOOooo... Micromega ...oooOOOooo... " << endl; + cout << " ...oooOOOooo... Micromega ...oooOOOooo... " << endl; // Energy mysize = MicroRowNumber.size(); cout << " Row Charge:" <<endl; for (size_t i = 0 ; i < MicroRowNumber.size() ; i++) cout << " " << MicroRowNumber[i]; cout<<endl; - cout << " Col Charge:" << endl; + cout << " Col Charge:" << endl; for (size_t i = 0 ; i < MicroColNumber.size() ; i++) cout << " " << MicroColNumber[i]; cout<<endl; - cout << " energy: "<<endl; + cout << " energy: "<<endl; for (size_t i = 0 ; i < MicroColNumber.size() ; i++) cout << " " << MicroRowNumber[i]; cout<<endl; - cout << " energy: " << endl; + cout << " energy: " << endl; for (size_t i = 0 ; i < MicroColNumber.size() ; i++) cout << " " << MicroRowNumber[i]; cout<<endl; - cout << " ...oooOOOooo... Plastic Scintillator ...oooOOOooo... " << endl; - // Energy + cout << " ...oooOOOooo... Plastic Scintillator ...oooOOOooo... " << endl; + // Energy cout << " Left Charge:" ; for (size_t i = 0 ; i < PlastLeftCharge.size() ; i++) cout << " " << PlastLeftCharge[i]; @@ -616,402 +616,85 @@ void TFPDTamuPhysics::Dump() const { /////////////////////////////////////////////////////////////////////////// -void TFPDTamuPhysics::ReadConfiguration(string Path) { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double X, Y, Z; - TVector3 A(-99,-99,-99) , B(-99,-99,-99); - - //Check if geometrical position read - bool check_Delta_USL = false ; - bool check_Delta_USR = false ; - bool check_Micro_USL = false ; - bool check_Micro_USR = false ; - bool check_AWire_L = false ; - bool check_AWire_R = false ; - bool check_Plast_USL = false ; - bool check_Plast_USR = false ; - - // Check if the sub-detectors are there - bool check_Delta = false ; - bool check_Micro = false ; - bool check_AWire = false ; - bool check_Plast = false ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool check_Shape = false ; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - - //enabling readng several detectors - bool ReadingStatus = false ; - bool ReadingDelta = false ; - bool ReadingMicro = false ; - bool ReadingAWire = false ; - bool ReadingPlast = false ; - - while (!ConfigFile.eof()){ - - getline(ConfigFile, LineBuffer); - - // If line is a Start Up FPDTamu bloc, Reading toggle to true - string name="FPDTamu"; - string subname=""; - if (LineBuffer.compare(0, name.length(), name) == 0){ - cout << "///" << endl ; - cout << "FPDTamu found: " << endl ; - ReadingStatus = true ; - } - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); +void TFPDTamuPhysics::ReadConfiguration(NPL::InputParser parser) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("FPDTamu"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> token_delta = {"UPSTREAM-LEFT","UPSTREAM-RIGHT"}; + vector<string> token_micro = {"UPSTREAM-LEFT","UPSTREAM-RIGHT"}; + vector<string> token_awire = {"LEFT","RIGHT"}; + vector<string> token_plast = {"UPSTREAM-LEFT","UPSTREAM-RIGHT"}; + + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->GetMainValue() == "DELTA"){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Delta " << i+1 << endl; + + if(blocks[i]->HasTokenList(token_delta)){ + TVector3 left = blocks[i]->GetTVector3("UPSTREAM-LEFT","mm"); + TVector3 right = blocks[i]->GetTVector3("UPSTREAM-RIGHT","mm"); + AddDelta(left,right); } - // Finding another telescope (safety), toggle out - else - if (DataBuffer.compare(0, name.length(), name) == 0) { - cout << "\033[1;311mWARNING: Another detector is found before standard sequence of Token, Error may occured in detector definition\033[0m" << endl ; - ReadingStatus = false ; + else{ + cout << "Warning: check your input file formatting " << endl; } + } + else if(blocks[i]->GetMainValue() == "MICRO"){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Micromegas " << i+1 << endl; - //DeltaE, Ionisation chamber - else if (DataBuffer=="DELTA") { - ReadingDelta = true; - cout << "____//////" << endl ; - cout << "____FPD TAMU DeltaE found: "<< endl; - - // Reading Delta Block - while(ReadingDelta){ - ConfigFile >> DataBuffer ; - subname="DELTA"; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, subname.length(), subname) == 0) { - cout << "\033[1;311mWARNING: Another DELTA is found before standard sequence of Token, Error may occured in detector definition\033[0m" << endl ; - ReadingDelta = false ; - } - //Reading Upstream left point - else if (DataBuffer=="UPSTREAM-LEFT="){ - check_Delta_USL = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - A = TVector3(X, Y, Z); - cout << " Upstream left corner position: ( " << A.X() << " ; " << A.Y() - << " ; " << A.Z() << " )" << endl; - } - //Reading Upstream right point - else if (DataBuffer=="UPSTREAM-RIGHT="){ - check_Delta_USR = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - B = TVector3(X, Y, Z); - cout << " Upstream right corner position: ( " << B.X() << " ; " << B.Y() - << " ; " << B.Z() << " )" << endl; - } - // If All necessary information there, toggle out - if (check_Delta_USL && check_Delta_USR ){ - AddDelta( A, B ); - check_Delta = true ; - //prepare for another Delta if necessary - ReadingDelta = false; - subname=""; - check_Delta_USL = false; - check_Delta_USR = false; - DeltaLeftPos.push_back(A); - DeltaRightPos.push_back(B); - A.SetXYZ(-99,-99,-99); - B.SetXYZ(-99,-99,-99); - cout << " FPD DeltaE configuration successful" << endl ; - } - }// end of while(ReadingDelta) - }// end of if (DataBuffer=="DELTA") - - else - if (DataBuffer=="MICRO") { // Micromega - - ReadingMicro = true; - cout << "____//////" << endl ; - cout << "____FPD TAMU Micromega found: "<< endl; - // Reading Micro Block - while(ReadingMicro){ - ConfigFile >> DataBuffer ; - subname="MICRO"; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, subname.length(), subname) == 0) { - cout << "\033[1;311mWARNING: Another MICRO is found before standard sequence of Token, Error may occured in detector definition\033[0m" << endl ; - ReadingMicro = false ; - } - //Reading Upstream left point - else if (DataBuffer=="UPSTREAM-LEFT="){ - check_Micro_USL = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - A = TVector3(X, Y, Z); - cout << " Upstream left corner position: ( " << A.X() << " ; " << A.Y() - << " ; " << A.Z() << " )" << endl; - } - //Reading Upstream right point - else if (DataBuffer=="UPSTREAM-RIGHT="){ - check_Micro_USR = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - B = TVector3(X, Y, Z); - cout << " Upstream right corner position: ( " << B.X() << " ; " << B.Y() - << " ; " << B.Z() << " )" << endl; - } - // If All necessary information there, toggle out - if (check_Micro_USL && check_Micro_USR ){ - AddMicro( A, B ); - check_Micro = true ; - //prepare for another Delta if necessary - ReadingMicro = false; - subname=""; - check_Micro_USL = false; - check_Micro_USR = false; - MicroLeftPos.push_back(A); - MicroRightPos.push_back(B); - A.SetXYZ(-99,-99,-99); - B.SetXYZ(-99,-99,-99); - cout << " FPD Micromega configuration successful" << endl ; - } - }// end of while(ReadingMicro) - } //end of if (DataBuffer=="MICRO") - - else if (DataBuffer=="AWIRE") { // Micromega - - ReadingAWire = true; - cout << "____//////" << endl ; - cout << "____FPD TAMU Avalanche Wire found: "<< endl; - // Reading AWire Block - while(ReadingAWire){ - ConfigFile >> DataBuffer ; - subname="AWIRE"; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, subname.length(), subname) == 0) { - cout << "\033[1;311mWARNING: Another AWIRE is found before standard sequence of Token, Error may occured in detector definition\033[0m" << endl ; - ReadingAWire = false ; - } - //Reading Upstream left point - else if (DataBuffer=="LEFT="){ - check_AWire_L = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - A = TVector3(X, Y, Z); - cout << " left end position: ( " << A.X() << " ; " << A.Y() - << " ; " << A.Z() << " )" << endl; - } - //Reading Upstream right point - else if (DataBuffer=="RIGHT="){ - check_AWire_R = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - B = TVector3(X, Y, Z); - cout << " right end position: ( " << B.X() << " ; " << B.Y() - << " ; " << B.Z() << " )" << endl; - } - // If All necessary information there, toggle out - if (check_AWire_L && check_AWire_R ){ - AddAWire( A, B ); - check_AWire = true ; - //prepare for another Delta if necessary - ReadingAWire = false; - subname=""; - check_AWire_L = false; - check_AWire_R = false; - AWireLeftPos.push_back(A); - AWireRightPos.push_back(B); - A.SetXYZ(-99,-99,-99); - B.SetXYZ(-99,-99,-99); - cout << " FPD Avalanche Wire configuration successful" << endl ; - } - }// end of while(ReadingAwire) - } //end of if (DataBuffer=="AWIRE") - - else if (DataBuffer=="PLAST") { // Micromega - - ReadingPlast = true; - cout << "____//////" << endl ; - cout << "____FPD TAMU Plastic found: "<< endl; - // Reading Plast Block - while(ReadingPlast){ - ConfigFile >> DataBuffer ; - subname="PLAST"; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, subname.length(), subname) == 0) { - cout << "\033[1;311mWARNING: Another PLAST is found before standard sequence of Token, Only one plastic is allowed\033[0m" << endl ; - exit(-1); - ReadingPlast = false ; - } - //Reading Upstream left point - else if (DataBuffer=="UPSTREAM-LEFT="){ - check_Plast_USL = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - A = TVector3(X, Y, Z); - cout << " left end position: ( " << A.X() << " ; " << A.Y() - << " ; " << A.Z() << " )" << endl; - } - //Reading Upstream right point - else if (DataBuffer=="UPSTREAM-RIGHT="){ - check_Plast_USR = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - B = TVector3(X, Y, Z); - cout << " right end position: ( " << B.X() << " ; " << B.Y() - << " ; " << B.Z() << " )" << endl; - } - // If All necessary information there, toggle out - if (check_Plast_USL && check_Plast_USR ){ - AddPlast( A, B ); - check_Plast = true ; - //prepare for another Delta if necessary - ReadingPlast = false; - subname=""; - check_Plast_USL = false; - check_Plast_USR = false; - PlastLeftPos=A; - PlastRightPos=B; - A.SetXYZ(-99,-99,-99); - B.SetXYZ(-99,-99,-99); - cout << " FPD Plastic configuration successful" << endl ; - } - }// end of while(ReadingPlast) - } //end of if (DataBuffer=="PLAST") - - /* - //Angle method - else if (DataBuffer=="THETA=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - cout << "Theta: " << atof(DataBuffer.c_str()) << "deg" << endl; - } - else if (DataBuffer=="PHI=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - cout << "Phi: " << atof( DataBuffer.c_str() ) << "deg" << endl; + if(blocks[i]->HasTokenList(token_micro)){ + TVector3 left = blocks[i]->GetTVector3("UPSTREAM-LEFT","mm"); + TVector3 right = blocks[i]->GetTVector3("UPSTREAM-RIGHT","mm"); + AddDelta(left,right); } - else if (DataBuffer=="R=") { - check_R = true; - ConfigFile >> DataBuffer ; - cout << "R: " << atof( DataBuffer.c_str() ) << "mm" << endl; + else{ + cout << "Warning: check your input file formatting " << endl; } - - //Position method - else if (DataBuffer=="X=") { - check_X = true; - ConfigFile >> DataBuffer ; - cout << "X: " << atof( DataBuffer.c_str() ) << "mm" << endl; + } + else if(blocks[i]->GetMainValue() == "AWIRE"){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Anode Wire " << i+1 << endl; + + if(blocks[i]->HasTokenList(token_awire)){ + TVector3 left = blocks[i]->GetTVector3("LEFT","mm"); + TVector3 right = blocks[i]->GetTVector3("RIGHT","mm"); + AddDelta(left,right); } - else if (DataBuffer=="Y=") { - check_Y = true; - ConfigFile >> DataBuffer ; - cout << "Y: " << atof( DataBuffer.c_str() ) << "mm"<< endl; + else{ + cout << "Warning: check your input file formatting " << endl; } - - else if (DataBuffer=="Z=") { - check_Z = true; - ConfigFile >> DataBuffer ; - cout << "Z: " << atof( DataBuffer.c_str() ) << "mm" << endl; + } + else if(blocks[i]->GetMainValue() == "PLAST"){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Plastic " << i+1 << endl; + + if(blocks[i]->HasTokenList(token_plast)){ + TVector3 left = blocks[i]->GetTVector3("UPSTREAM-LEFT","mm"); + TVector3 right = blocks[i]->GetTVector3("UPSTREAM-RIGHT","mm"); + AddDelta(left,right); } - - //General - else if (DataBuffer=="Shape=") { - check_Shape = true; - ConfigFile >> DataBuffer ; - cout << "Shape: " << DataBuffer << endl; - } - */ - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out else{ - ReadingStatus = false; cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ; + cout << "ERROR: check your input file formatting " << endl; + exit(1); } + } + else{ + cout << "ERROR: FPDTamu should be associated with another token : DELTA, MICRO, AWIRE ou PLAST" << endl; + cout << "Given : " << blocks[i]->GetMainValue() << endl; + exit(1); + } + } + + ReadAnalysisConfig(); - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if ( (check_Delta && check_Micro && check_AWire && check_Plast) ){ - m_NumberOfDetectors++; // Number of FPD is always one! - // Reinitialisation of Check Boolean - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_Shape = false ; - check_X = false ; - check_Y = false ; - check_Z = false ; - ReadingStatus = false ; - check_Delta = false ; - check_Micro = false ; - check_AWire = false ; - check_Plast = false ; - cout << "///"<< endl ; - } - }// end of while(ReadingStatus) - }// end of configuration file }// enf of function ReadConfiguration @@ -1083,38 +766,38 @@ void TFPDTamuPhysics::AddParameterToCalibrationManager() { CalibrationManager* Cal = CalibrationManager::getInstance(); for (int i = 0; i < m_NumberOfDelta; ++i) { Cal->AddParameter("FPDTamu", "Delta_R"+ NPL::itoa(i+1)+"_C1_E", - "Delta_R"+ NPL::itoa(i+1)+"_C1_E"); + "Delta_R"+ NPL::itoa(i+1)+"_C1_E"); Cal->AddParameter("FPDTamu", "Delta_R"+ NPL::itoa(i+1)+"_C1_T", - "Delta_R"+ NPL::itoa(i+1)+"_C1_T"); + "Delta_R"+ NPL::itoa(i+1)+"_C1_T"); } for (int i = 0; i < m_NumberOfMicro; ++i) { // in case there's 2 micromega add up the rows for (int iRow = 0; iRow < 4; ++iRow) { for (int iCol = 0; iCol < 7; ++iCol) { - Cal->AddParameter("FPDTamu", "Micro_R"+ NPL::itoa((4*i)+iRow+1)+"_C"+ NPL::itoa(iCol+1)+"_E", - "Micro_R"+ NPL::itoa((4*i)+iRow+1)+"_C"+ NPL::itoa(iCol+1)+"_E"); - Cal->AddParameter("FPDTamu", "Micro_R"+ NPL::itoa((4*i)+iRow+1)+"_C"+ NPL::itoa(iCol+1)+"_T", - "Micro_R"+ NPL::itoa((4*i)+iRow+1)+"_C"+ NPL::itoa(iCol+1)+"_T"); + Cal->AddParameter("FPDTamu", "Micro_R"+ NPL::itoa((4*i)+iRow+1)+"_C"+ NPL::itoa(iCol+1)+"_E", + "Micro_R"+ NPL::itoa((4*i)+iRow+1)+"_C"+ NPL::itoa(iCol+1)+"_E"); + Cal->AddParameter("FPDTamu", "Micro_R"+ NPL::itoa((4*i)+iRow+1)+"_C"+ NPL::itoa(iCol+1)+"_T", + "Micro_R"+ NPL::itoa((4*i)+iRow+1)+"_C"+ NPL::itoa(iCol+1)+"_T"); } } } for (int i = 0; i < m_NumberOfAWire; ++i) { - for (int iCol = 0; iCol < 2; ++iCol) { // 2 cols for left and right + for (int iCol = 0; iCol < 2; ++iCol) { // 2 cols for left and right Cal->AddParameter("FPDTamu", "AWire_R"+ NPL::itoa(i+1)+"_C"+ NPL::itoa(iCol+1)+"_E", - "AWire_R"+ NPL::itoa(i+1)+"_C"+ NPL::itoa(iCol+1)+"_E"); + "AWire_R"+ NPL::itoa(i+1)+"_C"+ NPL::itoa(iCol+1)+"_E"); Cal->AddParameter("FPDTamu", "AWire_R"+ NPL::itoa(i+1)+"_C"+ NPL::itoa(iCol+1)+"_T", - "AWire_R"+ NPL::itoa(i+1)+"_C"+ NPL::itoa(iCol+1)+"_T"); - } + "AWire_R"+ NPL::itoa(i+1)+"_C"+ NPL::itoa(iCol+1)+"_T"); + } } for (int i = 0; i < m_NumberOfPlast; ++i) { // Always 1 - for (int iCol = 0; iCol < 2; ++iCol) { // 2 cols for left and right + for (int iCol = 0; iCol < 2; ++iCol) { // 2 cols for left and right Cal->AddParameter("FPDTamu", "Plast_R"+ NPL::itoa(i+1)+"_C"+ NPL::itoa(iCol+1)+"_E", - "Plast_R"+ NPL::itoa(i+1)+"_C"+ NPL::itoa(iCol+1)+"_E"); + "Plast_R"+ NPL::itoa(i+1)+"_C"+ NPL::itoa(iCol+1)+"_E"); Cal->AddParameter("FPDTamu", "Plast_R"+ NPL::itoa(i+1)+"_C"+ NPL::itoa(iCol+1)+"_T", - "Plast_R"+ NPL::itoa(i+1)+"_C"+ NPL::itoa(iCol+1)+"_T"); - } + "Plast_R"+ NPL::itoa(i+1)+"_C"+ NPL::itoa(iCol+1)+"_T"); + } } } diff --git a/NPLib/Detectors/FPDTamu/TFPDTamuPhysics.h b/NPLib/Detectors/FPDTamu/TFPDTamuPhysics.h index 741e989dd4377f262744f5765243f9de7a8b7038..aeb5de22b412cee73023be3a7e05fca306b0c069 100644 --- a/NPLib/Detectors/FPDTamu/TFPDTamuPhysics.h +++ b/NPLib/Detectors/FPDTamu/TFPDTamuPhysics.h @@ -40,7 +40,7 @@ using namespace std; #include "TFPDTamuSpectra.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" - +#include "NPInputParser.h" // forward declaration class TFPDTamuSpectra; @@ -101,7 +101,7 @@ class TFPDTamuPhysics : public TObject, public NPL::VDetector { // methods inherited from the VDetector ABC class public: // read stream from ConfigFile to pick-up detector parameters - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // add parameters to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/Detectors/Fatima/TFatimaPhysics.cxx b/NPLib/Detectors/Fatima/TFatimaPhysics.cxx index 707bea73edbe76acce424a450473ba7a563083ff..e7acc84672f2fed097f2324519133c6b0312153b 100644 --- a/NPLib/Detectors/Fatima/TFatimaPhysics.cxx +++ b/NPLib/Detectors/Fatima/TFatimaPhysics.cxx @@ -26,6 +26,7 @@ #include "RootInput.h" #include "RootOutput.h" #include "NPDetectorFactory.h" +#include "NPOptionManager.h" // STL #include <vector> #include <iostream> @@ -116,192 +117,41 @@ void TFatimaPhysics::Clear(){ } //////////////////////////////////////////////////////////////////////////////// -void TFatimaPhysics::ReadConfiguration(string Path) { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, Az, Bz, Cz, Dz; - TVector3 A, B, C, D; - double Theta = 0, Phi = 0, R = 0, beta_u = 0 , beta_v = 0 , beta_w = 0; - - bool check_A = false; - bool check_C = false; - bool check_B = false; - bool check_D = false; - - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; - bool check_beta = false; - - bool ReadingStatus = false; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Fatima bloc, reading toggle to true - // and toggle to true flags indicating which shape is treated. - if (LineBuffer.compare(0, 12, "FatimaCluster") == 0 ) { - cout << "///////////////////////" << endl; - cout << "Detector found:" << endl; - ReadingStatus = true; +void TFatimaPhysics::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Fatima"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + // Cartesian Case + vector<string> cart = {"A","B","C","D"}; + // Spherical Case + vector<string> sphe= {"R","THETA","PHI","BETA"}; + + if(blocks[i]->HasTokenList(cart)){ + cout << endl << "//// Fatima " << i+1 << endl; + TVector3 A = blocks[i]->GetTVector3("A","mm"); + TVector3 B = blocks[i]->GetTVector3("B","mm"); + TVector3 C = blocks[i]->GetTVector3("C","mm"); + TVector3 D = blocks[i]->GetTVector3("D","mm"); + AddDetector(A,B,C,D) ; } - // Reading Block - while (ReadingStatus) { - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n' ); - } - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 13, "FatimaDetector") == 0) { - cout << "WARNING: Another Module is find before standard sequence of Token, Error may occured in Telecope definition" << endl; - ReadingStatus = false; - } - // Position method - else if (DataBuffer=="A=") { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az ; - - A = TVector3(Ax, Ay, Az); - cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; - } - else if (DataBuffer=="B=") { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz ; - - B = TVector3(Bx, By, Bz); - cout << "X128 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; - } - else if (DataBuffer == "C=") { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz ; - - C = TVector3(Cx, Cy, Cz); - cout << "X1 Y128 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; - } - else if (DataBuffer=="D=") { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz ; - - D = TVector3(Dx, Dy, Dz); - cout << "X128 Y128 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; - } // End Position Method - - // Angle method - else if (DataBuffer.compare(0, 6, "Theta=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta ; - cout << "Theta: " << Theta << endl; - } - else if (DataBuffer.compare(0, 4, "Phi=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi ; - cout << "Phi: " << Phi << endl; - } - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R ; - cout << "R: " << R << endl; - } - else if (DataBuffer.compare(0, 5, "Beta=") == 0) { - check_beta = true; - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w ; - cout << "Beta: " << beta_u << " " << beta_v << " " << beta_w << endl ; - } + else if(blocks[i]->HasTokenList(sphe)){ + cout << endl << "//// Fatima " << i+1 << endl; + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi= blocks[i]->GetDouble("PHI","deg"); + double R = blocks[i]->GetDouble("R","mm"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + AddDetector(Theta,Phi,R,beta[0],beta[1],beta[2]); + } + + else{ + cout << "ERROR: Missing token for FatimaCluser blocks, check your input file" << endl; + exit(1); + } + + } - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) { - ReadingStatus = false; - - // Add The previously define telescope - // With position method - if ( check_A && check_B && check_C && check_D ) { - AddDetector(A , - B , - C , - D ) ; - } - - // with angle method - else if ( check_Theta && check_Phi && check_R && check_beta ) { - AddDetector(Theta, - Phi, - R, - beta_u, - beta_v, - beta_w); - } - - // reset boolean flag for point positioning - check_A = false; - check_B = false; - check_C = false; - check_D = false; - - // reset boolean flag for angle positioning - check_Theta = false; - check_Phi = false; - check_R = false; - check_beta = false; - - } // end test for adding a module - - - } // end while for reading block - } // end while for reading file - - cout << endl << "/////////////////////////////" << endl<<endl; } //////////////////////////////////////////////////////////////////////////////// diff --git a/NPLib/Detectors/Fatima/TFatimaPhysics.h b/NPLib/Detectors/Fatima/TFatimaPhysics.h index 70cb056d1c53b2fdfe70e4abc7c3e53d78cdf4e3..6f0a449b24e622effadd77aa2067c90a2bcbb9ad 100644 --- a/NPLib/Detectors/Fatima/TFatimaPhysics.h +++ b/NPLib/Detectors/Fatima/TFatimaPhysics.h @@ -31,7 +31,7 @@ using namespace std ; // NPL #include "NPVDetector.h" #include "TFatimaData.h" - +#include "NPInputParser.h" // Root #include "TObject.h" #include "TVector3.h" @@ -51,7 +51,7 @@ class TFatimaPhysics : public TObject, public NPL::VDetector{ // Innherited from VDetector Class // ///////////////////////////////////// // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Read stream at CalibFile and pick-up calibration parameter using Token // If argument is "Simulation" no change calibration is loaded diff --git a/NPLib/Detectors/GANIL/TTacPhysics.cxx b/NPLib/Detectors/GANIL/TTacPhysics.cxx index 7a2854f04c266e95e2abd22b8785e17f41a3cf73..f856f46aa0685cfd92944b510f0f4855bba7262f 100644 --- a/NPLib/Detectors/GANIL/TTacPhysics.cxx +++ b/NPLib/Detectors/GANIL/TTacPhysics.cxx @@ -38,8 +38,7 @@ using namespace std; #include "TChain.h" // tranform an integer to a string -string itoa(int value) -{ +string itoa(int value){ char buffer [33]; sprintf(buffer,"%d",value); return buffer; @@ -47,15 +46,14 @@ string itoa(int value) ClassImp(TTacPhysics) /////////////////////////////////////////////////////////////////////////// -TTacPhysics::TTacPhysics() - { +TTacPhysics::TTacPhysics(){ EventData = new TTacData ; EventPhysics = this ; - } +} /////////////////////////////////////////////////////////////////////////// -TTacPhysics::~TTacPhysics() - {} +TTacPhysics::~TTacPhysics(){ +} /////////////////////////////////////////////////////////////////////////// void TTacPhysics::Clear() @@ -69,10 +67,8 @@ void TTacPhysics::Clear() } /////////////////////////////////////////////////////////////////////////// -void TTacPhysics::ReadConfiguration(string Path) - { - Path = "dummy"; - } +void TTacPhysics::ReadConfiguration(NPL::InputParser ) { +} /////////////////////////////////////////////////////////////////////////// void TTacPhysics::AddParameterToCalibrationManager() diff --git a/NPLib/Detectors/GANIL/TTacPhysics.h b/NPLib/Detectors/GANIL/TTacPhysics.h index e3ec34a4ad7ccd12a8ec67940f94d38043a49967..c80861f1da915a3bcf53aec5b9c5688fefa58a41 100644 --- a/NPLib/Detectors/GANIL/TTacPhysics.h +++ b/NPLib/Detectors/GANIL/TTacPhysics.h @@ -33,6 +33,7 @@ using namespace std ; #include "TTacData.h" #include "NPVDetector.h" #include "NPCalibrationManager.h" +#include "NPInputParser.h" class TTacPhysics : public TObject, public NPL::VDetector { @@ -53,7 +54,7 @@ class TTacPhysics : public TObject, public NPL::VDetector public: // inherrited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManger diff --git a/NPLib/Detectors/GASPARD/GaspardTracker.cxx b/NPLib/Detectors/GASPARD/GaspardTracker.cxx index 37806fd7a3b6732238f0f69c2fc45b827af320ff..9739ad7935f1ac2c37bae60461ba94b612316585 100644 --- a/NPLib/Detectors/GASPARD/GaspardTracker.cxx +++ b/NPLib/Detectors/GASPARD/GaspardTracker.cxx @@ -36,6 +36,7 @@ #include "RootInput.h" #include "RootOutput.h" #include "NPDetectorFactory.h" +#include "NPOptionManager.h" // ROOT headers #include "TChain.h" @@ -69,21 +70,21 @@ void GaspardTracker::Clear(){ //////////////////////////////////////////////////////////////////////////////// // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token -void GaspardTracker::ReadConfiguration(string Path){ - // open configuration file - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - - bool GPDTrkSquare = false; - bool GPDTrkRectangle = false; - bool GPDTrkTrapezoid = false; - bool GPDTrkAnnular = false; - bool GPDTrkDummyShape = false; - - string LineBuffer; - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 9, "GPDSquare") == 0 && GPDTrkSquare == false) { +void GaspardTracker::ReadConfiguration(NPL::InputParser parser ){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("GaspardTracker"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + + bool GPDTrkSquare = false; + bool GPDTrkAnnular= false; + bool GPDTrkTrapezoid= false; + bool GPDTrkDummyShape= false; + bool GPDTrkRectangle= false; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + + if(blocks[i]->GetMainValue() == "Square" && !GPDTrkSquare){ GPDTrkSquare = true; // instantiate a new "detector" corresponding to the Square elements @@ -93,69 +94,62 @@ void GaspardTracker::ReadConfiguration(string Path){ myDetector->SetGaspardDataPointer(m_EventData); // read part of the configuration file corresponding to square elements - ConfigFile.close(); - myDetector->ReadConfiguration(Path); - ConfigFile.open(Path.c_str()); + myDetector->ReadConfiguration(parser); } - else if (LineBuffer.compare(0, 12, "GPDRectangle") == 0 && GPDTrkRectangle == false) { - GPDTrkRectangle = true; + else if(blocks[i]->GetMainValue() == "Annular" && !GPDTrkAnnular){ + GPDTrkAnnular= true; - // instantiate a new "detector" corresponding to the Rectangle elements - GaspardTrackerModule* myDetector = new GaspardTrackerRectangle(m_ModulesMap, m_EventPhysics); + // instantiate a new "detector" corresponding to the Square elements + GaspardTrackerModule* myDetector = new GaspardTrackerAnnular(m_ModulesMap, m_EventPhysics); // Pass the data object to the GaspardTracker*** object myDetector->SetGaspardDataPointer(m_EventData); - // read part of the configuration file corresponding to trapezoid elements - ConfigFile.close(); - myDetector->ReadConfiguration(Path); - ConfigFile.open(Path.c_str()); + // read part of the configuration file corresponding to square elements + myDetector->ReadConfiguration(parser); } - else if (LineBuffer.compare(0, 12, "GPDTrapezoid") == 0 && GPDTrkTrapezoid == false) { - GPDTrkTrapezoid = true; + else if(blocks[i]->GetMainValue() == "Trapezoid" &&! GPDTrkTrapezoid){ + GPDTrkTrapezoid= true; - // instantiate a new "detector" corresponding to the Trapezoid elements + // instantiate a new "detector" corresponding to the Square elements GaspardTrackerModule* myDetector = new GaspardTrackerTrapezoid(m_ModulesMap, m_EventPhysics); // Pass the data object to the GaspardTracker*** object myDetector->SetGaspardDataPointer(m_EventData); - // read part of the configuration file corresponding to trapezoid elements - ConfigFile.close(); - myDetector->ReadConfiguration(Path); - ConfigFile.open(Path.c_str()); + // read part of the configuration file corresponding to square elements + myDetector->ReadConfiguration(parser); } - else if (LineBuffer.compare(0, 10, "GPDAnnular") == 0 && GPDTrkAnnular == false) { - GPDTrkAnnular = true; + else if(blocks[i]->GetMainValue() == "Rectangle" && !GPDTrkRectangle){ + GPDTrkRectangle= true; - // instantiate a new "detector" corresponding to the Trapezoid elements - GaspardTrackerModule* myDetector = new GaspardTrackerAnnular(m_ModulesMap, m_EventPhysics); + // instantiate a new "detector" corresponding to the Square elements + GaspardTrackerModule* myDetector = new GaspardTrackerRectangle(m_ModulesMap, m_EventPhysics); // Pass the data object to the GaspardTracker*** object myDetector->SetGaspardDataPointer(m_EventData); - // read part of the configuration file corresponding to trapezoid elements - ConfigFile.close(); - myDetector->ReadConfiguration(Path); - ConfigFile.open(Path.c_str()); + // read part of the configuration file corresponding to square elements + myDetector->ReadConfiguration(parser); } - else if (LineBuffer.compare(0, 13, "GPDDummyShape") == 0 && GPDTrkDummyShape == false) { - GPDTrkDummyShape = true; + else if(blocks[i]->GetMainValue() == "DummyShape" && !GPDTrkDummyShape){ + GPDTrkDummyShape= true; - // instantiate a new "detector" corresponding to the Shape elements + // instantiate a new "detector" corresponding to the Square elements GaspardTrackerModule* myDetector = new GaspardTrackerDummyShape(m_ModulesMap, m_EventPhysics); // Pass the data object to the GaspardTracker*** object myDetector->SetGaspardDataPointer(m_EventData); - // read part of the configuration file corresponding to shape elements - ConfigFile.close(); - myDetector->ReadConfiguration(Path); - ConfigFile.open(Path.c_str()); + // read part of the configuration file corresponding to square elements + myDetector->ReadConfiguration(parser); + } + + else{ + cout << "Warning: check your input file formatting " << endl; } } } - //////////////////////////////////////////////////////////////////////////////// // Read stream at Path and pick-up calibration parameter using Token // If argument is "Simulation" no change calibration is loaded diff --git a/NPLib/Detectors/GASPARD/GaspardTracker.h b/NPLib/Detectors/GASPARD/GaspardTracker.h index 2c9908ccc904d05ea0bf4e63e93f8be0fd227fa9..e957f99e52a548a3522e236edd954b539b1629f1 100644 --- a/NPLib/Detectors/GASPARD/GaspardTracker.h +++ b/NPLib/Detectors/GASPARD/GaspardTracker.h @@ -32,6 +32,7 @@ #include "TGaspardTrackerData.h" #include "TGaspardTrackerPhysics.h" #include "GaspardTrackerModule.h" +#include "NPInputParser.h" // C++ #include <map> @@ -55,7 +56,7 @@ class GaspardTracker : public NPL::VDetector{ // Innherited from VDetector Class // ///////////////////////////////////// // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Read stream at CalibFile and pick-up calibration parameter using Token // If argument is "Simulation" no change calibration is loaded diff --git a/NPLib/Detectors/GASPARD/GaspardTrackerAnnular.cxx b/NPLib/Detectors/GASPARD/GaspardTrackerAnnular.cxx index 7939424680302c415de057a83ec2323b3c8df344..44faa7f18449cc352f7a6df52c2962ad24f79181 100644 --- a/NPLib/Detectors/GASPARD/GaspardTrackerAnnular.cxx +++ b/NPLib/Detectors/GASPARD/GaspardTrackerAnnular.cxx @@ -56,88 +56,33 @@ GaspardTrackerAnnular::~GaspardTrackerAnnular() -void GaspardTrackerAnnular::ReadConfiguration(string Path) -{ - // open config file - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer; - string DataBuffer; - - double Z = 0, Rmin = 0, Rmax = 0; - - // initialize flags - bool ReadingStatus = false; - bool check_Z = false; - bool check_Rmin = false; - bool check_Rmax = false; - - // read config file - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a GaspardXXX bloc, reading toggle to true - // and toggle to true flags indicating which shape is treated. - if (LineBuffer.compare(0, 10, "GPDAnnular") == 0) { - cout << "///////////////////////" << endl; - cout << "Annular module found:" << endl; - ReadingStatus = true; - } - - // Reading Block - while (ReadingStatus) { - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n' ); - } - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 10, "GPDAnnular") == 0) { - cout << "WARNING: Another Module is find before standard sequence of Token, Error may occured in Telecope definition" << endl; - ReadingStatus = false; - } - - //Position method - else if (DataBuffer.compare(0, 2, "Z=") == 0) { - check_Z = true; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - cout << "Z: " << Z << endl; - } - else if (DataBuffer.compare(0, 5, "RMIN=") == 0) { - check_Rmin = true; - ConfigFile >> DataBuffer ; - Rmin = atof(DataBuffer.c_str()) ; - cout << "Rmin: " << Rmin << endl; - } - else if (DataBuffer.compare(0, 5, "RMAX=") == 0) { - check_Rmax = true; - ConfigFile >> DataBuffer ; - Rmax = atof(DataBuffer.c_str()) ; - cout << "Rmax: " << Rmax << endl; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if (check_Z && check_Rmin && check_Rmax) { - ReadingStatus = false; - - // Add imodule +void GaspardTrackerAnnular::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("GaspardTracker"); + vector<string> tokenp= {"Z","RMIN","RMAX"}; + + vector<string> token={"FIRSTSTAGE","SECONDSTAGE","THIRDSTAGE"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->GetMainValue() == "Annular" && blocks[i]->HasTokenList(token) ){ + bool first = blocks[i]->GetInt("FIRSTSTAGE"); + bool second = blocks[i]->GetInt("SECONDSTAGE"); + bool third = blocks[i]->GetInt("THIRDSTAGE"); + if(blocks[i]->HasTokenList(tokenp)){ + // Add module + double Z = blocks[i]->GetDouble("Z","mm"); + double Rmin = blocks[i]->GetDouble("Rmin","mm"); + double Rmax = blocks[i]->GetDouble("Rmax","mm"); AddModule(Z, Rmin, Rmax); m_ModuleTest[m_index["Annular"] + m_NumberOfModule] = this; - - // reset boolean flag for point positioning - check_Z = false; - check_Rmin = false; - check_Rmax = false; - } // end test for adding a module - } // end while for reading block - } // end while for reading file - - cout << endl << "/////////////////////////////" << endl<<endl; + } + else{ + cout << "ERROR: Check input formatting for Gaspard" << endl; + exit(1); + } + } + } } - void GaspardTrackerAnnular::PreTreat() { } diff --git a/NPLib/Detectors/GASPARD/GaspardTrackerAnnular.h b/NPLib/Detectors/GASPARD/GaspardTrackerAnnular.h index 4610140b91954c1237ef6160842c301549efa78d..4a53f6cd9805978393be7215a5f5e81feb7a8242 100644 --- a/NPLib/Detectors/GASPARD/GaspardTrackerAnnular.h +++ b/NPLib/Detectors/GASPARD/GaspardTrackerAnnular.h @@ -30,7 +30,7 @@ #include "TGaspardTrackerData.h" #include "TGaspardTrackerPhysics.h" #include "GaspardTrackerModule.h" - +#include "NPInputParser.h" using namespace std; @@ -49,7 +49,7 @@ public: //// Inherite from GaspardTrackerModule class ///// //////////////////////////////////////////////////// // Read stream at Configfile to pick-up parameters of detector (Position,...) - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // The goal of this method is to extract physical parameters from raw data // Method called at each event read from the Input Tree diff --git a/NPLib/Detectors/GASPARD/GaspardTrackerDummyShape.cxx b/NPLib/Detectors/GASPARD/GaspardTrackerDummyShape.cxx index e4fe0ccbb8604a31420fc1c14349639692a7fa8c..9bf9b3353a20c6d3db297ce1522bb57e9059f565 100644 --- a/NPLib/Detectors/GASPARD/GaspardTrackerDummyShape.cxx +++ b/NPLib/Detectors/GASPARD/GaspardTrackerDummyShape.cxx @@ -55,194 +55,38 @@ GaspardTrackerDummyShape::~GaspardTrackerDummyShape() -void GaspardTrackerDummyShape::ReadConfiguration(string Path) -{ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer; - string DataBuffer; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - double Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, Az, Bz, Cz, Dz; - TVector3 A, B, C, D; - double Theta = 0, Phi = 0, R = 0, beta_u = 0 , beta_v = 0 , beta_w = 0; - - bool check_A = false; - bool check_C = false; - bool check_B = false; - bool check_D = false; - - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; - bool check_beta = false; - - bool ReadingStatus = false; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a GaspardXXX bloc, reading toggle to true - // and toggle to true flags indicating which shape is treated. - if (LineBuffer.compare(0, 13, "GPDDummyShape") == 0) { - cout << "///////////////////////" << endl; - cout << "DummyShape module found:" << endl; - ReadingStatus = true; +void GaspardTrackerDummyShape::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("GaspardTracker"); + vector<string> token_cart= {"X1_Y1","X128_Y1","X1_Y128","X128_Y128"}; + vector<string> token_sphe= {"R","THETA","PHI","BETA"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->GetMainValue() == "DummyShape"){ + if(blocks[i]->HasTokenList(token_cart)){ + // Add module + TVector3 A = blocks[i]->GetTVector3("X1_Y1","mm"); + TVector3 B = blocks[i]->GetTVector3("X128_Y1","mm"); + TVector3 C = blocks[i]->GetTVector3("X1_Y128","mm"); + TVector3 D = blocks[i]->GetTVector3("X128_Y128","mm"); + + AddModule(A,B,C,D); + m_ModuleTest[m_index["DummyShape"] + m_NumberOfModule] = this; } - - // Reading Block - while (ReadingStatus) { - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n' ); - } - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 13, "GPDDummyShape") == 0) { - cout << "WARNING: Another Module is find before standard sequence of Token, Error may occured in Telecope definition" << endl; - ReadingStatus = false; - } - - // Position method - else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { - check_A = true; - ConfigFile >> DataBuffer; - Ax = atof(DataBuffer.c_str()); - Ax = Ax; - ConfigFile >> DataBuffer; - Ay = atof(DataBuffer.c_str()); - Ay = Ay; - ConfigFile >> DataBuffer; - Az = atof(DataBuffer.c_str()); - Az = Az; - - A = TVector3(Ax, Ay, Az); - cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { - check_B = true; - ConfigFile >> DataBuffer; - Bx = atof(DataBuffer.c_str()); - Bx = Bx; - ConfigFile >> DataBuffer; - By = atof(DataBuffer.c_str()); - By = By; - ConfigFile >> DataBuffer; - Bz = atof(DataBuffer.c_str()); - Bz = Bz; - - B = TVector3(Bx, By, Bz); - cout << "X128 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { - check_C = true; - ConfigFile >> DataBuffer; - Cx = atof(DataBuffer.c_str()); - Cx = Cx; - ConfigFile >> DataBuffer; - Cy = atof(DataBuffer.c_str()); - Cy = Cy; - ConfigFile >> DataBuffer; - Cz = atof(DataBuffer.c_str()); - Cz = Cz; - - C = TVector3(Cx, Cy, Cz); - cout << "X1 Y128 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { - check_D = true; - ConfigFile >> DataBuffer; - Dx = atof(DataBuffer.c_str()); - Dx = Dx; - ConfigFile >> DataBuffer; - Dy = atof(DataBuffer.c_str()); - Dy = Dy; - ConfigFile >> DataBuffer; - Dz = atof(DataBuffer.c_str()); - Dz = Dz; - - D = TVector3(Dx, Dy, Dz); - cout << "X128 Y128 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; - } // End Position Method - - // Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer; - Theta = atof(DataBuffer.c_str()); - Theta = Theta; - cout << "Theta: " << Theta << endl; - } - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer; - Phi = atof(DataBuffer.c_str()); - Phi = Phi; - cout << "Phi: " << Phi << endl; - } - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer; - R = atof(DataBuffer.c_str()); - R = R; - cout << "R: " << R << endl; - } - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - check_beta = true; - ConfigFile >> DataBuffer; - beta_u = atof(DataBuffer.c_str()); - beta_u = beta_u; - ConfigFile >> DataBuffer; - beta_v = atof(DataBuffer.c_str()); - beta_v = beta_v; - ConfigFile >> DataBuffer; - beta_w = atof(DataBuffer.c_str()); - beta_w = beta_w; - cout << "Beta: " << beta_u << " " << beta_v << " " << beta_w << endl; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) { - ReadingStatus = false; - - // Add The previously define telescope - // With position method - if ( check_A && check_B && check_C && check_D ) { - AddModule(A, B, C, D); - m_ModuleTest[m_index["DummyShape"] + m_NumberOfModule] = this; - } - - // with angle method - else if ( check_Theta && check_Phi && check_R && check_beta ) { - AddModule(Theta, Phi, R, beta_u, beta_v, beta_w); - m_ModuleTest[m_index["DummyShape"] + m_NumberOfModule] = this; - } - - // reset boolean flag for point positioning - check_A = false; - check_B = false; - check_C = false; - check_D = false; - // reset boolean flag for angle positioning - check_Theta = false; - check_Phi = false; - check_R = false; - check_beta = false; - - } // end test for adding a module - } // end while for reading block - } // end while for reading file - - cout << endl << "/////////////////////////////" << endl<<endl; + else if(blocks[i]->HasTokenList(token_sphe)){ + // Add module + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + + AddModule(R,Theta,Phi,beta[0],beta[1],beta[2]); + m_ModuleTest[m_index["DummyShape"] + m_NumberOfModule] = this; + } + } + } } - void GaspardTrackerDummyShape::PreTreat() { } diff --git a/NPLib/Detectors/GASPARD/GaspardTrackerDummyShape.h b/NPLib/Detectors/GASPARD/GaspardTrackerDummyShape.h index ac45bc901af000b489c5f4c1e5a9e73ee4627791..0abefa3ccb1cf2be88c887b589d25a851804d6ea 100644 --- a/NPLib/Detectors/GASPARD/GaspardTrackerDummyShape.h +++ b/NPLib/Detectors/GASPARD/GaspardTrackerDummyShape.h @@ -32,7 +32,7 @@ #include "TGaspardTrackerData.h" #include "TGaspardTrackerPhysics.h" #include "GaspardTrackerModule.h" - +#include "NPInputParser.h" using namespace std; @@ -51,7 +51,7 @@ public: //// Inherite from GaspardTrackerModule class ///// //////////////////////////////////////////////////// // Read stream at Configfile to pick-up parameters of detector (Position,...) - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // The goal of this method is to extract physical parameters from raw data // Method called at each event read from the Input Tree diff --git a/NPLib/Detectors/GASPARD/GaspardTrackerModule.h b/NPLib/Detectors/GASPARD/GaspardTrackerModule.h index b81b5585e49c9cc81a7ac82e0d57e70febf430b7..eaaa70aee592d943396aa201251327cfe6382abc 100644 --- a/NPLib/Detectors/GASPARD/GaspardTrackerModule.h +++ b/NPLib/Detectors/GASPARD/GaspardTrackerModule.h @@ -26,7 +26,7 @@ // NPTool - ROOT headers #include "TGaspardTrackerData.h" - +#include "NPInputParser.h" using namespace std; @@ -39,7 +39,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) - virtual void ReadConfiguration(string Path) = 0; + virtual void ReadConfiguration(NPL::InputParser) = 0; // The goal of this method is to extract physical parameters from raw data // Method called at each event read from the Input Tree diff --git a/NPLib/Detectors/GASPARD/GaspardTrackerRectangle.cxx b/NPLib/Detectors/GASPARD/GaspardTrackerRectangle.cxx index 4f84fe7b00d51c0025570adbaea93701ecf1d9fb..ba9c10cb863126862e58222b057918b41623ffa9 100644 --- a/NPLib/Detectors/GASPARD/GaspardTrackerRectangle.cxx +++ b/NPLib/Detectors/GASPARD/GaspardTrackerRectangle.cxx @@ -58,194 +58,37 @@ GaspardTrackerRectangle::~GaspardTrackerRectangle() -void GaspardTrackerRectangle::ReadConfiguration(string Path) -{ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer; - string DataBuffer; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - double Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, Az, Bz, Cz, Dz; - TVector3 A, B, C, D; - double Theta = 0, Phi = 0, R = 0, beta_u = 0 , beta_v = 0 , beta_w = 0; - - bool check_A = false; - bool check_C = false; - bool check_B = false; - bool check_D = false; - - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; - bool check_beta = false; - - bool ReadingStatus = false; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a GaspardXXX bloc, reading toggle to true - // and toggle to true flags indicating which shape is treated. - if (LineBuffer.compare(0, 12, "GPDRectangle") == 0) { - cout << "///////////////////////" << endl; - cout << "Rectangle module found:" << endl; - ReadingStatus = true; +void GaspardTrackerRectangle::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("GaspardTracker"); + vector<string> token_cart= {"X1_Y1","X128_Y1","X1_Y128","X128_Y128"}; + vector<string> token_sphe= {"R","THETA","PHI","BETA"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->GetMainValue() == "Rectangle"){ + if(blocks[i]->HasTokenList(token_cart)){ + // Add module + TVector3 A = blocks[i]->GetTVector3("X1_Y1","mm"); + TVector3 B = blocks[i]->GetTVector3("X128_Y1","mm"); + TVector3 C = blocks[i]->GetTVector3("X1_Y128","mm"); + TVector3 D = blocks[i]->GetTVector3("X128_Y128","mm"); + + AddModule(A,B,C,D); + m_ModuleTest[m_index["Rectangle"] + m_NumberOfModule] = this; } - - // Reading Block - while (ReadingStatus) { - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n' ); - } - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 12, "GPDRectangle") == 0) { - cout << "WARNING: Another Module is find before standard sequence of Token, Error may occured in Telecope definition" << endl; - ReadingStatus = false; - } - - // Position method - else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { - check_A = true; - ConfigFile >> DataBuffer; - Ax = atof(DataBuffer.c_str()); - Ax = Ax; - ConfigFile >> DataBuffer; - Ay = atof(DataBuffer.c_str()); - Ay = Ay; - ConfigFile >> DataBuffer; - Az = atof(DataBuffer.c_str()); - Az = Az; - - A = TVector3(Ax, Ay, Az); - cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { - check_B = true; - ConfigFile >> DataBuffer; - Bx = atof(DataBuffer.c_str()); - Bx = Bx; - ConfigFile >> DataBuffer; - By = atof(DataBuffer.c_str()); - By = By; - ConfigFile >> DataBuffer; - Bz = atof(DataBuffer.c_str()); - Bz = Bz; - - B = TVector3(Bx, By, Bz); - cout << "X128 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { - check_C = true; - ConfigFile >> DataBuffer; - Cx = atof(DataBuffer.c_str()); - Cx = Cx; - ConfigFile >> DataBuffer; - Cy = atof(DataBuffer.c_str()); - Cy = Cy; - ConfigFile >> DataBuffer; - Cz = atof(DataBuffer.c_str()); - Cz = Cz; - - C = TVector3(Cx, Cy, Cz); - cout << "X1 Y128 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { - check_D = true; - ConfigFile >> DataBuffer; - Dx = atof(DataBuffer.c_str()); - Dx = Dx; - ConfigFile >> DataBuffer; - Dy = atof(DataBuffer.c_str()); - Dy = Dy; - ConfigFile >> DataBuffer; - Dz = atof(DataBuffer.c_str()); - Dz = Dz; - - D = TVector3(Dx, Dy, Dz); - cout << "X128 Y128 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; - } // End Position Method - - // Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer; - Theta = atof(DataBuffer.c_str()); - Theta = Theta; - cout << "Theta: " << Theta << endl; - } - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer; - Phi = atof(DataBuffer.c_str()); - Phi = Phi; - cout << "Phi: " << Phi << endl; - } - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer; - R = atof(DataBuffer.c_str()); - R = R; - cout << "R: " << R << endl; - } - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - check_beta = true; - ConfigFile >> DataBuffer; - beta_u = atof(DataBuffer.c_str()); - beta_u = beta_u; - ConfigFile >> DataBuffer; - beta_v = atof(DataBuffer.c_str()); - beta_v = beta_v; - ConfigFile >> DataBuffer; - beta_w = atof(DataBuffer.c_str()); - beta_w = beta_w; - cout << "Beta: " << beta_u << " " << beta_v << " " << beta_w << endl; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) { - ReadingStatus = false; - - // Add The previously define telescope - // With position method - if ( check_A && check_B && check_C && check_D ) { - AddModule(A, B, C, D); - m_ModuleTest[m_index["Rectangle"] + m_NumberOfModule] = this; - } - - // with angle method - else if ( check_Theta && check_Phi && check_R && check_beta ) { - AddModule(Theta, Phi, R, beta_u, beta_v, beta_w); - m_ModuleTest[m_index["Rectangle"] + m_NumberOfModule] = this; - } - - // reset boolean flag for point positioning - check_A = false; - check_B = false; - check_C = false; - check_D = false; - // reset boolean flag for angle positioning - check_Theta = false; - check_Phi = false; - check_R = false; - check_beta = false; - - } // end test for adding a module - } // end while for reading block - } // end while for reading file - - cout << endl << "/////////////////////////////" << endl<<endl; + else if(blocks[i]->HasTokenList(token_sphe)){ + // Add module + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + + AddModule(R,Theta,Phi,beta[0],beta[1],beta[2]); + m_ModuleTest[m_index["Rectangle"] + m_NumberOfModule] = this; + } + } + } } - - void GaspardTrackerRectangle::PreTreat() { } diff --git a/NPLib/Detectors/GASPARD/GaspardTrackerRectangle.h b/NPLib/Detectors/GASPARD/GaspardTrackerRectangle.h index 50426a4c9d51b006610baaf48e7055eef039f307..6552958cf339a3ab83c31fa289abef7110c79de8 100644 --- a/NPLib/Detectors/GASPARD/GaspardTrackerRectangle.h +++ b/NPLib/Detectors/GASPARD/GaspardTrackerRectangle.h @@ -32,7 +32,7 @@ #include "TGaspardTrackerData.h" #include "TGaspardTrackerPhysics.h" #include "GaspardTrackerModule.h" - +#include "NPInputParser.h" using namespace std; @@ -51,7 +51,7 @@ public: //// Inherite from GaspardTrackerModule class ///// //////////////////////////////////////////////////// // Read stream at Configfile to pick-up parameters of detector (Position,...) - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // The goal of this method is to extract physical parameters from raw data // Method called at each event read from the Input Tree diff --git a/NPLib/Detectors/GASPARD/GaspardTrackerSquare.cxx b/NPLib/Detectors/GASPARD/GaspardTrackerSquare.cxx index 2a94ee8b80e4e8bc565b706f79cb7bcf048616b9..342dad78293194abb621e5f948d187332c7051b0 100644 --- a/NPLib/Detectors/GASPARD/GaspardTrackerSquare.cxx +++ b/NPLib/Detectors/GASPARD/GaspardTrackerSquare.cxx @@ -55,190 +55,40 @@ GaspardTrackerSquare::~GaspardTrackerSquare(){ -void GaspardTrackerSquare::ReadConfiguration(string Path){ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer; - string DataBuffer; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - double Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, Az, Bz, Cz, Dz; - TVector3 A, B, C, D; - double Theta = 0, Phi = 0, R = 0, beta_u = 0 , beta_v = 0 , beta_w = 0; - - bool check_A = false; - bool check_C = false; - bool check_B = false; - bool check_D = false; - - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; - bool check_beta = false; - - bool ReadingStatus = false; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a GaspardXXX bloc, reading toggle to true - // and toggle to true flags indicating which shape is treated. - if (LineBuffer.compare(0, 9, "GPDSquare") == 0) { - cout << "///////////////////////" << endl; - cout << "Square module found:" << endl; - ReadingStatus = true; +void GaspardTrackerSquare::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("GaspardTracker"); + vector<string> token_cart= {"X1_Y1","X128_Y1","X1_Y128","X128_Y128"}; + vector<string> token_sphe= {"R","THETA","PHI","BETA"}; + + vector<string> token={"FIRSTSTAGE","SECONDSTAGE","THIRDSTAGE"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->GetMainValue() == "Square" && blocks[i]->HasTokenList(token) ){ + if(blocks[i]->HasTokenList(token_cart)){ + // Add module + TVector3 A = blocks[i]->GetTVector3("X1_Y1","mm"); + TVector3 B = blocks[i]->GetTVector3("X128_Y1","mm"); + TVector3 C = blocks[i]->GetTVector3("X1_Y128","mm"); + TVector3 D = blocks[i]->GetTVector3("X128_Y128","mm"); + + AddModule(A,B,C,D); + m_ModuleTest[m_index["Square"] + m_NumberOfModule] = this; } + else if(blocks[i]->HasTokenList(token_sphe)){ + // Add module + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + + AddModule(R,Theta,Phi,beta[0],beta[1],beta[2]); + m_ModuleTest[m_index["Square"] + m_NumberOfModule] = this; + } + } + } +} - // Reading Block - while (ReadingStatus) { - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n' ); - } - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 9, "GPDSquare") == 0) { - cout << "WARNING: Another Module is find before standard sequence of Token, Error may occured in Telecope definition" << endl; - ReadingStatus = false; - } - - // Position method - else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { - check_A = true; - ConfigFile >> DataBuffer; - Ax = atof(DataBuffer.c_str()); - Ax = Ax; - ConfigFile >> DataBuffer; - Ay = atof(DataBuffer.c_str()); - Ay = Ay; - ConfigFile >> DataBuffer; - Az = atof(DataBuffer.c_str()); - Az = Az; - - A = TVector3(Ax, Ay, Az); - cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { - check_B = true; - ConfigFile >> DataBuffer; - Bx = atof(DataBuffer.c_str()); - Bx = Bx; - ConfigFile >> DataBuffer; - By = atof(DataBuffer.c_str()); - By = By; - ConfigFile >> DataBuffer; - Bz = atof(DataBuffer.c_str()); - Bz = Bz; - - B = TVector3(Bx, By, Bz); - cout << "X128 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { - check_C = true; - ConfigFile >> DataBuffer; - Cx = atof(DataBuffer.c_str()); - Cx = Cx; - ConfigFile >> DataBuffer; - Cy = atof(DataBuffer.c_str()); - Cy = Cy; - ConfigFile >> DataBuffer; - Cz = atof(DataBuffer.c_str()); - Cz = Cz; - - C = TVector3(Cx, Cy, Cz); - cout << "X1 Y128 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { - check_D = true; - ConfigFile >> DataBuffer; - Dx = atof(DataBuffer.c_str()); - Dx = Dx; - ConfigFile >> DataBuffer; - Dy = atof(DataBuffer.c_str()); - Dy = Dy; - ConfigFile >> DataBuffer; - Dz = atof(DataBuffer.c_str()); - Dz = Dz; - - D = TVector3(Dx, Dy, Dz); - cout << "X128 Y128 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; - } // End Position Method - - // Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer; - Theta = atof(DataBuffer.c_str()); - Theta = Theta; - cout << "Theta: " << Theta << endl; - } - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer; - Phi = atof(DataBuffer.c_str()); - Phi = Phi; - cout << "Phi: " << Phi << endl; - } - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer; - R = atof(DataBuffer.c_str()); - R = R; - cout << "R: " << R << endl; - } - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - check_beta = true; - ConfigFile >> DataBuffer; - beta_u = atof(DataBuffer.c_str()); - beta_u = beta_u; - ConfigFile >> DataBuffer; - beta_v = atof(DataBuffer.c_str()); - beta_v = beta_v; - ConfigFile >> DataBuffer; - beta_w = atof(DataBuffer.c_str()); - beta_w = beta_w; - cout << "Beta: " << beta_u << " " << beta_v << " " << beta_w << endl; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) { - ReadingStatus = false; - - // Add The previously define telescope - // With position method - if ( check_A && check_B && check_C && check_D ) { - AddModule(A, B, C, D); - m_ModuleTest[m_index["Square"] + m_NumberOfModule] = this; - } - - // with angle method - else if ( check_Theta && check_Phi && check_R && check_beta ) { - AddModule(Theta, Phi, R, beta_u, beta_v, beta_w); - m_ModuleTest[m_index["Square"] + m_NumberOfModule] = this; - } - // reset boolean flag for point positioning - check_A = false; - check_B = false; - check_C = false; - check_D = false; - // reset boolean flag for angle positioning - check_Theta = false; - check_Phi = false; - check_R = false; - check_beta = false; - - } // end test for adding a module - } // end while for reading block - } // end while for reading file - - cout << endl << "/////////////////////////////" << endl<<endl; -} diff --git a/NPLib/Detectors/GASPARD/GaspardTrackerSquare.h b/NPLib/Detectors/GASPARD/GaspardTrackerSquare.h index e13824494061c50615181c966b4f514f2b78126b..46e6a75a4459b4e157e62ebdefa8e9e56367be7e 100644 --- a/NPLib/Detectors/GASPARD/GaspardTrackerSquare.h +++ b/NPLib/Detectors/GASPARD/GaspardTrackerSquare.h @@ -32,86 +32,85 @@ #include "TGaspardTrackerData.h" #include "TGaspardTrackerPhysics.h" #include "GaspardTrackerModule.h" - +#include "NPInputParser.h" using namespace std; -class GaspardTrackerSquare : public GaspardTrackerModule -{ -public: - //////////////////////////////////////////////////// - /////// Default Constructor and Destructor ///////// - //////////////////////////////////////////////////// - GaspardTrackerSquare(map<int, GaspardTrackerModule*> &Module, TGaspardTrackerPhysics* EventPhysics); - virtual ~GaspardTrackerSquare(); - -public: - //////////////////////////////////////////////////// - //// Inherite from GaspardTrackerModule class ///// - //////////////////////////////////////////////////// - // Read stream at Configfile to pick-up parameters of detector (Position,...) - void ReadConfiguration(string Path); - - // The goal of this method is to extract physical parameters from raw data - // Method called at each event read from the Input Tree - void BuildPhysicalEvent(); - - // Same as before but with a simpler treatment - void BuildSimplePhysicalEvent(); - -private: - map<int, GaspardTrackerModule*> &m_ModuleTest; - TGaspardTrackerPhysics* m_EventPhysics; - -public: - void SetGaspardDataPointer(TGaspardTrackerData* gaspardData) {m_EventData = gaspardData;}; - void PreTreat(); - -private: - // Gaspard data coming from TGaspardTrackerPhysics through the - // SetGaspardDataPointer method - TGaspardTrackerData* m_EventData; - TGaspardTrackerData* m_PreTreatData; - -public: - //////////////////////////////// - // Specific to GaspardTracker // - //////////////////////////////// - // Add a Module using Corner Coordinate information - void AddModule(TVector3 C_X1_Y1, - TVector3 C_X128_Y1, - TVector3 C_X1_Y128, - TVector3 C_X128_Y128); - - // Add a Module using R Theta Phi of Si center information - void AddModule(double theta, - double phi, - double distance, - double beta_u, - double beta_v, - double beta_w); - - // Getters to retrieve the (X,Y,Z) coordinates of a pixel defined by strips (X,Y) - double GetStripPositionX(int N ,int X ,int Y) { return m_StripPositionX[N-1-m_index["Square"]][X-1][Y-1]; } - double GetStripPositionY(int N ,int X ,int Y) { return m_StripPositionY[N-1-m_index["Square"]][X-1][Y-1]; } - double GetStripPositionZ(int N ,int X ,int Y) { return m_StripPositionZ[N-1-m_index["Square"]][X-1][Y-1]; } - double GetNumberOfModule() { return m_NumberOfModule; } - -private: - // Spatial Position of Strip Calculated on basis of detector position - int m_NumberOfModule; - vector< vector < vector < double > > > m_StripPositionX; - vector< vector < vector < double > > > m_StripPositionY; - vector< vector < vector < double > > > m_StripPositionZ; - -private: - ////////////////////////////// - // Geometry and stip number // - ////////////////////////////// - double m_FirstStageFace; // mm - int m_NumberOfStrips; - double m_StripPitch; +class GaspardTrackerSquare : public GaspardTrackerModule{ + public: + //////////////////////////////////////////////////// + /////// Default Constructor and Destructor ///////// + //////////////////////////////////////////////////// + GaspardTrackerSquare(map<int, GaspardTrackerModule*> &Module, TGaspardTrackerPhysics* EventPhysics); + virtual ~GaspardTrackerSquare(); + + public: + //////////////////////////////////////////////////// + //// Inherite from GaspardTrackerModule class ///// + //////////////////////////////////////////////////// + // Read stream at Configfile to pick-up parameters of detector (Position,...) + void ReadConfiguration(NPL::InputParser); + + // The goal of this method is to extract physical parameters from raw data + // Method called at each event read from the Input Tree + void BuildPhysicalEvent(); + + // Same as before but with a simpler treatment + void BuildSimplePhysicalEvent(); + + private: + map<int, GaspardTrackerModule*> &m_ModuleTest; + TGaspardTrackerPhysics* m_EventPhysics; + + public: + void SetGaspardDataPointer(TGaspardTrackerData* gaspardData) {m_EventData = gaspardData;}; + void PreTreat(); + + private: + // Gaspard data coming from TGaspardTrackerPhysics through the + // SetGaspardDataPointer method + TGaspardTrackerData* m_EventData; + TGaspardTrackerData* m_PreTreatData; + + public: + //////////////////////////////// + // Specific to GaspardTracker // + //////////////////////////////// + // Add a Module using Corner Coordinate information + void AddModule(TVector3 C_X1_Y1, + TVector3 C_X128_Y1, + TVector3 C_X1_Y128, + TVector3 C_X128_Y128); + + // Add a Module using R Theta Phi of Si center information + void AddModule(double theta, + double phi, + double distance, + double beta_u, + double beta_v, + double beta_w); + + // Getters to retrieve the (X,Y,Z) coordinates of a pixel defined by strips (X,Y) + double GetStripPositionX(int N ,int X ,int Y) { return m_StripPositionX[N-1-m_index["Square"]][X-1][Y-1]; } + double GetStripPositionY(int N ,int X ,int Y) { return m_StripPositionY[N-1-m_index["Square"]][X-1][Y-1]; } + double GetStripPositionZ(int N ,int X ,int Y) { return m_StripPositionZ[N-1-m_index["Square"]][X-1][Y-1]; } + double GetNumberOfModule() { return m_NumberOfModule; } + + private: + // Spatial Position of Strip Calculated on basis of detector position + int m_NumberOfModule; + vector< vector < vector < double > > > m_StripPositionX; + vector< vector < vector < double > > > m_StripPositionY; + vector< vector < vector < double > > > m_StripPositionZ; + + private: + ////////////////////////////// + // Geometry and stip number // + ////////////////////////////// + double m_FirstStageFace; // mm + int m_NumberOfStrips; + double m_StripPitch; }; #endif diff --git a/NPLib/Detectors/GASPARD/GaspardTrackerTrapezoid.cxx b/NPLib/Detectors/GASPARD/GaspardTrackerTrapezoid.cxx index fd1a3318ad5971e454b328165846766cf49cb9e9..9402c2fe543bcd78fafe31796200bd6ebc41aec5 100644 --- a/NPLib/Detectors/GASPARD/GaspardTrackerTrapezoid.cxx +++ b/NPLib/Detectors/GASPARD/GaspardTrackerTrapezoid.cxx @@ -63,194 +63,37 @@ GaspardTrackerTrapezoid::~GaspardTrackerTrapezoid() -void GaspardTrackerTrapezoid::ReadConfiguration(string Path) -{ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer; - string DataBuffer; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - double Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, Az, Bz, Cz, Dz; - TVector3 A, B, C, D; - double Theta = 0, Phi = 0, R = 0, beta_u = 0 , beta_v = 0 , beta_w = 0; - - bool check_A = false; - bool check_C = false; - bool check_B = false; - bool check_D = false; - - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; - bool check_beta = false; - - bool ReadingStatus = false; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a GaspardXXX bloc, reading toggle to true - // and toggle to true flags indicating which shape is treated. - if (LineBuffer.compare(0, 12, "GPDTrapezoid") == 0) { - cout << "///////////////////////" << endl; - cout << "Trapezoid module found:" << endl; - ReadingStatus = true; +void GaspardTrackerTrapezoid::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("GaspardTracker"); + vector<string> token_cart= {"X1_Y1","X128_Y1","X1_Y128","X128_Y128"}; + vector<string> token_sphe= {"R","THETA","PHI","BETA"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->GetMainValue() == "Trapezoid"){ + if(blocks[i]->HasTokenList(token_cart)){ + // Add module + TVector3 A = blocks[i]->GetTVector3("X1_Y1","mm"); + TVector3 B = blocks[i]->GetTVector3("X128_Y1","mm"); + TVector3 C = blocks[i]->GetTVector3("X1_Y128","mm"); + TVector3 D = blocks[i]->GetTVector3("X128_Y128","mm"); + + AddModule(A,B,C,D); + m_ModuleTest[m_index["Trapezoid"] + m_NumberOfModule] = this; } - - // Reading Block - while (ReadingStatus) { - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n' ); - } - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 12, "GPDTrapezoid") == 0) { - cout << "WARNING: Another Module is find before standard sequence of Token, Error may occured in Telecope definition" << endl; - ReadingStatus = false; - } - - // Position method - else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { - check_A = true; - ConfigFile >> DataBuffer; - Ax = atof(DataBuffer.c_str()); - Ax = Ax; - ConfigFile >> DataBuffer; - Ay = atof(DataBuffer.c_str()); - Ay = Ay; - ConfigFile >> DataBuffer; - Az = atof(DataBuffer.c_str()); - Az = Az; - - A = TVector3(Ax, Ay, Az); - cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { - check_B = true; - ConfigFile >> DataBuffer; - Bx = atof(DataBuffer.c_str()); - Bx = Bx; - ConfigFile >> DataBuffer; - By = atof(DataBuffer.c_str()); - By = By; - ConfigFile >> DataBuffer; - Bz = atof(DataBuffer.c_str()); - Bz = Bz; - - B = TVector3(Bx, By, Bz); - cout << "X128 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { - check_C = true; - ConfigFile >> DataBuffer; - Cx = atof(DataBuffer.c_str()); - Cx = Cx; - ConfigFile >> DataBuffer; - Cy = atof(DataBuffer.c_str()); - Cy = Cy; - ConfigFile >> DataBuffer; - Cz = atof(DataBuffer.c_str()); - Cz = Cz; - - C = TVector3(Cx, Cy, Cz); - cout << "X1 Y128 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { - check_D = true; - ConfigFile >> DataBuffer; - Dx = atof(DataBuffer.c_str()); - Dx = Dx; - ConfigFile >> DataBuffer; - Dy = atof(DataBuffer.c_str()); - Dy = Dy; - ConfigFile >> DataBuffer; - Dz = atof(DataBuffer.c_str()); - Dz = Dz; - - D = TVector3(Dx, Dy, Dz); - cout << "X128 Y128 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; - } // End Position Method - - // Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer; - Theta = atof(DataBuffer.c_str()); - Theta = Theta; - cout << "Theta: " << Theta << endl; - } - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer; - Phi = atof(DataBuffer.c_str()); - Phi = Phi; - cout << "Phi: " << Phi << endl; - } - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer; - R = atof(DataBuffer.c_str()); - R = R; - cout << "R: " << R << endl; - } - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - check_beta = true; - ConfigFile >> DataBuffer; - beta_u = atof(DataBuffer.c_str()); - beta_u = beta_u; - ConfigFile >> DataBuffer; - beta_v = atof(DataBuffer.c_str()); - beta_v = beta_v; - ConfigFile >> DataBuffer; - beta_w = atof(DataBuffer.c_str()); - beta_w = beta_w; - cout << "Beta: " << beta_u << " " << beta_v << " " << beta_w << endl; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) { - ReadingStatus = false; - - // Add The previously define telescope - // With position method - if ( check_A && check_B && check_C && check_D ) { - AddModule(A, B, C, D); - m_ModuleTest[m_index["Trapezoid"] + m_NumberOfModule] = this; - } - - // with angle method - else if ( check_Theta && check_Phi && check_R && check_beta ) { - AddModule(Theta, Phi, R, beta_u, beta_v, beta_w); - m_ModuleTest[m_index["Trapezoid"] + m_NumberOfModule] = this; - } - - // reset boolean flag for point positioning - check_A = false; - check_B = false; - check_C = false; - check_D = false; - // reset boolean flag for angle positioning - check_Theta = false; - check_Phi = false; - check_R = false; - check_beta = false; - - } // end test for adding a module - } // end while for reading block - } // end while for reading file - - cout << endl << "/////////////////////////////" << endl<<endl; + else if(blocks[i]->HasTokenList(token_sphe)){ + // Add module + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + + AddModule(R,Theta,Phi,beta[0],beta[1],beta[2]); + m_ModuleTest[m_index["Trapezoid"] + m_NumberOfModule] = this; + } + } + } } - - void GaspardTrackerTrapezoid::PreTreat() { } diff --git a/NPLib/Detectors/GASPARD/GaspardTrackerTrapezoid.h b/NPLib/Detectors/GASPARD/GaspardTrackerTrapezoid.h index b0a9557559bea286777160bd96313d300bcdc0b1..c5bb969df50dbd2ff9ba9040f1881ec53fca25eb 100644 --- a/NPLib/Detectors/GASPARD/GaspardTrackerTrapezoid.h +++ b/NPLib/Detectors/GASPARD/GaspardTrackerTrapezoid.h @@ -32,7 +32,7 @@ #include "TGaspardTrackerData.h" #include "TGaspardTrackerPhysics.h" #include "GaspardTrackerModule.h" - +#include "NPInputParser.h" using namespace std; @@ -51,7 +51,7 @@ public: //// Inherite from GaspardTrackerModule class ///// //////////////////////////////////////////////////// // Read stream at Configfile to pick-up parameters of detector (Position,...) - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // The goal of this method is to extract physical parameters from raw data // Method called at each event read from the Input Tree diff --git a/NPLib/Detectors/GeTAMU/TGeTAMUPhysics.cxx b/NPLib/Detectors/GeTAMU/TGeTAMUPhysics.cxx index fcf4794d488f6518f079b24c4cf743f47c2f4b4c..cffae20d3dda70ff60658ef50df59b1c1b1a9743 100644 --- a/NPLib/Detectors/GeTAMU/TGeTAMUPhysics.cxx +++ b/NPLib/Detectors/GeTAMU/TGeTAMUPhysics.cxx @@ -33,6 +33,7 @@ using namespace std; #include "RootOutput.h" #include "TAsciiFile.h" #include "NPSystemOfUnits.h" +#include "NPOptionManager.h" using namespace NPUNITS; // ROOT @@ -265,98 +266,30 @@ TVector3 TGeTAMUPhysics::GetSegmentPosition(int& CloverNbr,int& CoreNbr, int& Se ///////////////////////////////////////////////// -void TGeTAMUPhysics::ReadConfiguration(string Path) { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - if(!ConfigFile.is_open()) cout << "Config File not Found" << endl ; - - string LineBuffer; - string DataBuffer; - - bool check_CloverId= false; - bool check_R= false; - bool check_Theta= false; - bool check_Phi= false; - bool ReadingStatus = true; - - int CloverId=0; - double R=0; - double Theta=0; - double Phi=0; - - while (!ConfigFile.eof()) { - - getline(ConfigFile, LineBuffer); - // If line is a Start Up GeTAMU bloc, Reading toggle to true - if (LineBuffer.compare(0, 12, "GeTAMUClover") == 0) { - cout << "///" << endl ; - cout << "GeTAMU Clover found: " << endl ; - ReadingStatus = true ; - } - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus) { - // Pickup Next Word - - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) {ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // Finding another Clover toggle out (safety) - else if (DataBuffer.compare(0, 12, "GeTAMUClover") == 0) { - cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Clover definition" << endl ; - ReadingStatus = false ; - } - - else if (DataBuffer=="CloverId=") { - check_CloverId = true; - ConfigFile >> DataBuffer ; - CloverId=atoi(DataBuffer.c_str()); - cout << "CloverId: " << CloverId << endl; - } - - else if (DataBuffer=="R=") { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()); - cout << "R: " << R << "mm" << endl; - } - - else if (DataBuffer=="Theta=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()); - cout << "Theta: " << Theta << "deg" << endl; - } - - else if (DataBuffer=="Phi=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()); - cout << "Phi: " << Phi << "deg" << endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else { - ReadingStatus = false; cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ;} - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ( check_Theta && check_Phi && check_R && check_CloverId) { - ReadingStatus = false; - check_CloverId= false; - check_R= false; - check_Theta= false; - check_Phi= false; - AddClover(CloverId,R,Theta*3.141592653589793/180.,Phi*3.141592653589793/180.); - } +void TGeTAMUPhysics::ReadConfiguration(NPL::InputParser parser) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("GeTAMU"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " clovers found " << endl; + + vector<string> token = {"CloverID","R","Theta","Phi","Beta"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + int id = blocks[i]->GetInt("CloverID"); + vector<double> Beta = blocks[i]->GetVectorDouble("Beta","deg"); + cout << "WARNING: beta not used, need to be fixed!" << endl; + AddClover(id,R,Theta,Phi); + } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } } - /////////////////////////////////////////////////////////////////////////// void TGeTAMUPhysics::InitializeRootInputRaw() { TChain* inputChain = RootInput::getInstance()->GetChain(); diff --git a/NPLib/Detectors/GeTAMU/TGeTAMUPhysics.h b/NPLib/Detectors/GeTAMU/TGeTAMUPhysics.h index 56f75f9e7ae809ae8535e6a6c3e6a7ae0052527b..c060782722395d5f633ad3afe37b075c8c668270 100644 --- a/NPLib/Detectors/GeTAMU/TGeTAMUPhysics.h +++ b/NPLib/Detectors/GeTAMU/TGeTAMUPhysics.h @@ -29,6 +29,7 @@ using namespace std; #include "TGeTAMUData.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" +#include "NPInputParser.h" // ROOT #include "TObject.h" @@ -46,7 +47,7 @@ class TGeTAMUPhysics : public TObject, public NPL::VDetector{ public: // inherited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/Detectors/Helios/Helios.cxx b/NPLib/Detectors/Helios/Helios.cxx index 7ca8e39820cc45961cf75ae3731592ca794e707a..b32c6a20a25c50f886a914df4635b0ce48aaf310 100644 --- a/NPLib/Detectors/Helios/Helios.cxx +++ b/NPLib/Detectors/Helios/Helios.cxx @@ -34,299 +34,75 @@ #include "RootInput.h" #include "RootOutput.h" #include "NPDetectorFactory.h" - +#include "NPOptionManager.h" // ROOT headers #include "TChain.h" using namespace std ; - + // Default Constructor Helios::Helios() { - m_NumberOfModule = 0; - m_NominalField = 0; - m_TargThick = 0; - m_EventData = new THeliosData(); - m_EventPhysics = new THeliosPhysics(); + m_NumberOfModule = 0; + m_NominalField = 0; + m_TargThick = 0; + m_EventData = new THeliosData(); + m_EventPhysics = new THeliosPhysics(); } Helios::~Helios() { - m_NumberOfModule = 0; - m_NominalField = 0; - m_TargThick = 0; - delete m_EventData; - delete m_EventPhysics; + m_NumberOfModule = 0; + m_NominalField = 0; + m_TargThick = 0; + delete m_EventData; + delete m_EventPhysics; } // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token -void Helios::ReadConfiguration(string Path) -{ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - double Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, Az, Bz, Cz, Dz; - TVector3 A, B, C, D; - double Theta = 0, Phi = 0, R = 0, beta_u = 0 , beta_v = 0 , beta_w = 0; - - bool check_A = false; - bool check_C = false; - bool check_B = false; - bool check_D = false; - - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; - bool check_beta = false; - - bool ReadingStatus = false; - - bool isSquare = false; - bool isDummyShape = false; - bool isTrapezoid = false; - bool isAnnular = false; - - bool isNomFieldInitialized = false; // nominal field value along beam axis - bool isTargetThickness = false; // Target thickness - - - while (!ConfigFile.eof()) { - - // - // Find Input thickness Target - // - if(!isTargetThickness) - { - ConfigFile >> DataBuffer; - cout << DataBuffer << endl; - if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} - - // Position method - else if (DataBuffer.compare(0, 10, "THICKNESS=") == 0) { - ConfigFile >> DataBuffer ; - - m_TargThick = atof(DataBuffer.c_str()) ; - - cout << "/// Target Thickness is: " << m_TargThick << endl ; - - isTargetThickness = true; - } - } - - // - // Find Read Magneticfield nominal value - // - if(!isNomFieldInitialized) - { - ConfigFile >> DataBuffer; - cout << DataBuffer << endl; - if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} - - // Position method - else if (DataBuffer.compare(0, 7, "MField=") == 0) { - ConfigFile >> DataBuffer ; - - m_NominalField = atof(DataBuffer.c_str()) ; - - cout << "/// Magnetic field nominal value " << m_NominalField << endl ; - - isNomFieldInitialized = true; - } - } - - - // - // Then look for the all modules - // - - getline(ConfigFile, LineBuffer); - - if (LineBuffer.compare(0, 16, "HeliosDummyShape") == 0) { - cout << "///////////////////////" << endl; - cout << "Module found:" << endl; - - // if (LineBuffer.compare(0, 12, "HeliosSquare") == 0) isSquare = true; - if (LineBuffer.compare(0, 16, "HeliosDummyShape") == 0) isDummyShape = true; - // if (LineBuffer.compare(0, 15, "HeliosTrapezoid") == 0) isTrapezoid = true; - // if (LineBuffer.compare(0, 13, "HeliosAnnular") == 0) isAnnular = true; - ReadingStatus = true; - } - // Else don't toggle to Reading Block Status - else ReadingStatus = false; - - // Reading Block - while (ReadingStatus) { - if (isDummyShape) { // dummyshape shape - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n' ); - } - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 16, "HeliosDummyShape") == 0) { - cout << "WARNING: Another Module is find before standard sequence of Token, Error may occured in Telecope definition" << endl; - ReadingStatus = false; - } - - // Position method - else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az ; - - A = TVector3(Ax, Ay, Az); - cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz ; - - B = TVector3(Bx, By, Bz); - cout << "X128 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz ; - - C = TVector3(Cx, Cy, Cz); - cout << "X1 Y128 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz ; - - D = TVector3(Dx, Dy, Dz); - cout << "X128 Y128 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; - } // End Position Method - - // Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta ; - cout << "Theta: " << Theta << endl; - } - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi ; - cout << "Phi: " << Phi << endl; - } - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R ; - cout << "R: " << R << endl; - } - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - check_beta = true; - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w ; - cout << "Beta: " << beta_u << " " << beta_v << " " << beta_w << endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) { - ReadingStatus = false; - - // Add The previously define telescope - // With position method - if ( check_A && check_B && check_C && check_D ) { - AddModuleDummyShape(A , - B , - C , - D ) ; - } - - // with angle method - else if ( check_Theta && check_Phi && check_R && check_beta ) { - AddModuleDummyShape(Theta, - Phi, - R, - beta_u, - beta_v, - beta_w); - } - - // reset boolean flag for point positioning - check_A = false; - check_B = false; - check_C = false; - check_D = false; - - // reset boolean flag for angle positioning - check_Theta = false; - check_Phi = false; - check_R = false; - check_beta = false; - - // reset boolean flag for shape determination - isSquare = false; - isDummyShape = false; - isTrapezoid = false; - isAnnular = false; - } // end test for adding a module - } // end test for DummyShape shape - - - } // end while for reading block - } // end while for reading file - - cout << endl << "/////////////////////////////" << endl<<endl; +void Helios::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("HeliosDummyShape"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + // Cartesian Case + vector<string> cart = {"X1_Y1","X1_Y128","X128_Y1","X128_Y128"}; + // Spherical Case + vector<string> sphe= {"R","THETA","PHI","BETA"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Helios " << i+1 << endl; + + TVector3 A = blocks[i]->GetTVector3("X1_Y1","mm"); + TVector3 B = blocks[i]->GetTVector3("X128_Y1","mm"); + TVector3 C = blocks[i]->GetTVector3("X1_Y128","mm"); + TVector3 D = blocks[i]->GetTVector3("X128_Y128","mm"); + AddModuleDummyShape(A,B,C,D) ; + } + + else if(blocks[i]->HasTokenList(sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Helios " << i+1 << endl; + + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi= blocks[i]->GetDouble("PHI","deg"); + double R = blocks[i]->GetDouble("R","mm"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + AddModuleDummyShape(Theta,Phi,R,beta[0],beta[1],beta[2]); + } + + else{ + cout << "ERROR: Missing token for M2Telescope blocks, check your input file" << endl; + exit(1); + } + } } @@ -334,20 +110,20 @@ void Helios::ReadConfiguration(string Path) // If argument is "Simulation" no change calibration is loaded void Helios::ReadCalibrationFile(string Path) { - Path.c_str(); + Path.c_str(); } - + // Activated associated Branches and link it to the private member DetectorData address // In this method mother Branches (Detector) AND daughter leaf (fDetector_parameter) have to be activated void Helios::InitializeRootInputRaw() { - TChain* inputChain = RootInput::getInstance()->GetChain(); - inputChain->SetBranchStatus("HELIOS", true); - inputChain->SetBranchStatus("fHelios*", true); - inputChain->SetBranchAddress("HELIOS", &m_EventData); + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus("HELIOS", true); + inputChain->SetBranchStatus("fHelios*", true); + inputChain->SetBranchAddress("HELIOS", &m_EventData); } @@ -355,8 +131,8 @@ void Helios::InitializeRootInputRaw() // Create associated branches and associated private member DetectorPhysics address void Helios::InitializeRootOutput() { - TTree* outputTree = RootOutput::getInstance()->GetTree(); - outputTree->Branch("HELIOS", "THeliosPhysics", &m_EventPhysics); + TTree* outputTree = RootOutput::getInstance()->GetTree(); + outputTree->Branch("HELIOS", "THeliosPhysics", &m_EventPhysics); } @@ -364,7 +140,7 @@ void Helios::InitializeRootOutput() // This method is called at each event read from the Input Tree. Aime is to build treat Raw dat in order to extract physical parameter. void Helios::BuildPhysicalEvent() { - m_EventPhysics -> BuildPhysicalEvent(m_EventData); + m_EventPhysics -> BuildPhysicalEvent(m_EventData); } @@ -374,7 +150,7 @@ void Helios::BuildPhysicalEvent() // NB: This method can eventually be the same as BuildPhysicalEvent. void Helios::BuildSimplePhysicalEvent() { - m_EventPhysics -> BuildSimplePhysicalEvent(m_EventData); + m_EventPhysics -> BuildSimplePhysicalEvent(m_EventData); } @@ -383,218 +159,218 @@ void Helios::BuildSimplePhysicalEvent() void Helios::AddModuleDummyShape(TVector3 C_X1_Y1, - TVector3 C_X128_Y1, - TVector3 C_X1_Y128, - TVector3 C_X128_Y128) + TVector3 C_X128_Y1, + TVector3 C_X1_Y128, + TVector3 C_X128_Y128) { - m_NumberOfModule++; + m_NumberOfModule++; - cout << m_NumberOfModule << endl; + cout << m_NumberOfModule << endl; - // remove warning using C_X128_Y128 - C_X128_Y128.Unit(); + // remove warning using C_X128_Y128 + C_X128_Y128.Unit(); - // Vector U on Module Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis) - TVector3 U = C_X128_Y1 - C_X1_Y1; - U = U.Unit(); + // Vector U on Module Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis) + TVector3 U = C_X128_Y1 - C_X1_Y1; + U = U.Unit(); - // Vector V on Module Face (parallele to X Strip) - TVector3 V = C_X1_Y128 - C_X1_Y1; - V = V.Unit(); + // Vector V on Module Face (parallele to X Strip) + TVector3 V = C_X1_Y128 - C_X1_Y1; + V = V.Unit(); - // Position Vector of Strip Center - TVector3 StripCenter = TVector3(0,0,0); - // Position Vector of X=1 Y=1 Strip - TVector3 Strip_1_1; + // Position Vector of Strip Center + TVector3 StripCenter = TVector3(0,0,0); + // Position Vector of X=1 Y=1 Strip + TVector3 Strip_1_1; - // Geometry Parameter - //Commented by Adrien Matta (produce a warning) + // Geometry Parameter + //Commented by Adrien Matta (produce a warning) // double Face = 50; // mm //double NumberOfStrip = 128; //double StripPitch = 0.98; //Face/NumberOfStrip; // mm - //double NumberOfLStrip = 22; // 1mm - //double StripLPitch = 1.; //Face/NumberOfStrip; // mm - - //double FaceL = 20.; - //double NumberOfLStrip = 10; // 2mm - double FaceL = 22.; - double NumberOfLStrip = 11; // 2mm - //double FaceL = 24.; - //double NumberOfLStrip = 12; // 2mm - - double StripLPitch = FaceL/NumberOfLStrip; // mm - //double NumberOfTStrip = 250; - //double StripTPitch = .5; //Face/NumberOfStrip; // mm - double FaceT = 125.; - double NumberOfTStrip = 128; - double StripTPitch = FaceT/NumberOfTStrip; //125./128.; //Face/NumberOfTStrip; // mm - //double NumberOfTStrip = 62; - //double StripTPitch = 2.016; //Face/NumberOfStrip; // mm - //double NumberOfTStrip =25; - //double StripTPitch = 5.; //Face/NumberOfStrip; // mm - - - // Buffer object to fill Position Array - vector<double> lineX; - vector<double> lineY; - vector<double> lineZ; - - vector< vector< double > > OneModuleStripPositionX; - vector< vector< double > > OneModuleStripPositionY; - vector< vector< double > > OneModuleStripPositionZ; - - // Moving StripCenter to 1.1 corner: - //Strip_1_1 = C_X1_Y1 + (U+V) * (StripPitch/2.); - Strip_1_1 = C_X1_Y1 + (U*(StripLPitch/2.)) + (V*(StripTPitch/2.)); // or: C_X1_Y1 + (U * (StripTPitch/2.) + (V* (StripLPitch/2.) !!! To be checked !!! - - cout << "Strip_1_1 x=" << Strip_1_1[0] << endl; - cout << "Strip_1_1 y=" << Strip_1_1[1] << endl; - cout << "Strip_1_1 z=" << Strip_1_1[2] << endl; - - /* - for (int i = 0; i < NumberOfStrip; i++) { - lineX.clear(); - lineY.clear(); - lineZ.clear(); - - for (int j = 0; j < NumberOfStrip; j++) { - StripCenter = Strip_1_1 + StripPitch*( i*U + j*V ); -// StripCenter += -TargetPosition; - - lineX.push_back( StripCenter.X() ); - lineY.push_back( StripCenter.Y() ); - lineZ.push_back( StripCenter.Z() ); - } - - OneModuleStripPositionX.push_back(lineX); - OneModuleStripPositionY.push_back(lineY); - OneModuleStripPositionZ.push_back(lineZ); - } - */ - for (int i = 0; i < NumberOfLStrip; i++) { - lineX.clear(); - lineY.clear(); - lineZ.clear(); - - for (int j = 0; j < NumberOfTStrip; j++) { - StripCenter = Strip_1_1 + StripLPitch*( i*U ) + StripTPitch*( j*V ); // or: Strip_1_1 + StripTPitch*( i*U ) + StripLPitch*( j*V ) !!! To be checked as above!!! -// StripCenter += -TargetPosition; - -/* - if(i<3 && j<5){ - cout << "i:" << i << " j:" << j << endl; - cout << "StripCenter x= "<< StripCenter[0] << endl; - cout << "StripCenter y= "<< StripCenter[1] << endl; - cout << "StripCenter z= "<< StripCenter[2] << endl; - } -*/ - lineX.push_back( StripCenter.X() ); - lineY.push_back( StripCenter.Y() ); - lineZ.push_back( StripCenter.Z() ); - } + //double NumberOfLStrip = 22; // 1mm + //double StripLPitch = 1.; //Face/NumberOfStrip; // mm + + //double FaceL = 20.; + //double NumberOfLStrip = 10; // 2mm + double FaceL = 22.; + double NumberOfLStrip = 11; // 2mm + //double FaceL = 24.; + //double NumberOfLStrip = 12; // 2mm + + double StripLPitch = FaceL/NumberOfLStrip; // mm + //double NumberOfTStrip = 250; + //double StripTPitch = .5; //Face/NumberOfStrip; // mm + double FaceT = 125.; + double NumberOfTStrip = 128; + double StripTPitch = FaceT/NumberOfTStrip; //125./128.; //Face/NumberOfTStrip; // mm + //double NumberOfTStrip = 62; + //double StripTPitch = 2.016; //Face/NumberOfStrip; // mm + //double NumberOfTStrip =25; + //double StripTPitch = 5.; //Face/NumberOfStrip; // mm + + + // Buffer object to fill Position Array + vector<double> lineX; + vector<double> lineY; + vector<double> lineZ; + + vector< vector< double > > OneModuleStripPositionX; + vector< vector< double > > OneModuleStripPositionY; + vector< vector< double > > OneModuleStripPositionZ; + + // Moving StripCenter to 1.1 corner: + //Strip_1_1 = C_X1_Y1 + (U+V) * (StripPitch/2.); + Strip_1_1 = C_X1_Y1 + (U*(StripLPitch/2.)) + (V*(StripTPitch/2.)); // or: C_X1_Y1 + (U * (StripTPitch/2.) + (V* (StripLPitch/2.) !!! To be checked !!! + + cout << "Strip_1_1 x=" << Strip_1_1[0] << endl; + cout << "Strip_1_1 y=" << Strip_1_1[1] << endl; + cout << "Strip_1_1 z=" << Strip_1_1[2] << endl; + + /* + for (int i = 0; i < NumberOfStrip; i++) { + lineX.clear(); + lineY.clear(); + lineZ.clear(); + + for (int j = 0; j < NumberOfStrip; j++) { + StripCenter = Strip_1_1 + StripPitch*( i*U + j*V ); + // StripCenter += -TargetPosition; + + lineX.push_back( StripCenter.X() ); + lineY.push_back( StripCenter.Y() ); + lineZ.push_back( StripCenter.Z() ); + } + + OneModuleStripPositionX.push_back(lineX); + OneModuleStripPositionY.push_back(lineY); + OneModuleStripPositionZ.push_back(lineZ); + } + */ + for (int i = 0; i < NumberOfLStrip; i++) { + lineX.clear(); + lineY.clear(); + lineZ.clear(); + + for (int j = 0; j < NumberOfTStrip; j++) { + StripCenter = Strip_1_1 + StripLPitch*( i*U ) + StripTPitch*( j*V ); // or: Strip_1_1 + StripTPitch*( i*U ) + StripLPitch*( j*V ) !!! To be checked as above!!! + // StripCenter += -TargetPosition; + + /* + if(i<3 && j<5){ + cout << "i:" << i << " j:" << j << endl; + cout << "StripCenter x= "<< StripCenter[0] << endl; + cout << "StripCenter y= "<< StripCenter[1] << endl; + cout << "StripCenter z= "<< StripCenter[2] << endl; + } + */ + lineX.push_back( StripCenter.X() ); + lineY.push_back( StripCenter.Y() ); + lineZ.push_back( StripCenter.Z() ); + } - OneModuleStripPositionX.push_back(lineX); - OneModuleStripPositionY.push_back(lineY); - OneModuleStripPositionZ.push_back(lineZ); - } + OneModuleStripPositionX.push_back(lineX); + OneModuleStripPositionY.push_back(lineY); + OneModuleStripPositionZ.push_back(lineZ); + } - m_StripPositionX.push_back( OneModuleStripPositionX ); - m_StripPositionY.push_back( OneModuleStripPositionY ); - m_StripPositionZ.push_back( OneModuleStripPositionZ ); + m_StripPositionX.push_back( OneModuleStripPositionX ); + m_StripPositionY.push_back( OneModuleStripPositionY ); + m_StripPositionZ.push_back( OneModuleStripPositionZ ); } void Helios::AddModuleDummyShape(double theta, - double phi, - double distance, - double beta_u, - double beta_v, - double beta_w) + double phi, + double distance, + double beta_u, + double beta_v, + double beta_w) { - m_NumberOfModule++; - - // convert from degree to radian: - double Pi = 3.141592654; - theta = theta * Pi/180. ; - phi = phi * Pi/180. ; - - // Vector U on Module Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis) - TVector3 U ; - // Vector V on Module Face (parallele to X Strip) - TVector3 V ; - // Vector W normal to Module Face (pointing CsI) - TVector3 W ; - // Vector position of Module Face center - TVector3 C ; - - C = TVector3(distance * sin(theta) * cos(phi), - distance * sin(theta) * sin(phi), - distance * cos(theta)); + m_NumberOfModule++; + + // convert from degree to radian: + double Pi = 3.141592654; + theta = theta * Pi/180. ; + phi = phi * Pi/180. ; + + // Vector U on Module Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis) + TVector3 U ; + // Vector V on Module Face (parallele to X Strip) + TVector3 V ; + // Vector W normal to Module Face (pointing CsI) + TVector3 W ; + // Vector position of Module Face center + TVector3 C ; + + C = TVector3(distance * sin(theta) * cos(phi), + distance * sin(theta) * sin(phi), + distance * cos(theta)); TVector3 YperpW = TVector3( cos(theta) * cos(phi), - cos(theta) * sin(phi), - -sin(theta)); - - W = C.Unit(); - U = W.Cross(YperpW); - V = W.Cross(U); - - U = U.Unit(); - V = V.Unit(); - - U.Rotate( beta_u * Pi/180. , U ) ; - V.Rotate( beta_u * Pi/180. , U ) ; - - U.Rotate( beta_v * Pi/180. , V ) ; - V.Rotate( beta_v * Pi/180. , V ) ; - - U.Rotate( beta_w * Pi/180. , W ) ; - V.Rotate( beta_w * Pi/180. , W ) ; - - double Face = 1; // mm - double NumberOfStrip = 1; - //double NumberOfStrip = 500; - double StripPitch = 9.8; // Face/NumberOfStrip; // mm - - vector<double> lineX; - vector<double> lineY; - vector<double> lineZ; - - vector< vector< double > > OneModuleStripPositionX; - vector< vector< double > > OneModuleStripPositionY; - vector< vector< double > > OneModuleStripPositionZ; - - double X, Y, Z; - - // Moving C to the 1.1 corner: - C.SetX( C.X() - ( Face/2 - StripPitch/2 ) * ( V.X() + U.X() ) ) ; - C.SetY( C.Y() - ( Face/2 - StripPitch/2 ) * ( V.Y() + U.Y() ) ) ; - C.SetZ( C.Z() - ( Face/2 - StripPitch/2 ) * ( V.Z() + U.Z() ) ) ; - - for (int i = 0; i < NumberOfStrip; i++) { - lineX.clear(); - lineY.clear(); - lineZ.clear(); - - for (int j = 0; j < NumberOfStrip; j++) { - X = C.X() + StripPitch * ( U.X()*i + V.X()*j ); - Y = C.Y() + StripPitch * ( U.Y()*i + V.Y()*j ); - Z = C.Z() + StripPitch * ( U.Z()*i + V.Z()*j ); - - lineX.push_back(X); - lineY.push_back(Y); - lineZ.push_back(Z); - } + cos(theta) * sin(phi), + -sin(theta)); - OneModuleStripPositionX.push_back(lineX); - OneModuleStripPositionY.push_back(lineY); - OneModuleStripPositionZ.push_back(lineZ); - } + W = C.Unit(); + U = W.Cross(YperpW); + V = W.Cross(U); + + U = U.Unit(); + V = V.Unit(); + + U.Rotate( beta_u * Pi/180. , U ) ; + V.Rotate( beta_u * Pi/180. , U ) ; + + U.Rotate( beta_v * Pi/180. , V ) ; + V.Rotate( beta_v * Pi/180. , V ) ; + + U.Rotate( beta_w * Pi/180. , W ) ; + V.Rotate( beta_w * Pi/180. , W ) ; + + double Face = 1; // mm + double NumberOfStrip = 1; + //double NumberOfStrip = 500; + double StripPitch = 9.8; // Face/NumberOfStrip; // mm + + vector<double> lineX; + vector<double> lineY; + vector<double> lineZ; + + vector< vector< double > > OneModuleStripPositionX; + vector< vector< double > > OneModuleStripPositionY; + vector< vector< double > > OneModuleStripPositionZ; + + double X, Y, Z; - m_StripPositionX.push_back( OneModuleStripPositionX ); - m_StripPositionY.push_back( OneModuleStripPositionY ); - m_StripPositionZ.push_back( OneModuleStripPositionZ ); + // Moving C to the 1.1 corner: + C.SetX( C.X() - ( Face/2 - StripPitch/2 ) * ( V.X() + U.X() ) ) ; + C.SetY( C.Y() - ( Face/2 - StripPitch/2 ) * ( V.Y() + U.Y() ) ) ; + C.SetZ( C.Z() - ( Face/2 - StripPitch/2 ) * ( V.Z() + U.Z() ) ) ; + + for (int i = 0; i < NumberOfStrip; i++) { + lineX.clear(); + lineY.clear(); + lineZ.clear(); + + for (int j = 0; j < NumberOfStrip; j++) { + X = C.X() + StripPitch * ( U.X()*i + V.X()*j ); + Y = C.Y() + StripPitch * ( U.Y()*i + V.Y()*j ); + Z = C.Z() + StripPitch * ( U.Z()*i + V.Z()*j ); + + lineX.push_back(X); + lineY.push_back(Y); + lineZ.push_back(Z); + } + + OneModuleStripPositionX.push_back(lineX); + OneModuleStripPositionY.push_back(lineY); + OneModuleStripPositionZ.push_back(lineZ); + } + + m_StripPositionX.push_back( OneModuleStripPositionX ); + m_StripPositionY.push_back( OneModuleStripPositionY ); + m_StripPositionZ.push_back( OneModuleStripPositionZ ); } @@ -603,65 +379,66 @@ void Helios::AddModuleDummyShape(double theta, double Helios::GetEnergyDeposit() { - //if (m_EventPhysics->TotalEnergy.size() > 0) - if (m_EventPhysics->GetEventMultiplicity() > 0) - return m_EventPhysics->fTotalEnergy[0]; - else - return -1000; + //if (m_EventPhysics->TotalEnergy.size() > 0) + if (m_EventPhysics->GetEventMultiplicity() > 0) + return m_EventPhysics->fTotalEnergy[0]; + else + return -1000; } double Helios::GetTimeDetected() { - if (m_EventPhysics->fTotalTime.size() > 0) - return m_EventPhysics->fTotalTime[0]; - else - return -1000; + if (m_EventPhysics->fTotalTime.size() > 0) + return m_EventPhysics->fTotalTime[0]; + else + return -1000; } TVector3 Helios::GetPositionOfInteraction() { -/* !! not possible with helios as we don't measure Y -> use interaction coordinate Z instead !! - * - * TVector3 Position = TVector3(-1000,-1000,-1000); + /* !! not possible with helios as we don't measure Y -> use interaction coordinate Z instead !! + * + * TVector3 Position = TVector3(-1000,-1000,-1000); if (m_EventPhysics->fModuleNumber.size() == 1) { - cout << "Module=" << m_EventPhysics->fModuleNumber[0] << endl; - cout << "1ststage X" << m_EventPhysics->fFirstStage_X[0] << endl; - cout << "1ststage Y" << m_EventPhysics->fFirstStage_Y[0] << endl; + cout << "Module=" << m_EventPhysics->fModuleNumber[0] << endl; + cout << "1ststage X" << m_EventPhysics->fFirstStage_X[0] << endl; + cout << "1ststage Y" << m_EventPhysics->fFirstStage_Y[0] << endl; - Position = TVector3(GetStripPositionX((m_EventPhysics->fModuleNumber[0])-1000, m_EventPhysics->fFirstStage_X[0], m_EventPhysics->fFirstStage_Y[0]), - GetStripPositionY((m_EventPhysics->fModuleNumber[0])-1000, m_EventPhysics->fFirstStage_X[0], m_EventPhysics->fFirstStage_Y[0]), - GetStripPositionZ((m_EventPhysics->fModuleNumber[0])-1000, m_EventPhysics->fFirstStage_X[0], m_EventPhysics->fFirstStage_Y[0])); + Position = TVector3(GetStripPositionX((m_EventPhysics->fModuleNumber[0])-1000, m_EventPhysics->fFirstStage_X[0], m_EventPhysics->fFirstStage_Y[0]), + GetStripPositionY((m_EventPhysics->fModuleNumber[0])-1000, m_EventPhysics->fFirstStage_X[0], m_EventPhysics->fFirstStage_Y[0]), + GetStripPositionZ((m_EventPhysics->fModuleNumber[0])-1000, m_EventPhysics->fFirstStage_X[0], m_EventPhysics->fFirstStage_Y[0])); } return(Position); -*/ + */ +return (TVector3(0,0,0)); } void Helios::Print() { - cout << "Number of Modules: " << m_NumberOfModule << endl; - - for (int f = 0; f < m_NumberOfModule; f++) { - cout << "Module " << f+1 << endl; - - for (int i = 0; i < 128; i++) { - for (int j = 0; j < 128; j++) { - cout << i+1 << " "<< j+1 << " " - << m_StripPositionX[f][i][j] << " " - << m_StripPositionY[f][i][j] << " " - << m_StripPositionZ[f][i][j] << " " - << endl ; - } + cout << "Number of Modules: " << m_NumberOfModule << endl; + + for (int f = 0; f < m_NumberOfModule; f++) { + cout << "Module " << f+1 << endl; + + for (int i = 0; i < 128; i++) { + for (int j = 0; j < 128; j++) { + cout << i+1 << " "<< j+1 << " " + << m_StripPositionX[f][i][j] << " " + << m_StripPositionY[f][i][j] << " " + << m_StripPositionZ[f][i][j] << " " + << endl ; } - } + } + } } @@ -679,8 +456,8 @@ extern "C"{ class proxy_helios{ public: proxy_helios(){ - NPL::DetectorFactory::getInstance()->AddToken("Helios","Helios"); - NPL::DetectorFactory::getInstance()->AddDetector("Helios",Helios::Construct); + NPL::DetectorFactory::getInstance()->AddToken("HeliosDummyShape","Helios"); + NPL::DetectorFactory::getInstance()->AddDetector("HeliosDummyShape",Helios::Construct); } }; diff --git a/NPLib/Detectors/Helios/Helios.h b/NPLib/Detectors/Helios/Helios.h index 281ef47f0b6360233c4fbebd846dfd135e03e0f9..f26ed5f7931e5b87209b24a60f1b5a2cedcd146a 100644 --- a/NPLib/Detectors/Helios/Helios.h +++ b/NPLib/Detectors/Helios/Helios.h @@ -27,7 +27,7 @@ #include "NPVDetector.h" #include "THeliosData.h" #include "THeliosPhysics.h" - +#include "NPInputParser.h" // Root #include "TVector3.h" @@ -42,7 +42,7 @@ public: // Innherited from VDetector Class // ///////////////////////////////////// // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Read stream at CalibFile and pick-up calibration parameter using Token // If argument is "Simulation" no change calibration is loaded diff --git a/NPLib/Detectors/Helios2/THelios2Physics.cxx b/NPLib/Detectors/Helios2/THelios2Physics.cxx index 35352db0fa2a23d62757ab7e790d906059cad290..da24a8ed2c46e113eced05357a74913777e4a4c5 100644 --- a/NPLib/Detectors/Helios2/THelios2Physics.cxx +++ b/NPLib/Detectors/Helios2/THelios2Physics.cxx @@ -35,6 +35,7 @@ using namespace std; #include "RootOutput.h" #include "NPDetectorFactory.h" #include "NPPhysicalConstants.h" +#include "NPOptionManager.h" // ROOT #include "TChain.h" @@ -287,88 +288,34 @@ void THelios2Physics::Clear() { /////////////////////////////////////////////////////////////////////////// -void THelios2Physics::ReadConfiguration(string Path) { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - bool check_Face = false ; - bool check_Z = false ; - bool ReadingStatus = false ; - double Z; - string Face; - - while (!ConfigFile.eof()){ - getline(ConfigFile, LineBuffer); - - // If line is a Start Up Helios2 bloc, Reading toggle to true - string name="Helios2"; - if (LineBuffer.compare(0, name.length(), name) == 0){ - cout << "///" << endl ; - cout << "Helios2 found: " << endl ; - ReadingStatus = true ; - } - - // Reading Block - while(ReadingStatus) - { - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, name.length(), name) == 0) { - cout << "\033[1;311mWARNING: Another detector is find before standard sequence of Token, Error may occured in detector definition\033[0m" << endl ; - ReadingStatus = false ; - } - - // Z and Face of the square - else if (DataBuffer=="Z=") { - check_Z= true; - ConfigFile >> Z; - - cout << "Z: " << Z << "mm" << endl; - } +void THelios2Physics::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Helios2"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; - else if (DataBuffer=="Face=") { - check_Face = true; - ConfigFile >> Face; - cout << "Face: " << Face << endl; - } - - else if (DataBuffer=="MagneticField="){ - ConfigFile >> m_B; - m_B*=NPUNITS::tesla; - cout << "Magnetic Field set to " << m_B << " Tesla" << endl; - } + vector<string> token = {"Z","Face"}; - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ; - } + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasToken("MagneticField")) + m_B=blocks[i]->GetDouble("MagneticField","T"); - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ( check_Z && check_Face ){ - m_NumberOfDetectors++; - m_Z.push_back(Z); - m_Face.push_back(Face); + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Helios2 " << i+1 << endl; + double Z = blocks[i]->GetDouble("Z","mm"); + string Face = blocks[i]->GetString("Face"); - // Reinitialisation of Check Boolean - check_Z = false ; - check_Face = false ; + m_Z.push_back(Z); + m_Face.push_back(Face); + } - ReadingStatus = false ; - cout << "///"<< endl ; - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } + + ReadAnalysisConfig(); } diff --git a/NPLib/Detectors/Helios2/THelios2Physics.h b/NPLib/Detectors/Helios2/THelios2Physics.h index e9954538ab7a3695c3f9ffc09d336d105d454fb9..212abcfc5943cc7d472e8fb488dcc932d30df560 100644 --- a/NPLib/Detectors/Helios2/THelios2Physics.h +++ b/NPLib/Detectors/Helios2/THelios2Physics.h @@ -38,7 +38,7 @@ using namespace std; #include "THelios2Spectra.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" - +#include "NPInputParser.h" // forward declaration class THelios2Spectra; @@ -77,7 +77,7 @@ class THelios2Physics : public TObject, public NPL::VDetector { // methods inherited from the VDetector ABC class public: // read stream from ConfigFile to pick-up detector parameters - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // add parameters to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/Detectors/Hira/THiraPhysics.cxx b/NPLib/Detectors/Hira/THiraPhysics.cxx index d50cdc341cf3bc8bc24559b3b16b2730e289633e..ccefeec09b206e6e32b2241520db22bff81fa57f 100644 --- a/NPLib/Detectors/Hira/THiraPhysics.cxx +++ b/NPLib/Detectors/Hira/THiraPhysics.cxx @@ -26,8 +26,7 @@ #include "RootOutput.h" #include "NPDetectorFactory.h" #include "NPCalibrationManager.h" -#include "NPCalibrationManager.h" - +#include "NPOptionManager.h" // STL #include <iostream> #include <sstream> @@ -157,227 +156,37 @@ void THiraPhysics::Clear(){ } /////////////////////////////////////////////////////////////////////////// -void THiraPhysics::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - TVector3 A , B , C , D ; - - - bool ReadingStatus = false ; - - bool check_A = false ; - bool check_C = false ; - bool check_B = false ; - bool check_D = false ; - bool check_ThinSi = false; - bool check_ThickSi = false; - bool check_CsI = false; - /*bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ;*/ - - - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 13, "HiraTelescope") == 0) { - cout << "///" << endl ; - cout << "Hira element found: " << endl ; - ReadingStatus = true ; - } - - while(ReadingStatus){ - - ConfigFile >> DataBuffer; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} - - // Position method - else if (DataBuffer.compare(0, 2, "A=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az; - - A = TVector3(Ax, Ay, Az); - cout << "A corner position : " << A.X() << ";" << A.Y() << ";" << A.Z() << endl; - } - - else if (DataBuffer.compare(0, 2, "B=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz; - - B = TVector3(Bx, By, Bz); - cout << "B corner position : " << B.X() << ";" << B.Y() << ";" << B.Z() << endl; - } - - else if (DataBuffer.compare(0, 2, "C=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz; - - C = TVector3(Cx, Cy, Cz); - cout << "C corner position : " << C.X() << ";" << C.Y() << ";" << C.Z() << endl; - } - - else if (DataBuffer.compare(0, 2, "D=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz; - - D = TVector3(Dx, Dy, Dz); - cout << "D corner position : " << D.X() << ";" << D.Y() << ";" << D.Z() << endl; - } - - else if (DataBuffer.compare(0, 10, "ThinSi_DE=") == 0) { - check_ThinSi= true; - ConfigFile >> DataBuffer ; - m_build_ThinSi = atoi(DataBuffer.c_str()) ; - cout << "Build ThinSi : " << m_build_ThinSi << endl; - } - - else if (DataBuffer.compare(0, 10, "ThickSi_E=") == 0) { - check_ThickSi= true; - ConfigFile >> DataBuffer ; - m_build_ThickSi = atoi(DataBuffer.c_str()) ; - cout << "Build ThickSi : " << m_build_ThickSi << endl; - } - - else if (DataBuffer.compare(0, 4, "CsI=") == 0) { - check_CsI= true; - ConfigFile >> DataBuffer ; - m_build_CsI = atoi(DataBuffer.c_str()) ; - cout << "Build CsI : " << m_build_CsI << endl; - } +void THiraPhysics::ReadConfiguration(NPL::InputParser parser){ + + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("HiraTelescope"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " Telescope found " << endl; + + // Cartesian Case + vector<string> cart = {"A","B","C","D","ThickSi_E","ThinSi_DE","CsI"}; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Hira Telescope " << i+1 << endl; + TVector3 A = blocks[i]->GetTVector3("A","mm"); + TVector3 B = blocks[i]->GetTVector3("B","mm"); + TVector3 C = blocks[i]->GetTVector3("C","mm"); + TVector3 D = blocks[i]->GetTVector3("D","mm"); + AddTelescope(A,B,C,D) ; + } - - - // Angle method - /* else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - cout << "Theta: " << Theta / deg << endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - cout << "Phi: " << Phi / deg << endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - cout << "R: " << R / mm << endl; - } - - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << endl ; - }*/ - - - else cout << "WARNING: Wrong Token, GaspardTrackerRectangle: Rectangle Element not added" << endl; - - //Add The previously define telescope - //With position method - if (check_A && check_B && check_C && check_D && check_ThinSi && check_ThickSi && check_CsI) { - - ReadingStatus = false ; - check_A = false ; - check_C = false ; - check_B = false ; - check_D = false ; - - AddTelescope(A , - B , - C , - D); - } - - //with angle method - /*if ((check_Theta && check_Phi && check_R && check_FirstStage && check_SecondStage && check_ThirdStage && checkVis) && !(check_A && check_B && check_C && check_D)) { - ReadingStatus = false ; - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_FirstStage = false ; - check_SecondStage = false ; - check_ThirdStage = false ; - checkVis = false ; - - AddModule(R , - Theta , - Phi , - beta_u , - beta_v , - beta_w , - FIRSTSTAGE == 1 , - SECONDSTAGE == 1 , - THIRDSTAGE == 1); - }*/ - - - } + else{ + cout << "ERROR: Missing token for M2Telescope blocks, check your input file" << endl; + exit(1); } - - InitializeStandardParameter(); - ReadAnalysisConfig(); - - cout << endl << "/////////////////////////////" << endl << endl; + + } + + InitializeStandardParameter(); + ReadAnalysisConfig(); } + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void THiraPhysics::AddTelescope(TVector3 Pos1, TVector3 Pos2, TVector3 Pos3, TVector3 Pos4){ m_NumberOfTelescope++; @@ -971,8 +780,8 @@ extern "C"{ class proxy_hira{ public: proxy_hira(){ - NPL::DetectorFactory::getInstance()->AddToken("HIRAArray","Hira"); - NPL::DetectorFactory::getInstance()->AddDetector("HIRAArray",THiraPhysics::Construct); + NPL::DetectorFactory::getInstance()->AddToken("HiraTelescope","Hira"); + NPL::DetectorFactory::getInstance()->AddDetector("HiraTelescope",THiraPhysics::Construct); } }; diff --git a/NPLib/Detectors/Hira/THiraPhysics.h b/NPLib/Detectors/Hira/THiraPhysics.h index e21d3a6109b8b5c6422905c0ed5e8af2fe73aa4e..8d87efa1ce230d9fd920a931d660a7e3f70bc455 100644 --- a/NPLib/Detectors/Hira/THiraPhysics.h +++ b/NPLib/Detectors/Hira/THiraPhysics.h @@ -37,7 +37,7 @@ using namespace std ; #include "THiraData.h" #include "NPVDetector.h" #include "NPCalibrationManager.h" - +#include "NPInputParser.h" class THiraPhysics : public TObject, public NPL::VDetector { @@ -82,7 +82,7 @@ public: // Calibrated Data public: // inherrited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManger diff --git a/NPLib/Detectors/LaBr3/TLaBr3Physics.cxx b/NPLib/Detectors/LaBr3/TLaBr3Physics.cxx index 5583706af8a512d09c39a83d3c8b76c2a9993a8c..8f9f42d8ed5ca06900995d72a60fd6281c1eb00f 100644 --- a/NPLib/Detectors/LaBr3/TLaBr3Physics.cxx +++ b/NPLib/Detectors/LaBr3/TLaBr3Physics.cxx @@ -25,6 +25,7 @@ #include "RootOutput.h" #include "RootInput.h" #include "NPDetectorFactory.h" +#include "NPOptionManager.h" // STL #include <iostream> @@ -72,136 +73,36 @@ void TLaBr3Physics::Clear() } /////////////////////////////////////////////////////////////////////////// -void TLaBr3Physics::ReadConfiguration(string Path) - { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool check_Radius = false ; - bool check_Height = false ; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - bool ReadingStatus = false ; - - while (!ConfigFile.eof()) - { - - getline(ConfigFile, LineBuffer); - - // If line is a Start Up LaBr3 bloc, Reading toggle to true - if (LineBuffer.compare(0, 5, "LaBr3") == 0) - { - cout << "///" << endl ; - cout << "LaBr3 found: " << endl ; - ReadingStatus = true ; - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus) - { - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 5, "LaBr3") == 0) { - cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << endl ; - ReadingStatus = false ; - } - - //Angle method - else if (DataBuffer=="THETA=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - cout << "Theta: " << atof(DataBuffer.c_str()) << "deg" << endl; - } - - else if (DataBuffer=="PHI=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - cout << "Phi: " << atof( DataBuffer.c_str() ) << "deg" << endl; - } +void TLaBr3Physics::ReadConfiguration(NPL::InputParser parser) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("LaBr3"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; - else if (DataBuffer=="R=") { - check_R = true; - ConfigFile >> DataBuffer ; - cout << "R: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - //Position method - else if (DataBuffer=="X=") { - check_X = true; - ConfigFile >> DataBuffer ; - cout << "X: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } + vector<string> token_sphe = {"R","THETA","PHI"}; + vector<string> token_cart = {"X","Y","Z"}; - else if (DataBuffer=="Y=") { - check_Y = true; - ConfigFile >> DataBuffer ; - cout << "Y: " << atof( DataBuffer.c_str() ) << "mm"<< endl; - } + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token_cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// LaBr3" << i+1 << endl; + blocks[i]->GetDouble("X","mm"); + blocks[i]->GetDouble("Y","mm"); + blocks[i]->GetDouble("Z","mm"); + } + else if(blocks[i]->HasTokenList(token_sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// LaBr3" << i+1 << endl; + blocks[i]->GetDouble("R","deg"); + blocks[i]->GetDouble("THETA","deg"); + blocks[i]->GetDouble("PHI","deg"); + } - else if (DataBuffer=="Z=") { - check_Z = true; - ConfigFile >> DataBuffer ; - cout << "Z: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - - - // Cylindrical shape - else if (DataBuffer== "Radius=") { - check_Radius = true; - ConfigFile >> DataBuffer ; - cout << "LaBr3 Radius: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - - else if (DataBuffer== "Height=") { - check_Height = true; - ConfigFile >> DataBuffer ; - cout << "LaBr3 Height: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else - {ReadingStatus = false; cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ;} - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if ( check_Theta && check_Phi && check_R && check_Radius && check_Height && check_X && check_Y && check_Z ) - { - NumberOfDetector++; - - // Reinitialisation of Check Boolean - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_Radius = false ; - check_Height = false ; - check_X = false ; - check_Y = false ; - check_Z = false ; - ReadingStatus = false ; - cout << "///"<< endl ; - } - } - } - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } +} /////////////////////////////////////////////////////////////////////////// void TLaBr3Physics::AddParameterToCalibrationManager() diff --git a/NPLib/Detectors/LaBr3/TLaBr3Physics.h b/NPLib/Detectors/LaBr3/TLaBr3Physics.h index 79b4a3c7224839a5a68c12f413ee440a9711911c..276c61cdc7e9186e3d3453c1a8b3884ec7b73b92 100644 --- a/NPLib/Detectors/LaBr3/TLaBr3Physics.h +++ b/NPLib/Detectors/LaBr3/TLaBr3Physics.h @@ -35,7 +35,7 @@ class TLaBr3Spectra; #include "TLaBr3Spectra.h" #include "NPVDetector.h" #include "NPCalibrationManager.h" - +#include "NPInputParser.h" class TLaBr3Physics : public TObject, public NPL::VDetector { public: // Constructor and Destructor @@ -53,7 +53,7 @@ class TLaBr3Physics : public TObject, public NPL::VDetector public: // inherrited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManger diff --git a/NPLib/Detectors/Lassa/TLassaPhysics.cxx b/NPLib/Detectors/Lassa/TLassaPhysics.cxx index e4cfb9698e7098614eac297b15517d5d17b1eaab..2879d39465fcc4f03c6fb1815fb96352d551bb0c 100644 --- a/NPLib/Detectors/Lassa/TLassaPhysics.cxx +++ b/NPLib/Detectors/Lassa/TLassaPhysics.cxx @@ -27,7 +27,7 @@ #include "NPDetectorFactory.h" #include "NPCalibrationManager.h" #include "TAsciiFile.h" - +#include "NPOptionManager.h" // STL #include <sstream> #include <iostream> @@ -118,200 +118,39 @@ void TLassaPhysics::Clear(){ } /////////////////////////////////////////////////////////////////////////// -void TLassaPhysics::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - TVector3 A , B , C , D ; - - - bool ReadingStatus = false ; - - bool check_A = false ; - bool check_C = false ; - bool check_B = false ; - bool check_D = false ; - - /*bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ;*/ - - - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 14, "LassaTelescope") == 0) { - cout << "///" << endl ; - cout << "Lassa element found: " << endl ; - ReadingStatus = true ; - } - - while(ReadingStatus){ - - ConfigFile >> DataBuffer; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} - - // Position method - else if (DataBuffer.compare(0, 2, "A=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az; - - A = TVector3(Ax, Ay, Az); - cout << "A corner position : " << A.X() << ";" << A.Y() << ";" << A.Z() << endl; - } - - else if (DataBuffer.compare(0, 2, "B=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz; - - B = TVector3(Bx, By, Bz); - cout << "B corner position : " << B.X() << ";" << B.Y() << ";" << B.Z() << endl; - } - - else if (DataBuffer.compare(0, 2, "C=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz; - - C = TVector3(Cx, Cy, Cz); - cout << "C corner position : " << C.X() << ";" << C.Y() << ";" << C.Z() << endl; - } - - else if (DataBuffer.compare(0, 2, "D=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz; - - D = TVector3(Dx, Dy, Dz); - cout << "D corner position : " << D.X() << ";" << D.Y() << ";" << D.Z() << endl; - } - - - // Angle method - /* else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - cout << "Theta: " << Theta / deg << endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - cout << "Phi: " << Phi / deg << endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - cout << "R: " << R / mm << endl; - } - - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << endl ; - }*/ - - - else cout << "WARNING: Wrong Token, GaspardTrackerRectangle: Rectangle Element not added" << endl; - - //Add The previously define telescope - //With position method - if (check_A && check_B && check_C && check_D) { - - ReadingStatus = false ; - check_A = false ; - check_C = false ; - check_B = false ; - check_D = false ; - - AddTelescope(A , - B , - C , - D); - } - - //with angle method - /*if ((check_Theta && check_Phi && check_R && check_FirstStage && check_SecondStage && check_ThirdStage && checkVis) && !(check_A && check_B && check_C && check_D)) { - ReadingStatus = false ; - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_FirstStage = false ; - check_SecondStage = false ; - check_ThirdStage = false ; - checkVis = false ; - - AddModule(R , - Theta , - Phi , - beta_u , - beta_v , - beta_w , - FIRSTSTAGE == 1 , - SECONDSTAGE == 1 , - THIRDSTAGE == 1); - }*/ - - - } +void TLassaPhysics::ReadConfiguration(NPL::InputParser parser){ + + + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("LassaTelescope"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " Telescope found " << endl; + + // Cartesian Case + vector<string> cart = {"A","B","C","D"}; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Lassa Telescope " << i+1 << endl; + TVector3 A = blocks[i]->GetTVector3("A","mm"); + TVector3 B = blocks[i]->GetTVector3("B","mm"); + TVector3 C = blocks[i]->GetTVector3("C","mm"); + TVector3 D = blocks[i]->GetTVector3("D","mm"); + AddTelescope(A,B,C,D) ; + } + + else{ + cout << "ERROR: Missing token for M2Telescope blocks, check your input file" << endl; + exit(1); } - InitializeStandardParameter(); - ReadAnalysisConfig(); + + } + + InitializeStandardParameter(); + ReadAnalysisConfig(); } + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void TLassaPhysics::AddTelescope(TVector3 Pos1, TVector3 Pos2, TVector3 Pos3, TVector3 Pos4){ m_NumberOfTelescope++; diff --git a/NPLib/Detectors/Lassa/TLassaPhysics.h b/NPLib/Detectors/Lassa/TLassaPhysics.h index dc9951cd3df5944a041c313983947379405c4a98..c101c9dbf8a1baa3d3c743313074612c9d206a39 100644 --- a/NPLib/Detectors/Lassa/TLassaPhysics.h +++ b/NPLib/Detectors/Lassa/TLassaPhysics.h @@ -37,7 +37,7 @@ using namespace std ; #include "TLassaData.h" #include "NPVDetector.h" #include "NPCalibrationManager.h" - +#include "NPInputParser.h" class TLassaPhysics : public TObject, public NPL::VDetector { @@ -75,7 +75,7 @@ public: // Calibrated Data public: // inherrited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManger diff --git a/NPLib/Detectors/MUST2/TMust2Physics.cxx b/NPLib/Detectors/MUST2/TMust2Physics.cxx index 533e9e0aa6f3a0d26bcf24c9be982c032f45099f..82fbf57c494fbdc9d5943a2bbcd44d1044dc96b8 100644 --- a/NPLib/Detectors/MUST2/TMust2Physics.cxx +++ b/NPLib/Detectors/MUST2/TMust2Physics.cxx @@ -34,14 +34,16 @@ using namespace MUST2_LOCAL; #include "TAsciiFile.h" #include "NPOptionManager.h" #include "NPDetectorFactory.h" - +#include "NPInputParser.h" +#include "NPSystemOfUnits.h" +using namespace NPUNITS; // ROOT #include "TChain.h" /////////////////////////////////////////////////////////////////////////// ClassImp(TMust2Physics) -/////////////////////////////////////////////////////////////////////////// -TMust2Physics::TMust2Physics(){ + /////////////////////////////////////////////////////////////////////////// + TMust2Physics::TMust2Physics(){ EventMultiplicity = 0 ; m_EventData = new TMust2Data ; m_PreTreatedData = new TMust2Data ; @@ -61,1398 +63,1247 @@ TMust2Physics::TMust2Physics(){ m_Si_Y_E_Threshold = 0 ; m_SiLi_E_Threshold = 0 ; m_CsI_E_Threshold = 0; - + m_Ignore_not_matching_SiLi = false ; m_Ignore_not_matching_CsI = false ; - + m_Take_E_Y=false; m_Take_T_Y=true; - + m_SiLi_Size=32; m_SiLi_MatchingX.resize(16,0); m_SiLi_MatchingY.resize(16,0); - + for(int i = 0 ; i < 16 ; ++i){ - m_SiLi_MatchingX[0]=112; - m_SiLi_MatchingY[0]=112; - - m_SiLi_MatchingX[1]=112; - m_SiLi_MatchingY[1]=80; - - m_SiLi_MatchingX[2]=80; - m_SiLi_MatchingY[2]=112; - - m_SiLi_MatchingX[3]=80; - m_SiLi_MatchingY[3]=80; - // - m_SiLi_MatchingX[4]=48; - m_SiLi_MatchingY[4]=80; - - m_SiLi_MatchingX[5]=48; - m_SiLi_MatchingY[5]=112; - - m_SiLi_MatchingX[6]=16; - m_SiLi_MatchingY[6]=80; - - m_SiLi_MatchingX[7]=16; - m_SiLi_MatchingY[7]=112; - // - m_SiLi_MatchingX[8]=112; - m_SiLi_MatchingY[8]=16; - - m_SiLi_MatchingX[9]=112; - m_SiLi_MatchingY[9]=48; - - m_SiLi_MatchingX[10]=80; - m_SiLi_MatchingY[10]=16; - - m_SiLi_MatchingX[11]=80; - m_SiLi_MatchingY[11]=48; - // - m_SiLi_MatchingX[12]=48; - m_SiLi_MatchingY[12]=48; - - m_SiLi_MatchingX[13]=48; - m_SiLi_MatchingY[13]=16; - - m_SiLi_MatchingX[14]=16; - m_SiLi_MatchingY[14]=48; - - m_SiLi_MatchingX[15]=16; - m_SiLi_MatchingY[15]=16; + m_SiLi_MatchingX[0]=112; + m_SiLi_MatchingY[0]=112; + + m_SiLi_MatchingX[1]=112; + m_SiLi_MatchingY[1]=80; + + m_SiLi_MatchingX[2]=80; + m_SiLi_MatchingY[2]=112; + + m_SiLi_MatchingX[3]=80; + m_SiLi_MatchingY[3]=80; + // + m_SiLi_MatchingX[4]=48; + m_SiLi_MatchingY[4]=80; + + m_SiLi_MatchingX[5]=48; + m_SiLi_MatchingY[5]=112; + + m_SiLi_MatchingX[6]=16; + m_SiLi_MatchingY[6]=80; + + m_SiLi_MatchingX[7]=16; + m_SiLi_MatchingY[7]=112; + // + m_SiLi_MatchingX[8]=112; + m_SiLi_MatchingY[8]=16; + + m_SiLi_MatchingX[9]=112; + m_SiLi_MatchingY[9]=48; + + m_SiLi_MatchingX[10]=80; + m_SiLi_MatchingY[10]=16; + + m_SiLi_MatchingX[11]=80; + m_SiLi_MatchingY[11]=48; + // + m_SiLi_MatchingX[12]=48; + m_SiLi_MatchingY[12]=48; + + m_SiLi_MatchingX[13]=48; + m_SiLi_MatchingY[13]=16; + + m_SiLi_MatchingX[14]=16; + m_SiLi_MatchingY[14]=48; + + m_SiLi_MatchingX[15]=16; + m_SiLi_MatchingY[15]=16; } - + m_CsI_Size=32; m_CsI_MatchingX.resize(16,0); m_CsI_MatchingY.resize(16,0); for(int i = 0 ; i < 16 ; ++i){ - m_CsI_MatchingX[0]=80; - m_CsI_MatchingY[0]=48; - - m_CsI_MatchingX[1]=112; - m_CsI_MatchingY[1]=48; - - m_CsI_MatchingX[2]=80; - m_CsI_MatchingY[2]=16; - - m_CsI_MatchingX[3]=112; - m_CsI_MatchingY[3]=16; - // - m_CsI_MatchingX[4]=48; - m_CsI_MatchingY[4]=80; - - m_CsI_MatchingX[5]=16; - m_CsI_MatchingY[5]=80; - - m_CsI_MatchingX[6]=48; - m_CsI_MatchingY[6]=112; - - m_CsI_MatchingX[7]=16; - m_CsI_MatchingY[7]=112; - // - m_CsI_MatchingX[8]=48; - m_CsI_MatchingY[8]=48; - - m_CsI_MatchingX[9]=16; - m_CsI_MatchingY[9]=48; - - m_CsI_MatchingX[10]=48; - m_CsI_MatchingY[10]=16; - - m_CsI_MatchingX[11]=16; - m_CsI_MatchingY[11]=16; - // - m_CsI_MatchingX[12]=80; - m_CsI_MatchingY[12]=80; - - m_CsI_MatchingX[13]=112; - m_CsI_MatchingY[13]=80; - - m_CsI_MatchingX[14]=80; - m_CsI_MatchingY[14]=112; - - m_CsI_MatchingX[15]=112; - m_CsI_MatchingY[15]=112; + m_CsI_MatchingX[0]=80; + m_CsI_MatchingY[0]=48; + + m_CsI_MatchingX[1]=112; + m_CsI_MatchingY[1]=48; + + m_CsI_MatchingX[2]=80; + m_CsI_MatchingY[2]=16; + + m_CsI_MatchingX[3]=112; + m_CsI_MatchingY[3]=16; + // + m_CsI_MatchingX[4]=48; + m_CsI_MatchingY[4]=80; + + m_CsI_MatchingX[5]=16; + m_CsI_MatchingY[5]=80; + + m_CsI_MatchingX[6]=48; + m_CsI_MatchingY[6]=112; + + m_CsI_MatchingX[7]=16; + m_CsI_MatchingY[7]=112; + // + m_CsI_MatchingX[8]=48; + m_CsI_MatchingY[8]=48; + + m_CsI_MatchingX[9]=16; + m_CsI_MatchingY[9]=48; + + m_CsI_MatchingX[10]=48; + m_CsI_MatchingY[10]=16; + + m_CsI_MatchingX[11]=16; + m_CsI_MatchingY[11]=16; + // + m_CsI_MatchingX[12]=80; + m_CsI_MatchingY[12]=80; + + m_CsI_MatchingX[13]=112; + m_CsI_MatchingY[13]=80; + + m_CsI_MatchingX[14]=80; + m_CsI_MatchingY[14]=112; + + m_CsI_MatchingX[15]=112; + m_CsI_MatchingY[15]=112; } - -} + + } /////////////////////////////////////////////////////////////////////////// TMust2Physics::~TMust2Physics(){ - + } /////////////////////////////////////////////////////////////////////////// void TMust2Physics::BuildSimplePhysicalEvent(){ - BuildPhysicalEvent(); + BuildPhysicalEvent(); } /////////////////////////////////////////////////////////////////////////// void TMust2Physics::BuildPhysicalEvent(){ - PreTreat(); - - bool check_SILI = false ; - bool check_CSI = false ; - - m_StripXEMult = m_PreTreatedData->GetMMStripXEMult(); - m_StripYEMult = m_PreTreatedData->GetMMStripYEMult(); - m_StripXTMult = m_PreTreatedData->GetMMStripXTMult(); - m_StripYTMult = m_PreTreatedData->GetMMStripYTMult(); - m_SiLiEMult = m_PreTreatedData->GetMMSiLiEMult(); - m_SiLiTMult = m_PreTreatedData->GetMMSiLiTMult(); - m_CsIEMult = m_PreTreatedData->GetMMCsIEMult(); - m_CsITMult = m_PreTreatedData->GetMMCsITMult(); - - if( CheckEvent() == 1 ){ - vector< TVector2 > couple = Match_X_Y() ; - EventMultiplicity = couple.size(); - - for(unsigned int i = 0 ; i < couple.size() ; ++i){ - check_SILI = false ; - check_CSI = false ; - - int N = m_PreTreatedData->GetMMStripXEDetectorNbr(couple[i].X()) ; - - int X = m_PreTreatedData->GetMMStripXEStripNbr(couple[i].X()) ; - int Y = m_PreTreatedData->GetMMStripYEStripNbr(couple[i].Y()) ; - - double Si_X_E = m_PreTreatedData->GetMMStripXEEnergy( couple[i].X() ) ; - double Si_Y_E = m_PreTreatedData->GetMMStripYEEnergy( couple[i].Y() ) ; - - // Search for associate Time - double Si_X_T = -1000 ; - for(unsigned int t = 0 ; t < m_StripXTMult ; ++t ){ - if( m_PreTreatedData->GetMMStripXTStripNbr( couple[i].X() ) == m_PreTreatedData->GetMMStripXTStripNbr(t) - && m_PreTreatedData->GetMMStripXTDetectorNbr( couple[i].X() ) == m_PreTreatedData->GetMMStripXTDetectorNbr(t)){ - Si_X_T = m_PreTreatedData->GetMMStripXTTime(t); - break; - } - } - - double Si_Y_T = -1000 ; - for(unsigned int t = 0 ; t < m_StripYTMult ; ++t ){ - if( m_PreTreatedData->GetMMStripYTStripNbr( couple[i].Y() ) == m_PreTreatedData->GetMMStripYTStripNbr(t) - && m_PreTreatedData->GetMMStripYTDetectorNbr( couple[i].Y() ) == m_PreTreatedData->GetMMStripYTDetectorNbr(t)){ - Si_Y_T = m_PreTreatedData->GetMMStripYTTime(t); - break; - } - } - - Si_X.push_back(X) ; Si_Y.push_back(Y) ; TelescopeNumber.push_back(N) ; - - if(m_Take_E_Y) Si_E.push_back(Si_Y_E); - else Si_E.push_back(Si_X_E); - - if(m_Take_T_Y) Si_T.push_back(Si_Y_T); - else Si_T.push_back(Si_X_T); - - // Store the other value for checking purpose - Si_EX.push_back(Si_X_E); - Si_TX.push_back(Si_X_T); - - Si_EY.push_back(Si_Y_E); - Si_TY.push_back(Si_Y_T); - - for(unsigned int j = 0 ; j < m_SiLiEMult; ++j){ - if(m_PreTreatedData->GetMMSiLiEDetectorNbr(j)==N){ - // pad vs strip number match - if( Match_Si_SiLi( X, Y , m_PreTreatedData->GetMMSiLiEPadNbr(j) ) ){ - SiLi_N.push_back(m_PreTreatedData->GetMMSiLiEPadNbr(j)) ; - SiLi_E.push_back(m_PreTreatedData->GetMMSiLiEEnergy(j)) ; - SiLi_T.push_back(-1000) ; - // Look for associate time - for(unsigned int k =0 ; k < m_SiLiTMult ; ++k){ - // Same Pad, same Detector - if( m_PreTreatedData->GetMMSiLiEPadNbr(j)==m_PreTreatedData->GetMMSiLiTPadNbr(k) - && m_PreTreatedData->GetMMSiLiEDetectorNbr(j)==m_PreTreatedData->GetMMSiLiTDetectorNbr(k)){ - SiLi_T[SiLi_T.size()-1]= m_PreTreatedData->GetMMSiLiTTime(k) ; - break ; - } - } - - check_SILI = true ; - } - } - } - - for(unsigned int j = 0 ; j < m_CsIEMult ; ++j){ - if(m_PreTreatedData->GetMMCsIEDetectorNbr(j)==N){ - if(Match_Si_CsI( X, Y , m_PreTreatedData->GetMMCsIECristalNbr(j) ) ){ - CsI_N.push_back( m_PreTreatedData->GetMMCsIECristalNbr(j) ) ; - CsI_E.push_back( m_PreTreatedData->GetMMCsIEEnergy(j) ) ; - CsI_T.push_back(-1000); - // Look for associate Time - for(unsigned int k =0 ; k < m_CsITMult ; ++k){ - // Same Cristal, Same Detector - if( m_PreTreatedData->GetMMCsIECristalNbr(j)==m_PreTreatedData->GetMMCsITCristalNbr(k) - && m_PreTreatedData->GetMMCsIEDetectorNbr(j)==m_PreTreatedData->GetMMCsITDetectorNbr(k) ){ - CsI_T[CsI_T.size()-1]= m_PreTreatedData->GetMMCsITTime(j) ; - break ; - } - } - - check_CSI = true ; - } - } - } - - - if(!check_SILI){ - SiLi_N.push_back(0) ; - SiLi_E.push_back(-1000) ; - SiLi_T.push_back(-1000) ; + PreTreat(); + + bool check_SILI = false ; + bool check_CSI = false ; + + m_StripXEMult = m_PreTreatedData->GetMMStripXEMult(); + m_StripYEMult = m_PreTreatedData->GetMMStripYEMult(); + m_StripXTMult = m_PreTreatedData->GetMMStripXTMult(); + m_StripYTMult = m_PreTreatedData->GetMMStripYTMult(); + m_SiLiEMult = m_PreTreatedData->GetMMSiLiEMult(); + m_SiLiTMult = m_PreTreatedData->GetMMSiLiTMult(); + m_CsIEMult = m_PreTreatedData->GetMMCsIEMult(); + m_CsITMult = m_PreTreatedData->GetMMCsITMult(); + + if( CheckEvent() == 1 ){ + vector< TVector2 > couple = Match_X_Y() ; + EventMultiplicity = couple.size(); + + for(unsigned int i = 0 ; i < couple.size() ; ++i){ + check_SILI = false ; + check_CSI = false ; + + int N = m_PreTreatedData->GetMMStripXEDetectorNbr(couple[i].X()) ; + + int X = m_PreTreatedData->GetMMStripXEStripNbr(couple[i].X()) ; + int Y = m_PreTreatedData->GetMMStripYEStripNbr(couple[i].Y()) ; + + double Si_X_E = m_PreTreatedData->GetMMStripXEEnergy( couple[i].X() ) ; + double Si_Y_E = m_PreTreatedData->GetMMStripYEEnergy( couple[i].Y() ) ; + + // Search for associate Time + double Si_X_T = -1000 ; + for(unsigned int t = 0 ; t < m_StripXTMult ; ++t ){ + if( m_PreTreatedData->GetMMStripXTStripNbr( couple[i].X() ) == m_PreTreatedData->GetMMStripXTStripNbr(t) + && m_PreTreatedData->GetMMStripXTDetectorNbr( couple[i].X() ) == m_PreTreatedData->GetMMStripXTDetectorNbr(t)){ + Si_X_T = m_PreTreatedData->GetMMStripXTTime(t); + break; + } + } + + double Si_Y_T = -1000 ; + for(unsigned int t = 0 ; t < m_StripYTMult ; ++t ){ + if( m_PreTreatedData->GetMMStripYTStripNbr( couple[i].Y() ) == m_PreTreatedData->GetMMStripYTStripNbr(t) + && m_PreTreatedData->GetMMStripYTDetectorNbr( couple[i].Y() ) == m_PreTreatedData->GetMMStripYTDetectorNbr(t)){ + Si_Y_T = m_PreTreatedData->GetMMStripYTTime(t); + break; + } + } + + Si_X.push_back(X) ; Si_Y.push_back(Y) ; TelescopeNumber.push_back(N) ; + + if(m_Take_E_Y) Si_E.push_back(Si_Y_E); + else Si_E.push_back(Si_X_E); + + if(m_Take_T_Y) Si_T.push_back(Si_Y_T); + else Si_T.push_back(Si_X_T); + + // Store the other value for checking purpose + Si_EX.push_back(Si_X_E); + Si_TX.push_back(Si_X_T); + + Si_EY.push_back(Si_Y_E); + Si_TY.push_back(Si_Y_T); + + for(unsigned int j = 0 ; j < m_SiLiEMult; ++j){ + if(m_PreTreatedData->GetMMSiLiEDetectorNbr(j)==N){ + // pad vs strip number match + if( Match_Si_SiLi( X, Y , m_PreTreatedData->GetMMSiLiEPadNbr(j) ) ){ + SiLi_N.push_back(m_PreTreatedData->GetMMSiLiEPadNbr(j)) ; + SiLi_E.push_back(m_PreTreatedData->GetMMSiLiEEnergy(j)) ; + SiLi_T.push_back(-1000) ; + // Look for associate time + for(unsigned int k =0 ; k < m_SiLiTMult ; ++k){ + // Same Pad, same Detector + if( m_PreTreatedData->GetMMSiLiEPadNbr(j)==m_PreTreatedData->GetMMSiLiTPadNbr(k) + && m_PreTreatedData->GetMMSiLiEDetectorNbr(j)==m_PreTreatedData->GetMMSiLiTDetectorNbr(k)){ + SiLi_T[SiLi_T.size()-1]= m_PreTreatedData->GetMMSiLiTTime(k) ; + break ; + } } - - if(!check_CSI){ - CsI_N.push_back(0) ; - CsI_E.push_back(-1000) ; - CsI_T.push_back(-1000) ; + + check_SILI = true ; + } + } + } + + for(unsigned int j = 0 ; j < m_CsIEMult ; ++j){ + if(m_PreTreatedData->GetMMCsIEDetectorNbr(j)==N){ + if(Match_Si_CsI( X, Y , m_PreTreatedData->GetMMCsIECristalNbr(j) ) ){ + CsI_N.push_back( m_PreTreatedData->GetMMCsIECristalNbr(j) ) ; + CsI_E.push_back( m_PreTreatedData->GetMMCsIEEnergy(j) ) ; + CsI_T.push_back(-1000); + // Look for associate Time + for(unsigned int k =0 ; k < m_CsITMult ; ++k){ + // Same Cristal, Same Detector + if( m_PreTreatedData->GetMMCsIECristalNbr(j)==m_PreTreatedData->GetMMCsITCristalNbr(k) + && m_PreTreatedData->GetMMCsIEDetectorNbr(j)==m_PreTreatedData->GetMMCsITDetectorNbr(k) ){ + CsI_T[CsI_T.size()-1]= m_PreTreatedData->GetMMCsITTime(j) ; + break ; + } } - + + check_CSI = true ; + } } + } + + + if(!check_SILI){ + SiLi_N.push_back(0) ; + SiLi_E.push_back(-1000) ; + SiLi_T.push_back(-1000) ; + } + + if(!check_CSI){ + CsI_N.push_back(0) ; + CsI_E.push_back(-1000) ; + CsI_T.push_back(-1000) ; + } + } - return; - + } + return; + } /////////////////////////////////////////////////////////////////////////// void TMust2Physics::PreTreat(){ - ClearPreTreatedData(); - m_StripXEMult = m_EventData->GetMMStripXEMult(); - m_StripYEMult = m_EventData->GetMMStripYEMult(); - m_StripXTMult = m_EventData->GetMMStripXTMult(); - m_StripYTMult = m_EventData->GetMMStripYTMult(); - m_SiLiEMult = m_EventData->GetMMSiLiEMult(); - m_SiLiTMult = m_EventData->GetMMSiLiTMult(); - m_CsIEMult = m_EventData->GetMMCsIEMult(); - m_CsITMult = m_EventData->GetMMCsITMult(); - - // X - // E - for(unsigned int i = 0 ; i < m_StripXEMult ; ++i){ - if( m_EventData->GetMMStripXEEnergy(i)>m_Si_X_E_RAW_Threshold && IsValidChannel("X", m_EventData->GetMMStripXEDetectorNbr(i), m_EventData->GetMMStripXEStripNbr(i)) ){ - double EX = fSi_X_E(m_EventData , i); - if( EX > m_Si_X_E_Threshold ){ - m_PreTreatedData->SetMMStripXEDetectorNbr( m_EventData->GetMMStripXEDetectorNbr(i) ); - m_PreTreatedData->SetMMStripXEStripNbr( m_EventData->GetMMStripXEStripNbr(i) ); - m_PreTreatedData->SetMMStripXEEnergy( EX ); - } - - } + ClearPreTreatedData(); + m_StripXEMult = m_EventData->GetMMStripXEMult(); + m_StripYEMult = m_EventData->GetMMStripYEMult(); + m_StripXTMult = m_EventData->GetMMStripXTMult(); + m_StripYTMult = m_EventData->GetMMStripYTMult(); + m_SiLiEMult = m_EventData->GetMMSiLiEMult(); + m_SiLiTMult = m_EventData->GetMMSiLiTMult(); + m_CsIEMult = m_EventData->GetMMCsIEMult(); + m_CsITMult = m_EventData->GetMMCsITMult(); + + // X + // E + for(unsigned int i = 0 ; i < m_StripXEMult ; ++i){ + if( m_EventData->GetMMStripXEEnergy(i)>m_Si_X_E_RAW_Threshold && IsValidChannel("X", m_EventData->GetMMStripXEDetectorNbr(i), m_EventData->GetMMStripXEStripNbr(i)) ){ + double EX = fSi_X_E(m_EventData , i); + if( EX > m_Si_X_E_Threshold ){ + m_PreTreatedData->SetMMStripXEDetectorNbr( m_EventData->GetMMStripXEDetectorNbr(i) ); + m_PreTreatedData->SetMMStripXEStripNbr( m_EventData->GetMMStripXEStripNbr(i) ); + m_PreTreatedData->SetMMStripXEEnergy( EX ); + } + } - - // T - for(unsigned int i = 0 ; i < m_StripXTMult ; ++i){ - if(IsValidChannel("X", m_EventData->GetMMStripXTDetectorNbr(i), m_EventData->GetMMStripXTStripNbr(i))){ - m_PreTreatedData->SetMMStripXTDetectorNbr( m_EventData->GetMMStripXTDetectorNbr(i) ); - m_PreTreatedData->SetMMStripXTStripNbr( m_EventData->GetMMStripXTStripNbr(i) ); - m_PreTreatedData->SetMMStripXTTime( fSi_X_T(m_EventData , i) ); - } + } + + // T + for(unsigned int i = 0 ; i < m_StripXTMult ; ++i){ + if(IsValidChannel("X", m_EventData->GetMMStripXTDetectorNbr(i), m_EventData->GetMMStripXTStripNbr(i))){ + m_PreTreatedData->SetMMStripXTDetectorNbr( m_EventData->GetMMStripXTDetectorNbr(i) ); + m_PreTreatedData->SetMMStripXTStripNbr( m_EventData->GetMMStripXTStripNbr(i) ); + m_PreTreatedData->SetMMStripXTTime( fSi_X_T(m_EventData , i) ); } - - - // Y - // E - for(unsigned int i = 0 ; i < m_StripYEMult ; ++i){ - if( m_EventData->GetMMStripYEEnergy(i)<m_Si_Y_E_RAW_Threshold && IsValidChannel("Y", m_EventData->GetMMStripYEDetectorNbr(i), m_EventData->GetMMStripYEStripNbr(i))){ - double EY = fSi_Y_E(m_EventData , i); - if( EY >m_Si_Y_E_Threshold ){ - m_PreTreatedData->SetMMStripYEDetectorNbr( m_EventData->GetMMStripYEDetectorNbr(i) ); - m_PreTreatedData->SetMMStripYEStripNbr( m_EventData->GetMMStripYEStripNbr(i) ); - m_PreTreatedData->SetMMStripYEEnergy( EY ); - } - } + } + + + // Y + // E + for(unsigned int i = 0 ; i < m_StripYEMult ; ++i){ + if( m_EventData->GetMMStripYEEnergy(i)<m_Si_Y_E_RAW_Threshold && IsValidChannel("Y", m_EventData->GetMMStripYEDetectorNbr(i), m_EventData->GetMMStripYEStripNbr(i))){ + double EY = fSi_Y_E(m_EventData , i); + if( EY >m_Si_Y_E_Threshold ){ + m_PreTreatedData->SetMMStripYEDetectorNbr( m_EventData->GetMMStripYEDetectorNbr(i) ); + m_PreTreatedData->SetMMStripYEStripNbr( m_EventData->GetMMStripYEStripNbr(i) ); + m_PreTreatedData->SetMMStripYEEnergy( EY ); + } } - - // T - for(unsigned int i = 0 ; i < m_StripYTMult ; ++i){ - if(IsValidChannel("Y", m_EventData->GetMMStripYTDetectorNbr(i), m_EventData->GetMMStripYTStripNbr(i))){ - m_PreTreatedData->SetMMStripYTDetectorNbr( m_EventData->GetMMStripYTDetectorNbr(i) ); - m_PreTreatedData->SetMMStripYTStripNbr( m_EventData->GetMMStripYTStripNbr(i) ); - m_PreTreatedData->SetMMStripYTTime( fSi_Y_T(m_EventData , i) ); - } + } + + // T + for(unsigned int i = 0 ; i < m_StripYTMult ; ++i){ + if(IsValidChannel("Y", m_EventData->GetMMStripYTDetectorNbr(i), m_EventData->GetMMStripYTStripNbr(i))){ + m_PreTreatedData->SetMMStripYTDetectorNbr( m_EventData->GetMMStripYTDetectorNbr(i) ); + m_PreTreatedData->SetMMStripYTStripNbr( m_EventData->GetMMStripYTStripNbr(i) ); + m_PreTreatedData->SetMMStripYTTime( fSi_Y_T(m_EventData , i) ); } - - - // CsI - // E - for(unsigned int i = 0 ; i < m_CsIEMult ; ++i){ - if( m_EventData->GetMMCsIEEnergy(i)>m_CsI_E_RAW_Threshold && IsValidChannel("CsI", m_EventData->GetMMCsIEDetectorNbr(i), m_EventData->GetMMCsIECristalNbr(i))){ - double ECsI = fCsI_E(m_EventData , i); - if( ECsI > m_CsI_E_Threshold ){ - m_PreTreatedData->SetMMCsIEDetectorNbr( m_EventData->GetMMCsIEDetectorNbr(i) ); - m_PreTreatedData->SetMMCsIECristalNbr( m_EventData->GetMMCsIECristalNbr(i) ); - m_PreTreatedData->SetMMCsIEEnergy( ECsI ); - } - } + } + + + // CsI + // E + for(unsigned int i = 0 ; i < m_CsIEMult ; ++i){ + if( m_EventData->GetMMCsIEEnergy(i)>m_CsI_E_RAW_Threshold && IsValidChannel("CsI", m_EventData->GetMMCsIEDetectorNbr(i), m_EventData->GetMMCsIECristalNbr(i))){ + double ECsI = fCsI_E(m_EventData , i); + if( ECsI > m_CsI_E_Threshold ){ + m_PreTreatedData->SetMMCsIEDetectorNbr( m_EventData->GetMMCsIEDetectorNbr(i) ); + m_PreTreatedData->SetMMCsIECristalNbr( m_EventData->GetMMCsIECristalNbr(i) ); + m_PreTreatedData->SetMMCsIEEnergy( ECsI ); + } } - - // T - for(unsigned int i = 0 ; i < m_CsITMult ; ++i){ - if(IsValidChannel("CsI", m_EventData->GetMMCsITDetectorNbr(i), m_EventData->GetMMCsITCristalNbr(i))){ - m_PreTreatedData->SetMMCsITDetectorNbr( m_EventData->GetMMCsITDetectorNbr(i) ); - m_PreTreatedData->SetMMCsITCristalNbr( m_EventData->GetMMCsITCristalNbr(i) ); - m_PreTreatedData->SetMMCsITTime( fCsI_T(m_EventData , i) ); - } + } + + // T + for(unsigned int i = 0 ; i < m_CsITMult ; ++i){ + if(IsValidChannel("CsI", m_EventData->GetMMCsITDetectorNbr(i), m_EventData->GetMMCsITCristalNbr(i))){ + m_PreTreatedData->SetMMCsITDetectorNbr( m_EventData->GetMMCsITDetectorNbr(i) ); + m_PreTreatedData->SetMMCsITCristalNbr( m_EventData->GetMMCsITCristalNbr(i) ); + m_PreTreatedData->SetMMCsITTime( fCsI_T(m_EventData , i) ); } - - - // SiLi - // E - for(unsigned int i = 0 ; i < m_SiLiEMult ; ++i){ - if( m_EventData->GetMMSiLiEEnergy(i)>m_SiLi_E_RAW_Threshold && IsValidChannel("SiLi", m_EventData->GetMMSiLiEDetectorNbr(i), m_EventData->GetMMSiLiEPadNbr(i))){ - double ESiLi = fSiLi_E(m_EventData , i); - if( ESiLi > m_SiLi_E_Threshold ){ - m_PreTreatedData->SetMMSiLiEDetectorNbr( m_EventData->GetMMSiLiEDetectorNbr(i) ); - m_PreTreatedData->SetMMSiLiEPadNbr( m_EventData->GetMMSiLiEPadNbr(i) ); - m_PreTreatedData->SetMMSiLiEEnergy( ESiLi ); - } - } + } + + + // SiLi + // E + for(unsigned int i = 0 ; i < m_SiLiEMult ; ++i){ + if( m_EventData->GetMMSiLiEEnergy(i)>m_SiLi_E_RAW_Threshold && IsValidChannel("SiLi", m_EventData->GetMMSiLiEDetectorNbr(i), m_EventData->GetMMSiLiEPadNbr(i))){ + double ESiLi = fSiLi_E(m_EventData , i); + if( ESiLi > m_SiLi_E_Threshold ){ + m_PreTreatedData->SetMMSiLiEDetectorNbr( m_EventData->GetMMSiLiEDetectorNbr(i) ); + m_PreTreatedData->SetMMSiLiEPadNbr( m_EventData->GetMMSiLiEPadNbr(i) ); + m_PreTreatedData->SetMMSiLiEEnergy( ESiLi ); + } } - - // T - for(unsigned int i = 0 ; i < m_SiLiTMult ; ++i){ - if(IsValidChannel("SiLi", m_EventData->GetMMSiLiTDetectorNbr(i), m_EventData->GetMMSiLiTPadNbr(i))){ - m_PreTreatedData->SetMMSiLiTDetectorNbr( m_EventData->GetMMSiLiTDetectorNbr(i) ); - m_PreTreatedData->SetMMSiLiTPadNbr( m_EventData->GetMMSiLiTPadNbr(i) ); - m_PreTreatedData->SetMMSiLiTTime( fSiLi_T(m_EventData , i) ); - } + } + + // T + for(unsigned int i = 0 ; i < m_SiLiTMult ; ++i){ + if(IsValidChannel("SiLi", m_EventData->GetMMSiLiTDetectorNbr(i), m_EventData->GetMMSiLiTPadNbr(i))){ + m_PreTreatedData->SetMMSiLiTDetectorNbr( m_EventData->GetMMSiLiTDetectorNbr(i) ); + m_PreTreatedData->SetMMSiLiTPadNbr( m_EventData->GetMMSiLiTPadNbr(i) ); + m_PreTreatedData->SetMMSiLiTTime( fSiLi_T(m_EventData , i) ); } - - return; + } + + return; } /////////////////////////////////////////////////////////////////////////// int TMust2Physics :: CheckEvent(){ - // Check the size of the different elements - if( m_PreTreatedData->GetMMStripXEMult() == m_PreTreatedData->GetMMStripYEMult() ) - return 1 ; // Regular Event - - // INterstrip management is not coded, so waste of time to make this test - /* else if( m_PreTreatedData->GetMMStripXEMult() == m_PreTreatedData->GetMMStripYEMult()+1 - || m_PreTreatedData->GetMMStripXEMult() == m_PreTreatedData->GetMMStripYEMult()-1 ) - return 2 ; // Pseudo Event, potentially interstrip*/ - - else - return -1 ; // Rejected Event - + // Check the size of the different elements + if( m_PreTreatedData->GetMMStripXEMult() == m_PreTreatedData->GetMMStripYEMult() ) + return 1 ; // Regular Event + + // INterstrip management is not coded, so waste of time to make this test + /* else if( m_PreTreatedData->GetMMStripXEMult() == m_PreTreatedData->GetMMStripYEMult()+1 + || m_PreTreatedData->GetMMStripXEMult() == m_PreTreatedData->GetMMStripYEMult()-1 ) + return 2 ; // Pseudo Event, potentially interstrip*/ + + else + return -1 ; // Rejected Event + } /////////////////////////////////////////////////////////////////////////// bool TMust2Physics :: ResolvePseudoEvent(){ - return false; + return false; } /////////////////////////////////////////////////////////////////////////// vector < TVector2 > TMust2Physics :: Match_X_Y(){ - vector < TVector2 > ArrayOfGoodCouple ; - m_StripXEMult = m_PreTreatedData->GetMMStripXEMult(); - m_StripYEMult = m_PreTreatedData->GetMMStripXEMult(); - - // Prevent code from treating very high multiplicity Event - // Those event are not physical anyway and that improve speed. - if( m_StripXEMult > m_MaximumStripMultiplicityAllowed || m_StripYEMult > m_MaximumStripMultiplicityAllowed ) - return ArrayOfGoodCouple; - - for(unsigned int i = 0 ; i < m_StripXEMult ; ++i){ - for(unsigned int j = 0 ; j < m_StripYEMult ; j++){ - // if same detector check energy - if ( m_PreTreatedData->GetMMStripXEDetectorNbr(i) == m_PreTreatedData->GetMMStripYEDetectorNbr(j) ){ - // Look if energy match - if( abs( (m_PreTreatedData->GetMMStripXEEnergy(i)-m_PreTreatedData->GetMMStripYEEnergy(j))/2. ) < m_StripEnergyMatchingNumberOfSigma*m_StripEnergyMatchingSigma ){ - // Special Option, if the event is between two CsI cristal, it is rejected. - if(m_Ignore_not_matching_CsI){ - bool check_validity=false; - for (unsigned int hh = 0 ; hh<16 ; ++hh ){ - if( Match_Si_CsI(m_PreTreatedData->GetMMStripXEStripNbr(i), m_PreTreatedData->GetMMStripYEStripNbr(j) , hh+1) ){ - check_validity=true; - } - } - - if(check_validity){ - ArrayOfGoodCouple . push_back ( TVector2(i,j) ) ; - } - } - - // Special Option, if the event is between two SiLi pad , it is rejected. - if(m_Ignore_not_matching_SiLi){ - bool check_validity=false; - for (unsigned int hh = 0 ; hh<16 ; ++hh ){ - if( Match_Si_SiLi(m_PreTreatedData->GetMMStripXEStripNbr(i), m_PreTreatedData->GetMMStripYEStripNbr(j) , hh+1) ) - check_validity=true; - } - - if(check_validity) - ArrayOfGoodCouple . push_back ( TVector2(i,j) ) ; - } - - // Regular case, keep the event - else ArrayOfGoodCouple . push_back ( TVector2(i,j) ) ; - } + vector < TVector2 > ArrayOfGoodCouple ; + m_StripXEMult = m_PreTreatedData->GetMMStripXEMult(); + m_StripYEMult = m_PreTreatedData->GetMMStripXEMult(); + + // Prevent code from treating very high multiplicity Event + // Those event are not physical anyway and that improve speed. + if( m_StripXEMult > m_MaximumStripMultiplicityAllowed || m_StripYEMult > m_MaximumStripMultiplicityAllowed ) + return ArrayOfGoodCouple; + + for(unsigned int i = 0 ; i < m_StripXEMult ; ++i){ + for(unsigned int j = 0 ; j < m_StripYEMult ; j++){ + // if same detector check energy + if ( m_PreTreatedData->GetMMStripXEDetectorNbr(i) == m_PreTreatedData->GetMMStripYEDetectorNbr(j) ){ + // Look if energy match + if( abs( (m_PreTreatedData->GetMMStripXEEnergy(i)-m_PreTreatedData->GetMMStripYEEnergy(j))/2. ) < m_StripEnergyMatchingNumberOfSigma*m_StripEnergyMatchingSigma ){ + // Special Option, if the event is between two CsI cristal, it is rejected. + if(m_Ignore_not_matching_CsI){ + bool check_validity=false; + for (unsigned int hh = 0 ; hh<16 ; ++hh ){ + if( Match_Si_CsI(m_PreTreatedData->GetMMStripXEStripNbr(i), m_PreTreatedData->GetMMStripYEStripNbr(j) , hh+1) ){ + check_validity=true; + } + } + + if(check_validity){ + ArrayOfGoodCouple . push_back ( TVector2(i,j) ) ; + } + } + + // Special Option, if the event is between two SiLi pad , it is rejected. + if(m_Ignore_not_matching_SiLi){ + bool check_validity=false; + for (unsigned int hh = 0 ; hh<16 ; ++hh ){ + if( Match_Si_SiLi(m_PreTreatedData->GetMMStripXEStripNbr(i), m_PreTreatedData->GetMMStripYEStripNbr(j) , hh+1) ) + check_validity=true; } + + if(check_validity) + ArrayOfGoodCouple . push_back ( TVector2(i,j) ) ; + } + + // Regular case, keep the event + else ArrayOfGoodCouple . push_back ( TVector2(i,j) ) ; } + } } - - // Prevent to treat event with ambiguous matchin beetween X and Y - if( ArrayOfGoodCouple.size() > m_StripXEMult ) ArrayOfGoodCouple.clear() ; - - return ArrayOfGoodCouple; + } + + // Prevent to treat event with ambiguous matchin beetween X and Y + if( ArrayOfGoodCouple.size() > m_StripXEMult ) ArrayOfGoodCouple.clear() ; + + return ArrayOfGoodCouple; } //////////////////////////////////////////////////////////////////////////// bool TMust2Physics :: IsValidChannel(const string DetectorType, const int telescope , const int channel){ - if(DetectorType == "CsI") - return *(m_CsIChannelStatus[telescope-1].begin()+channel-1); - - else if(DetectorType == "SiLi") - return *(m_SiLiChannelStatus[telescope-1].begin()+channel-1); - - else if(DetectorType == "X") - return *(m_XChannelStatus[telescope-1].begin()+channel-1); - - else if(DetectorType == "Y") - return *(m_YChannelStatus[telescope-1].begin()+channel-1); - - else return false; + if(DetectorType == "CsI") + return *(m_CsIChannelStatus[telescope-1].begin()+channel-1); + + else if(DetectorType == "SiLi") + return *(m_SiLiChannelStatus[telescope-1].begin()+channel-1); + + else if(DetectorType == "X") + return *(m_XChannelStatus[telescope-1].begin()+channel-1); + + else if(DetectorType == "Y") + return *(m_YChannelStatus[telescope-1].begin()+channel-1); + + else return false; } /////////////////////////////////////////////////////////////////////////// void TMust2Physics::ReadAnalysisConfig(){ - bool ReadingStatus = false; - - // path to file - string FileName = "./configs/ConfigMust2.dat"; - - // open analysis config file - ifstream AnalysisConfigFile; - AnalysisConfigFile.open(FileName.c_str()); - - if (!AnalysisConfigFile.is_open()) { - cout << " No ConfigMust2.dat found: Default parameters loaded for Analysis " << FileName << endl; - return; - } - cout << " Loading user parameters for Analysis from ConfigMust2.dat " << endl; - - // Save it in a TAsciiFile - TAsciiFile* asciiConfig = RootOutput::getInstance()->GetAsciiFileAnalysisConfig(); - asciiConfig->AppendLine("%%% ConfigMust2.dat %%%"); - asciiConfig->Append(FileName.c_str()); - asciiConfig->AppendLine(""); - // read analysis config file - string LineBuffer,DataBuffer,whatToDo; - while (!AnalysisConfigFile.eof()) { - // Pick-up next line - getline(AnalysisConfigFile, LineBuffer); - - // search for "header" - if (LineBuffer.compare(0, 11, "ConfigMust2") == 0) ReadingStatus = true; - - // loop on tokens and data - while (ReadingStatus ) { - - whatToDo=""; - AnalysisConfigFile >> whatToDo; - - // Search for comment symbol (%) - if (whatToDo.compare(0, 1, "%") == 0) { - AnalysisConfigFile.ignore(numeric_limits<streamsize>::max(), '\n' ); - } - - else if (whatToDo=="MAX_STRIP_MULTIPLICITY") { - AnalysisConfigFile >> DataBuffer; - m_MaximumStripMultiplicityAllowed = atoi(DataBuffer.c_str() ); - cout << "MAXIMUN STRIP MULTIPLICITY " << m_MaximumStripMultiplicityAllowed << endl; - } - - else if (whatToDo=="STRIP_ENERGY_MATCHING_SIGMA") { - AnalysisConfigFile >> DataBuffer; - m_StripEnergyMatchingSigma = atof(DataBuffer.c_str() ); - cout << "STRIP ENERGY MATCHING SIGMA " << m_StripEnergyMatchingSigma <<endl; - } - - else if (whatToDo=="STRIP_ENERGY_MATCHING_NUMBER_OF_SIGMA") { - AnalysisConfigFile >> DataBuffer; - m_StripEnergyMatchingNumberOfSigma = atoi(DataBuffer.c_str() ); - cout << "STRIP ENERGY MATCHING NUMBER OF SIGMA " << m_StripEnergyMatchingNumberOfSigma << endl; - } - - else if (whatToDo== "DISABLE_ALL") { - AnalysisConfigFile >> DataBuffer; - cout << whatToDo << " " << DataBuffer << endl; - int telescope = atoi(DataBuffer.substr(2,1).c_str()); - vector< bool > ChannelStatus; - ChannelStatus.resize(128,false); - m_XChannelStatus[telescope-1] = ChannelStatus; - m_YChannelStatus[telescope-1] = ChannelStatus; - ChannelStatus.resize(16,false); - m_SiLiChannelStatus[telescope-1] = ChannelStatus; - m_CsIChannelStatus[telescope-1] = ChannelStatus; - } - - else if (whatToDo == "DISABLE_CHANNEL") { - AnalysisConfigFile >> DataBuffer; - cout << whatToDo << " " << DataBuffer << endl; - int telescope = atoi(DataBuffer.substr(2,1).c_str()); - int channel = -1; - if (DataBuffer.compare(3,4,"STRX") == 0) { - channel = atoi(DataBuffer.substr(7).c_str()); - *(m_XChannelStatus[telescope-1].begin()+channel-1) = false; - } - - else if (DataBuffer.compare(3,4,"STRY") == 0) { - channel = atoi(DataBuffer.substr(7).c_str()); - *(m_YChannelStatus[telescope-1].begin()+channel-1) = false; - } - - else if (DataBuffer.compare(3,4,"SILI") == 0) { - channel = atoi(DataBuffer.substr(7).c_str()); - *(m_SiLiChannelStatus[telescope-1].begin()+channel-1) = false; - } - - else if (DataBuffer.compare(3,3,"CSI") == 0) { - channel = atoi(DataBuffer.substr(6).c_str()); - *(m_CsIChannelStatus[telescope-1].begin()+channel-1) = false; - } - - else cout << "Warning: detector type for Must2 unknown!" << endl; - - } - - else if (whatToDo=="TAKE_E_Y") { - m_Take_E_Y = true; - cout << whatToDo << endl; - } - - else if (whatToDo=="TAKE_T_Y") { - m_Take_T_Y = true; - cout << whatToDo << endl; - } - - else if (whatToDo=="TAKE_E_X") { - m_Take_E_Y = false; - cout << whatToDo << endl; - } - - else if (whatToDo=="TAKE_T_X") { - m_Take_T_Y = false; - cout << whatToDo << endl; - } - - else if (whatToDo== "IGNORE_NOT_MATCHING_CSI") { - m_Ignore_not_matching_CsI = true; - cout << whatToDo << endl; - } - - else if (whatToDo=="CSI_SIZE") { - AnalysisConfigFile >> DataBuffer; - m_CsI_Size = atoi(DataBuffer.c_str()); - cout << whatToDo << " " << m_CsI_Size << endl; - } - - else if (whatToDo=="IGNORE_NOT_MATCHING_SILI") { - m_Ignore_not_matching_SiLi = true; - cout << whatToDo << endl; - } - - else if (whatToDo=="SILI_SIZE") { - AnalysisConfigFile >> DataBuffer; - m_SiLi_Size = atoi(DataBuffer.c_str()); - cout << whatToDo << " " << m_SiLi_Size << endl; - } - - else if (whatToDo=="SI_X_E_RAW_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_Si_X_E_RAW_Threshold = atof(DataBuffer.c_str()); - cout << whatToDo << " " << m_Si_X_E_RAW_Threshold << endl; - } - - else if (whatToDo=="SI_Y_E_RAW_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_Si_Y_E_RAW_Threshold = atof(DataBuffer.c_str()); - cout << whatToDo << " " << m_Si_Y_E_RAW_Threshold << endl; - } - - else if (whatToDo=="SILI_E_RAW_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_SiLi_E_RAW_Threshold = atof(DataBuffer.c_str()); - cout << whatToDo << " " << m_SiLi_E_RAW_Threshold << endl; - } - - else if (whatToDo== "CSI_E_RAW_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_CsI_E_RAW_Threshold = atof(DataBuffer.c_str()); - cout << whatToDo << " " << m_CsI_E_Threshold << endl; - } - - else if (whatToDo=="SI_X_E_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_Si_X_E_Threshold = atof(DataBuffer.c_str()); - cout << whatToDo << " " << m_Si_X_E_Threshold << endl; - } - - else if (whatToDo== "SI_Y_E_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_Si_Y_E_Threshold = atof(DataBuffer.c_str()); - cout << whatToDo << " " << m_Si_Y_E_Threshold << endl; - } - - else if (whatToDo=="SILI_E_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_SiLi_E_Threshold = atof(DataBuffer.c_str()); - cout << whatToDo << " " << m_SiLi_E_Threshold << endl; - } - - else if (whatToDo=="CSI_E_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_CsI_E_Threshold = atof(DataBuffer.c_str()); - cout << whatToDo << " " << m_CsI_E_Threshold << endl; - } - - else { - ReadingStatus = false; - } - + bool ReadingStatus = false; + + // path to file + string FileName = "./configs/ConfigMust2.dat"; + + // open analysis config file + ifstream AnalysisConfigFile; + AnalysisConfigFile.open(FileName.c_str()); + + if (!AnalysisConfigFile.is_open()) { + cout << " No ConfigMust2.dat found: Default parameters loaded for Analysis " << FileName << endl; + return; + } + cout << " Loading user parameters for Analysis from ConfigMust2.dat " << endl; + + // Save it in a TAsciiFile + TAsciiFile* asciiConfig = RootOutput::getInstance()->GetAsciiFileAnalysisConfig(); + asciiConfig->AppendLine("%%% ConfigMust2.dat %%%"); + asciiConfig->Append(FileName.c_str()); + asciiConfig->AppendLine(""); + // read analysis config file + string LineBuffer,DataBuffer,whatToDo; + while (!AnalysisConfigFile.eof()) { + // Pick-up next line + getline(AnalysisConfigFile, LineBuffer); + + // search for "header" + if (LineBuffer.compare(0, 11, "ConfigMust2") == 0) ReadingStatus = true; + + // loop on tokens and data + while (ReadingStatus ) { + + whatToDo=""; + AnalysisConfigFile >> whatToDo; + + // Search for comment symbol (%) + if (whatToDo.compare(0, 1, "%") == 0) { + AnalysisConfigFile.ignore(numeric_limits<streamsize>::max(), '\n' ); + } + + else if (whatToDo=="MAX_STRIP_MULTIPLICITY") { + AnalysisConfigFile >> DataBuffer; + m_MaximumStripMultiplicityAllowed = atoi(DataBuffer.c_str() ); + cout << "MAXIMUN STRIP MULTIPLICITY " << m_MaximumStripMultiplicityAllowed << endl; + } + + else if (whatToDo=="STRIP_ENERGY_MATCHING_SIGMA") { + AnalysisConfigFile >> DataBuffer; + m_StripEnergyMatchingSigma = atof(DataBuffer.c_str() ); + cout << "STRIP ENERGY MATCHING SIGMA " << m_StripEnergyMatchingSigma <<endl; + } + + else if (whatToDo=="STRIP_ENERGY_MATCHING_NUMBER_OF_SIGMA") { + AnalysisConfigFile >> DataBuffer; + m_StripEnergyMatchingNumberOfSigma = atoi(DataBuffer.c_str() ); + cout << "STRIP ENERGY MATCHING NUMBER OF SIGMA " << m_StripEnergyMatchingNumberOfSigma << endl; + } + + else if (whatToDo== "DISABLE_ALL") { + AnalysisConfigFile >> DataBuffer; + cout << whatToDo << " " << DataBuffer << endl; + int telescope = atoi(DataBuffer.substr(2,1).c_str()); + vector< bool > ChannelStatus; + ChannelStatus.resize(128,false); + m_XChannelStatus[telescope-1] = ChannelStatus; + m_YChannelStatus[telescope-1] = ChannelStatus; + ChannelStatus.resize(16,false); + m_SiLiChannelStatus[telescope-1] = ChannelStatus; + m_CsIChannelStatus[telescope-1] = ChannelStatus; + } + + else if (whatToDo == "DISABLE_CHANNEL") { + AnalysisConfigFile >> DataBuffer; + cout << whatToDo << " " << DataBuffer << endl; + int telescope = atoi(DataBuffer.substr(2,1).c_str()); + int channel = -1; + if (DataBuffer.compare(3,4,"STRX") == 0) { + channel = atoi(DataBuffer.substr(7).c_str()); + *(m_XChannelStatus[telescope-1].begin()+channel-1) = false; + } + + else if (DataBuffer.compare(3,4,"STRY") == 0) { + channel = atoi(DataBuffer.substr(7).c_str()); + *(m_YChannelStatus[telescope-1].begin()+channel-1) = false; + } + + else if (DataBuffer.compare(3,4,"SILI") == 0) { + channel = atoi(DataBuffer.substr(7).c_str()); + *(m_SiLiChannelStatus[telescope-1].begin()+channel-1) = false; + } + + else if (DataBuffer.compare(3,3,"CSI") == 0) { + channel = atoi(DataBuffer.substr(6).c_str()); + *(m_CsIChannelStatus[telescope-1].begin()+channel-1) = false; } + + else cout << "Warning: detector type for Must2 unknown!" << endl; + + } + + else if (whatToDo=="TAKE_E_Y") { + m_Take_E_Y = true; + cout << whatToDo << endl; + } + + else if (whatToDo=="TAKE_T_Y") { + m_Take_T_Y = true; + cout << whatToDo << endl; + } + + else if (whatToDo=="TAKE_E_X") { + m_Take_E_Y = false; + cout << whatToDo << endl; + } + + else if (whatToDo=="TAKE_T_X") { + m_Take_T_Y = false; + cout << whatToDo << endl; + } + + else if (whatToDo== "IGNORE_NOT_MATCHING_CSI") { + m_Ignore_not_matching_CsI = true; + cout << whatToDo << endl; + } + + else if (whatToDo=="CSI_SIZE") { + AnalysisConfigFile >> DataBuffer; + m_CsI_Size = atoi(DataBuffer.c_str()); + cout << whatToDo << " " << m_CsI_Size << endl; + } + + else if (whatToDo=="IGNORE_NOT_MATCHING_SILI") { + m_Ignore_not_matching_SiLi = true; + cout << whatToDo << endl; + } + + else if (whatToDo=="SILI_SIZE") { + AnalysisConfigFile >> DataBuffer; + m_SiLi_Size = atoi(DataBuffer.c_str()); + cout << whatToDo << " " << m_SiLi_Size << endl; + } + + else if (whatToDo=="SI_X_E_RAW_THRESHOLD") { + AnalysisConfigFile >> DataBuffer; + m_Si_X_E_RAW_Threshold = atof(DataBuffer.c_str()); + cout << whatToDo << " " << m_Si_X_E_RAW_Threshold << endl; + } + + else if (whatToDo=="SI_Y_E_RAW_THRESHOLD") { + AnalysisConfigFile >> DataBuffer; + m_Si_Y_E_RAW_Threshold = atof(DataBuffer.c_str()); + cout << whatToDo << " " << m_Si_Y_E_RAW_Threshold << endl; + } + + else if (whatToDo=="SILI_E_RAW_THRESHOLD") { + AnalysisConfigFile >> DataBuffer; + m_SiLi_E_RAW_Threshold = atof(DataBuffer.c_str()); + cout << whatToDo << " " << m_SiLi_E_RAW_Threshold << endl; + } + + else if (whatToDo== "CSI_E_RAW_THRESHOLD") { + AnalysisConfigFile >> DataBuffer; + m_CsI_E_RAW_Threshold = atof(DataBuffer.c_str()); + cout << whatToDo << " " << m_CsI_E_Threshold << endl; + } + + else if (whatToDo=="SI_X_E_THRESHOLD") { + AnalysisConfigFile >> DataBuffer; + m_Si_X_E_Threshold = atof(DataBuffer.c_str()); + cout << whatToDo << " " << m_Si_X_E_Threshold << endl; + } + + else if (whatToDo== "SI_Y_E_THRESHOLD") { + AnalysisConfigFile >> DataBuffer; + m_Si_Y_E_Threshold = atof(DataBuffer.c_str()); + cout << whatToDo << " " << m_Si_Y_E_Threshold << endl; + } + + else if (whatToDo=="SILI_E_THRESHOLD") { + AnalysisConfigFile >> DataBuffer; + m_SiLi_E_Threshold = atof(DataBuffer.c_str()); + cout << whatToDo << " " << m_SiLi_E_Threshold << endl; + } + + else if (whatToDo=="CSI_E_THRESHOLD") { + AnalysisConfigFile >> DataBuffer; + m_CsI_E_Threshold = atof(DataBuffer.c_str()); + cout << whatToDo << " " << m_CsI_E_Threshold << endl; + } + + else { + ReadingStatus = false; + } + } + } } /////////////////////////////////////////////////////////////////////////// bool TMust2Physics :: Match_Si_SiLi(int X, int Y , int PadNbr){ - - //remove the central part and surrounding - if( X < 8 || X > 120|| (Y < 68 && Y > 60) ) - return false; - - if( abs(m_SiLi_MatchingX[PadNbr-1] - X) < m_SiLi_Size/2.&& - abs(m_SiLi_MatchingY[PadNbr-1] - Y) < m_SiLi_Size/2.) - return true ; - - else return false; - + + //remove the central part and surrounding + if( X < 8 || X > 120|| (Y < 68 && Y > 60) ) + return false; + + if( abs(m_SiLi_MatchingX[PadNbr-1] - X) < m_SiLi_Size/2.&& + abs(m_SiLi_MatchingY[PadNbr-1] - Y) < m_SiLi_Size/2.) + return true ; + + else return false; + } /////////////////////////////////////////////////////////////////////////// bool TMust2Physics :: Match_Si_CsI(int X, int Y , int CristalNbr){ - - if( abs(m_CsI_MatchingX[CristalNbr-1] - X) < (double)m_CsI_Size/2.&& - abs(m_CsI_MatchingY[CristalNbr-1] - Y) < (double)m_CsI_Size/2.) - return true ; - - else - return false; + + if( abs(m_CsI_MatchingX[CristalNbr-1] - X) < (double)m_CsI_Size/2.&& + abs(m_CsI_MatchingY[CristalNbr-1] - Y) < (double)m_CsI_Size/2.) + return true ; + + else + return false; } /////////////////////////////////////////////////////////////////////////// void TMust2Physics::Clear(){ - EventMultiplicity= 0 ; - - TelescopeNumber.clear(); - EventType.clear(); - TotalEnergy.clear(); - - // Si X - Si_E.clear(); - Si_T.clear(); - Si_X.clear(); - Si_Y.clear(); - - // Si(Li) - SiLi_E.clear(); - SiLi_T.clear(); - SiLi_N.clear(); - - // CsI - CsI_E.clear(); - CsI_T.clear(); - CsI_N.clear(); - - Si_EX.clear(); - Si_TX.clear(); - Si_EY.clear(); - Si_TY.clear(); - TelescopeNumber_X.clear(); - TelescopeNumber_Y.clear(); + EventMultiplicity= 0 ; + + TelescopeNumber.clear(); + EventType.clear(); + TotalEnergy.clear(); + + // Si X + Si_E.clear(); + Si_T.clear(); + Si_X.clear(); + Si_Y.clear(); + + // Si(Li) + SiLi_E.clear(); + SiLi_T.clear(); + SiLi_N.clear(); + + // CsI + CsI_E.clear(); + CsI_T.clear(); + CsI_N.clear(); + + Si_EX.clear(); + Si_TX.clear(); + Si_EY.clear(); + Si_TY.clear(); + TelescopeNumber_X.clear(); + TelescopeNumber_Y.clear(); } /////////////////////////////////////////////////////////////////////////// void TMust2Physics::ReadCalibrationRun(){ - m_StripXEMult = m_EventData->GetMMStripXEMult(); - m_StripYEMult = m_EventData->GetMMStripYEMult(); - m_StripXTMult = m_EventData->GetMMStripXTMult(); - m_StripYTMult = m_EventData->GetMMStripYTMult(); - m_SiLiEMult = m_EventData->GetMMSiLiEMult(); - m_SiLiTMult = m_EventData->GetMMSiLiTMult(); - m_CsIEMult = m_EventData->GetMMCsIEMult(); - m_CsITMult = m_EventData->GetMMCsITMult(); - - // X - // E - for(unsigned int i = 0 ; i < m_StripXEMult;++i){ - TelescopeNumber_X.push_back(m_EventData->GetMMStripXEDetectorNbr(i)); - Si_EX.push_back( fSi_X_E( m_EventData , i) ); - Si_X.push_back(m_EventData->GetMMStripXEStripNbr(i)); - } - // T - for(unsigned int i = 0 ; i < m_StripXTMult;++i){ - TelescopeNumber_X.push_back(m_EventData->GetMMStripXTDetectorNbr(i)); - Si_TX.push_back( fSi_X_T( m_EventData , i) ); - Si_X.push_back(m_EventData->GetMMStripXTStripNbr(i)); - } - - // Y - // E - for(unsigned int i = 0 ; i < m_StripYEMult;++i){ - TelescopeNumber_Y.push_back(m_EventData->GetMMStripYEDetectorNbr(i)); - Si_EY.push_back( fSi_Y_E( m_EventData , i) ); - Si_Y.push_back(m_EventData->GetMMStripYEStripNbr(i)); - } - - // T - for(unsigned int i = 0 ; i < m_StripYTMult;++i){ - TelescopeNumber_Y.push_back(m_EventData->GetMMStripYTDetectorNbr(i)); - Si_TY.push_back( fSi_Y_T( m_EventData , i) ); - Si_Y.push_back(m_EventData->GetMMStripYTStripNbr(i)); - } - - //CsI Energy - for(unsigned int j = 0 ; j < m_CsIEMult ; ++j){ - CsI_N.push_back(m_EventData->GetMMCsIECristalNbr(j)) ; - CsI_E.push_back(fCsI_E(m_EventData , j)) ; - } - - //CsI Time - for(unsigned int j = 0 ; j < m_CsITMult ; ++j){ - CsI_T.push_back(fCsI_T(m_EventData , j)) ; - } - + m_StripXEMult = m_EventData->GetMMStripXEMult(); + m_StripYEMult = m_EventData->GetMMStripYEMult(); + m_StripXTMult = m_EventData->GetMMStripXTMult(); + m_StripYTMult = m_EventData->GetMMStripYTMult(); + m_SiLiEMult = m_EventData->GetMMSiLiEMult(); + m_SiLiTMult = m_EventData->GetMMSiLiTMult(); + m_CsIEMult = m_EventData->GetMMCsIEMult(); + m_CsITMult = m_EventData->GetMMCsITMult(); + + // X + // E + for(unsigned int i = 0 ; i < m_StripXEMult;++i){ + TelescopeNumber_X.push_back(m_EventData->GetMMStripXEDetectorNbr(i)); + Si_EX.push_back( fSi_X_E( m_EventData , i) ); + Si_X.push_back(m_EventData->GetMMStripXEStripNbr(i)); + } + // T + for(unsigned int i = 0 ; i < m_StripXTMult;++i){ + TelescopeNumber_X.push_back(m_EventData->GetMMStripXTDetectorNbr(i)); + Si_TX.push_back( fSi_X_T( m_EventData , i) ); + Si_X.push_back(m_EventData->GetMMStripXTStripNbr(i)); + } + + // Y + // E + for(unsigned int i = 0 ; i < m_StripYEMult;++i){ + TelescopeNumber_Y.push_back(m_EventData->GetMMStripYEDetectorNbr(i)); + Si_EY.push_back( fSi_Y_E( m_EventData , i) ); + Si_Y.push_back(m_EventData->GetMMStripYEStripNbr(i)); + } + + // T + for(unsigned int i = 0 ; i < m_StripYTMult;++i){ + TelescopeNumber_Y.push_back(m_EventData->GetMMStripYTDetectorNbr(i)); + Si_TY.push_back( fSi_Y_T( m_EventData , i) ); + Si_Y.push_back(m_EventData->GetMMStripYTStripNbr(i)); + } + + //CsI Energy + for(unsigned int j = 0 ; j < m_CsIEMult ; ++j){ + CsI_N.push_back(m_EventData->GetMMCsIECristalNbr(j)) ; + CsI_E.push_back(fCsI_E(m_EventData , j)) ; + } + + //CsI Time + for(unsigned int j = 0 ; j < m_CsITMult ; ++j){ + CsI_T.push_back(fCsI_T(m_EventData , j)) ; + } + } //// Innherited from VDetector Class //// /////////////////////////////////////////////////////////////////////////// -void TMust2Physics::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz; - TVector3 A , B , C , D; - double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0; - - bool check_A = false ; - bool check_C = false ; - bool check_B = false ; - bool check_D = false ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool check_beta = false ; - - bool ReadingStatus = false ; - - - while (!ConfigFile.eof()){ - - getline(ConfigFile, LineBuffer); - - // If line is a Start Up Must2 bloc, Reading toggle to true - if (LineBuffer.compare(0, 11, "M2Telescope")==0){ - cout << "///" << endl ; - cout << "Telescope found: " << endl ; - ReadingStatus = true ; - - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - - ConfigFile >> DataBuffer ; - // Comment Line - if(DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer=="M2Telescope") { - cout << "WARNING: Another Telescope is find before standard sequence of Token, Error may occured in Telecope definition" << endl ; - ReadingStatus = false ; - } - - // Position method - - else if (DataBuffer=="X1_Y1=") { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - - A = TVector3(Ax, Ay, Az); - cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; - } - - - else if (DataBuffer=="X128_Y1=") { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - - B = TVector3(Bx, By, Bz); - cout << "X128 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; - } - - - else if (DataBuffer=="X1_Y128=") { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - - C = TVector3(Cx, Cy, Cz); - cout << "X1 Y128 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; - } - - else if (DataBuffer=="X128_Y128=") { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - - D = TVector3(Dx, Dy, Dz); - cout << "X128 Y128 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; - } - - // End Position Method - - // Angle method - else if (DataBuffer=="THETA=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - cout << "Theta: " << Theta << endl; - } - - //Angle method - else if (DataBuffer=="PHI=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - cout << "Phi: " << Phi << endl; - } - - //Angle method - else if (DataBuffer=="R=") { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - cout << "R: " << R << endl; - } - - //Angle method - else if (DataBuffer=="BETA=") { - check_beta = true; - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - cout << "Beta: " << beta_u << " " << beta_v << " " << beta_w << endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ( (check_A && check_B && check_C && check_D) - || (check_Theta && check_Phi && check_R && check_beta) ){ - ReadingStatus = false; - - ///Add The previously define telescope - //With position method - if ( check_A && check_B && check_C && check_D ){ - AddTelescope(A,B,C,D) ; - } - - //with angle method - else if ( check_Theta && check_Phi && check_R && check_beta ){ - AddTelescope( Theta, - Phi, - R, - beta_u, - beta_v, - beta_w); - } - - check_A = false ; - check_B = false ; - check_C = false ; - check_D = false ; - - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_beta = false ; - } - } +void TMust2Physics::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("M2Telescope"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " Telescope found " << endl; + + // Cartesian Case + vector<string> cart = {"X1_Y1","X1_Y128","X128_Y1","X128_Y128","SI","SILI","CSI"}; + // Spherical Case + vector<string> sphe= {"R","THETA","PHI","BETA","SI","SILI","CSI"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Must2 Telescope " << i+1 << endl; + TVector3 A = blocks[i]->GetTVector3("X1_Y1","mm"); + TVector3 B = blocks[i]->GetTVector3("X128_Y1","mm"); + TVector3 C = blocks[i]->GetTVector3("X1_Y128","mm"); + TVector3 D = blocks[i]->GetTVector3("X128_Y128","mm"); + AddTelescope(A,B,C,D) ; + } + + else if(blocks[i]->HasTokenList(sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Must2 Telescope " << i+1 << endl; + + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi= blocks[i]->GetDouble("PHI","deg"); + double R = blocks[i]->GetDouble("R","mm"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + AddTelescope( Theta,Phi,R,beta[0],beta[1],beta[2]); } - - InitializeStandardParameter(); - ReadAnalysisConfig(); - - cout << endl << "/////////////////////////////" << endl << endl; - + + else{ + cout << "ERROR: Missing token for M2Telescope blocks, check your input file" << endl; + exit(1); + } + + } + + InitializeStandardParameter(); + ReadAnalysisConfig(); } /////////////////////////////////////////////////////////////////////////// void TMust2Physics::InitSpectra(){ - m_Spectra = new TMust2Spectra(m_NumberOfTelescope); + m_Spectra = new TMust2Spectra(m_NumberOfTelescope); } /////////////////////////////////////////////////////////////////////////// void TMust2Physics::FillSpectra(){ - m_Spectra -> FillRawSpectra(m_EventData); - m_Spectra -> FillPreTreatedSpectra(m_PreTreatedData); - m_Spectra -> FillPhysicsSpectra(m_EventPhysics); + m_Spectra -> FillRawSpectra(m_EventData); + m_Spectra -> FillPreTreatedSpectra(m_PreTreatedData); + m_Spectra -> FillPhysicsSpectra(m_EventPhysics); } /////////////////////////////////////////////////////////////////////////// void TMust2Physics::CheckSpectra(){ - m_Spectra->CheckSpectra(); + m_Spectra->CheckSpectra(); } /////////////////////////////////////////////////////////////////////////// void TMust2Physics::ClearSpectra(){ - // To be done + // To be done } /////////////////////////////////////////////////////////////////////////// void TMust2Physics::WriteSpectra() { - if(m_Spectra) - m_Spectra->WriteSpectra(); + if(m_Spectra) + m_Spectra->WriteSpectra(); } /////////////////////////////////////////////////////////////////////////// map< string , TH1*> TMust2Physics::GetSpectra() { - if(m_Spectra) - return m_Spectra->GetMapHisto(); - else{ - map< string , TH1*> empty; - return empty; - } + if(m_Spectra) + return m_Spectra->GetMapHisto(); + else{ + map< string , TH1*> empty; + return empty; + } } /////////////////////////////////////////////////////////////////////////// void TMust2Physics::AddParameterToCalibrationManager() { - CalibrationManager* Cal = CalibrationManager::getInstance(); - - for(int i = 0 ; i < m_NumberOfTelescope ; ++i){ - - for( int j = 0 ; j < 128 ; ++j){ - Cal->AddParameter("MUST2", "T"+NPL::itoa(i+1)+"_Si_X"+NPL::itoa(j+1)+"_E","MUST2_T"+NPL::itoa(i+1)+"_Si_X"+NPL::itoa(j+1)+"_E") ; - Cal->AddParameter("MUST2", "T"+NPL::itoa(i+1)+"_Si_Y"+NPL::itoa(j+1)+"_E","MUST2_T"+NPL::itoa(i+1)+"_Si_Y"+NPL::itoa(j+1)+"_E") ; - Cal->AddParameter("MUST2", "T"+NPL::itoa(i+1)+"_Si_X"+NPL::itoa(j+1)+"_T","MUST2_T"+NPL::itoa(i+1)+"_Si_X"+NPL::itoa(j+1)+"_T") ; - Cal->AddParameter("MUST2", "T"+NPL::itoa(i+1)+"_Si_Y"+NPL::itoa(j+1)+"_T","MUST2_T"+NPL::itoa(i+1)+"_Si_Y"+NPL::itoa(j+1)+"_T") ; - } - - for( int j = 0 ; j < 16 ; ++j){ - Cal->AddParameter("MUST2", "T"+NPL::itoa(i+1)+"_SiLi"+NPL::itoa(j+1)+"_E","MUST2_T"+NPL::itoa(i+1)+"_SiLi"+NPL::itoa(j+1)+"_E") ; - Cal->AddParameter("MUST2", "T"+NPL::itoa(i+1)+"_SiLi"+NPL::itoa(j+1)+"_T","MUST2_T"+NPL::itoa(i+1)+"_SiLi"+NPL::itoa(j+1)+"_T") ; - } - - for( int j = 0 ; j < 16 ; ++j){ - Cal->AddParameter("MUST2", "T"+NPL::itoa(i+1)+"_CsI"+NPL::itoa(j+1)+"_E","MUST2_T"+NPL::itoa(i+1)+"_CsI"+NPL::itoa(j+1)+"_E") ; - Cal->AddParameter("MUST2", "T"+NPL::itoa(i+1)+"_CsI"+NPL::itoa(j+1)+"_T","MUST2_T"+NPL::itoa(i+1)+"_CsI"+NPL::itoa(j+1)+"_T") ; - } + CalibrationManager* Cal = CalibrationManager::getInstance(); + + for(int i = 0 ; i < m_NumberOfTelescope ; ++i){ + + for( int j = 0 ; j < 128 ; ++j){ + Cal->AddParameter("MUST2", "T"+NPL::itoa(i+1)+"_Si_X"+NPL::itoa(j+1)+"_E","MUST2_T"+NPL::itoa(i+1)+"_Si_X"+NPL::itoa(j+1)+"_E") ; + Cal->AddParameter("MUST2", "T"+NPL::itoa(i+1)+"_Si_Y"+NPL::itoa(j+1)+"_E","MUST2_T"+NPL::itoa(i+1)+"_Si_Y"+NPL::itoa(j+1)+"_E") ; + Cal->AddParameter("MUST2", "T"+NPL::itoa(i+1)+"_Si_X"+NPL::itoa(j+1)+"_T","MUST2_T"+NPL::itoa(i+1)+"_Si_X"+NPL::itoa(j+1)+"_T") ; + Cal->AddParameter("MUST2", "T"+NPL::itoa(i+1)+"_Si_Y"+NPL::itoa(j+1)+"_T","MUST2_T"+NPL::itoa(i+1)+"_Si_Y"+NPL::itoa(j+1)+"_T") ; } - - return; - + + for( int j = 0 ; j < 16 ; ++j){ + Cal->AddParameter("MUST2", "T"+NPL::itoa(i+1)+"_SiLi"+NPL::itoa(j+1)+"_E","MUST2_T"+NPL::itoa(i+1)+"_SiLi"+NPL::itoa(j+1)+"_E") ; + Cal->AddParameter("MUST2", "T"+NPL::itoa(i+1)+"_SiLi"+NPL::itoa(j+1)+"_T","MUST2_T"+NPL::itoa(i+1)+"_SiLi"+NPL::itoa(j+1)+"_T") ; + } + + for( int j = 0 ; j < 16 ; ++j){ + Cal->AddParameter("MUST2", "T"+NPL::itoa(i+1)+"_CsI"+NPL::itoa(j+1)+"_E","MUST2_T"+NPL::itoa(i+1)+"_CsI"+NPL::itoa(j+1)+"_E") ; + Cal->AddParameter("MUST2", "T"+NPL::itoa(i+1)+"_CsI"+NPL::itoa(j+1)+"_T","MUST2_T"+NPL::itoa(i+1)+"_CsI"+NPL::itoa(j+1)+"_T") ; + } + } + + return; + } /////////////////////////////////////////////////////////////////////////// void TMust2Physics::InitializeRootInputRaw(){ - TChain* inputChain = RootInput::getInstance()->GetChain() ; - inputChain->SetBranchStatus( "MUST2" , true ) ; - inputChain->SetBranchStatus( "fMM_*" , true ) ; - inputChain->SetBranchAddress( "MUST2" , &m_EventData ) ; + TChain* inputChain = RootInput::getInstance()->GetChain() ; + inputChain->SetBranchStatus( "MUST2" , true ) ; + inputChain->SetBranchStatus( "fMM_*" , true ) ; + inputChain->SetBranchAddress( "MUST2" , &m_EventData ) ; } /////////////////////////////////////////////////////////////////////////// void TMust2Physics::InitializeRootInputPhysics(){ - TChain* inputChain = RootInput::getInstance()->GetChain(); - inputChain->SetBranchStatus( "MUST2" , true ); - inputChain->SetBranchStatus( "EventMultiplicity" , true ); - inputChain->SetBranchStatus( "EventType" , true ); - inputChain->SetBranchStatus( "TelescopeNumber" , true ); - inputChain->SetBranchStatus( "Si_E" , true ); - inputChain->SetBranchStatus( "Si_T" , true ); - inputChain->SetBranchStatus( "Si_X" , true ); - inputChain->SetBranchStatus( "Si_Y" , true ); - inputChain->SetBranchStatus( "Si_EX" , true ); - inputChain->SetBranchStatus( "Si_TX" , true ); - inputChain->SetBranchStatus( "Si_EY" , true ); - inputChain->SetBranchStatus( "Si_TY" , true ); - inputChain->SetBranchStatus( "TelescopeNumber_X" , true ); - inputChain->SetBranchStatus( "TelescopeNumber_Y" , true ); - inputChain->SetBranchStatus( "SiLi_E" , true ); - inputChain->SetBranchStatus( "SiLi_T" , true ); - inputChain->SetBranchStatus( "SiLi_N" , true ); - inputChain->SetBranchStatus( "CsI_E" , true ); - inputChain->SetBranchStatus( "CsI_T" , true ); - inputChain->SetBranchStatus( "CsI_N" , true ); - inputChain->SetBranchStatus( "TotalEnergy" , true ); - inputChain->SetBranchAddress( "MUST2" , &m_EventPhysics); + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus( "MUST2" , true ); + inputChain->SetBranchStatus( "EventMultiplicity" , true ); + inputChain->SetBranchStatus( "EventType" , true ); + inputChain->SetBranchStatus( "TelescopeNumber" , true ); + inputChain->SetBranchStatus( "Si_E" , true ); + inputChain->SetBranchStatus( "Si_T" , true ); + inputChain->SetBranchStatus( "Si_X" , true ); + inputChain->SetBranchStatus( "Si_Y" , true ); + inputChain->SetBranchStatus( "Si_EX" , true ); + inputChain->SetBranchStatus( "Si_TX" , true ); + inputChain->SetBranchStatus( "Si_EY" , true ); + inputChain->SetBranchStatus( "Si_TY" , true ); + inputChain->SetBranchStatus( "TelescopeNumber_X" , true ); + inputChain->SetBranchStatus( "TelescopeNumber_Y" , true ); + inputChain->SetBranchStatus( "SiLi_E" , true ); + inputChain->SetBranchStatus( "SiLi_T" , true ); + inputChain->SetBranchStatus( "SiLi_N" , true ); + inputChain->SetBranchStatus( "CsI_E" , true ); + inputChain->SetBranchStatus( "CsI_T" , true ); + inputChain->SetBranchStatus( "CsI_N" , true ); + inputChain->SetBranchStatus( "TotalEnergy" , true ); + inputChain->SetBranchAddress( "MUST2" , &m_EventPhysics); } /////////////////////////////////////////////////////////////////////////// void TMust2Physics::InitializeRootOutput(){ - TTree* outputTree = RootOutput::getInstance()->GetTree(); - outputTree->Branch( "MUST2" , "TMust2Physics" , &m_EventPhysics ); + TTree* outputTree = RootOutput::getInstance()->GetTree(); + outputTree->Branch( "MUST2" , "TMust2Physics" , &m_EventPhysics ); } ///// Specific to MUST2Array //// void TMust2Physics::AddTelescope( TVector3 C_X1_Y1, - TVector3 C_X128_Y1, - TVector3 C_X1_Y128, - TVector3 C_X128_Y128){ - // To avoid warning - C_X128_Y128 *= 1; - - m_NumberOfTelescope++; - - // Vector U on Telescope Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis) - TVector3 U = C_X128_Y1 - C_X1_Y1 ; - double Ushift = (U.Mag()-98)/2.; - U = U.Unit(); - // Vector V on Telescope Face (parallele to X Strip) - TVector3 V = C_X1_Y128 - C_X1_Y1 ; - double Vshift = (V.Mag() -98)/2. ; - V = V.Unit() ; - - // Position Vector of Strip Center - TVector3 StripCenter = TVector3(0,0,0); - // Position Vector of X=1 Y=1 Strip - TVector3 Strip_1_1; - - // Geometry Parameter - double Face = 98; //mm - double NumberOfStrip = 128; - double StripPitch = Face/NumberOfStrip ; //mm - // Buffer object to fill Position Array - vector<double> lineX ; vector<double> lineY ; vector<double> lineZ ; - - vector< vector< double > > OneTelescopeStripPositionX ; - vector< vector< double > > OneTelescopeStripPositionY ; - vector< vector< double > > OneTelescopeStripPositionZ ; - - // Moving StripCenter to 1.1 corner: - Strip_1_1 = C_X1_Y1 + (U+V) * (StripPitch/2.) ; - Strip_1_1+= U*Ushift+V*Vshift ; - - for( int i = 0 ; i < 128 ; ++i ){ - lineX.clear(); - lineY.clear(); - lineZ.clear(); - - for( int j = 0 ; j < 128 ; ++j ){ - StripCenter = Strip_1_1 + StripPitch*( i*U + j*V ); - lineX.push_back( StripCenter.X() ); - lineY.push_back( StripCenter.Y() ); - lineZ.push_back( StripCenter.Z() ); - } - - OneTelescopeStripPositionX.push_back(lineX); - OneTelescopeStripPositionY.push_back(lineY); - OneTelescopeStripPositionZ.push_back(lineZ); - + TVector3 C_X128_Y1, + TVector3 C_X1_Y128, + TVector3 C_X128_Y128){ + // To avoid warning + C_X128_Y128 *= 1; + + m_NumberOfTelescope++; + + // Vector U on Telescope Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis) + TVector3 U = C_X128_Y1 - C_X1_Y1 ; + double Ushift = (U.Mag()-98)/2.; + U = U.Unit(); + // Vector V on Telescope Face (parallele to X Strip) + TVector3 V = C_X1_Y128 - C_X1_Y1 ; + double Vshift = (V.Mag() -98)/2. ; + V = V.Unit() ; + + // Position Vector of Strip Center + TVector3 StripCenter = TVector3(0,0,0); + // Position Vector of X=1 Y=1 Strip + TVector3 Strip_1_1; + + // Geometry Parameter + double Face = 98; //mm + double NumberOfStrip = 128; + double StripPitch = Face/NumberOfStrip ; //mm + // Buffer object to fill Position Array + vector<double> lineX ; vector<double> lineY ; vector<double> lineZ ; + + vector< vector< double > > OneTelescopeStripPositionX ; + vector< vector< double > > OneTelescopeStripPositionY ; + vector< vector< double > > OneTelescopeStripPositionZ ; + + // Moving StripCenter to 1.1 corner: + Strip_1_1 = C_X1_Y1 + (U+V) * (StripPitch/2.) ; + Strip_1_1+= U*Ushift+V*Vshift ; + + for( int i = 0 ; i < 128 ; ++i ){ + lineX.clear(); + lineY.clear(); + lineZ.clear(); + + for( int j = 0 ; j < 128 ; ++j ){ + StripCenter = Strip_1_1 + StripPitch*( i*U + j*V ); + lineX.push_back( StripCenter.X() ); + lineY.push_back( StripCenter.Y() ); + lineZ.push_back( StripCenter.Z() ); } - m_StripPositionX.push_back( OneTelescopeStripPositionX ) ; - m_StripPositionY.push_back( OneTelescopeStripPositionY ) ; - m_StripPositionZ.push_back( OneTelescopeStripPositionZ ) ; - + + OneTelescopeStripPositionX.push_back(lineX); + OneTelescopeStripPositionY.push_back(lineY); + OneTelescopeStripPositionZ.push_back(lineZ); + + } + m_StripPositionX.push_back( OneTelescopeStripPositionX ) ; + m_StripPositionY.push_back( OneTelescopeStripPositionY ) ; + m_StripPositionZ.push_back( OneTelescopeStripPositionZ ) ; + } void TMust2Physics::InitializeStandardParameter(){ - // Enable all channel - vector< bool > ChannelStatus; - m_XChannelStatus.clear() ; - m_YChannelStatus.clear() ; - m_SiLiChannelStatus.clear() ; - m_CsIChannelStatus.clear() ; - - ChannelStatus.resize(128,true); - for(int i = 0 ; i < m_NumberOfTelescope ; ++i){ - m_XChannelStatus[i] = ChannelStatus; - m_YChannelStatus[i] = ChannelStatus; - } - - ChannelStatus.resize(16,true); - for(int i = 0 ; i < m_NumberOfTelescope ; ++i){ - m_SiLiChannelStatus[i] = ChannelStatus; - m_CsIChannelStatus[i] = ChannelStatus; - } - - m_MaximumStripMultiplicityAllowed = m_NumberOfTelescope ; - - return; + // Enable all channel + vector< bool > ChannelStatus; + m_XChannelStatus.clear() ; + m_YChannelStatus.clear() ; + m_SiLiChannelStatus.clear() ; + m_CsIChannelStatus.clear() ; + + ChannelStatus.resize(128,true); + for(int i = 0 ; i < m_NumberOfTelescope ; ++i){ + m_XChannelStatus[i] = ChannelStatus; + m_YChannelStatus[i] = ChannelStatus; + } + + ChannelStatus.resize(16,true); + for(int i = 0 ; i < m_NumberOfTelescope ; ++i){ + m_SiLiChannelStatus[i] = ChannelStatus; + m_CsIChannelStatus[i] = ChannelStatus; + } + + m_MaximumStripMultiplicityAllowed = m_NumberOfTelescope ; + + return; } void TMust2Physics::AddTelescope( double theta, - double phi, - double distance, - double beta_u, - double beta_v, - double beta_w){ - - m_NumberOfTelescope++; - - double Pi = 3.141592654 ; - - // convert from degree to radian: - theta = theta * Pi/180. ; - phi = phi * Pi/180. ; - - //Vector U on Telescope Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis) - TVector3 U ; - //Vector V on Telescope Face (parallele to X Strip) - TVector3 V ; - //Vector W normal to Telescope Face (pointing CsI) - TVector3 W ; - //Vector position of Telescope Face center - TVector3 C ; - - C = TVector3 ( distance * sin(theta) * cos(phi) , - distance * sin(theta) * sin(phi) , - distance * cos(theta) ); - - TVector3 P = TVector3( cos(theta ) * cos(phi) , - cos(theta ) * sin(phi) , - -sin(theta) ); - - W = C.Unit() ; - U = W .Cross ( P ) ; - V = W .Cross ( U ); - - U = U.Unit(); - V = V.Unit(); - - U.Rotate( beta_u * Pi/180. , U ) ; - V.Rotate( beta_u * Pi/180. , U ) ; - - U.Rotate( beta_v * Pi/180. , V ) ; - V.Rotate( beta_v * Pi/180. , V ) ; - - U.Rotate( beta_w * Pi/180. , W ) ; - V.Rotate( beta_w * Pi/180. , W ) ; - - double Face = 98 ; //mm - double NumberOfStrip = 128 ; - double StripPitch = Face/NumberOfStrip ; //mm - - vector<double> lineX ; vector<double> lineY ; vector<double> lineZ ; - - vector< vector< double > > OneTelescopeStripPositionX ; - vector< vector< double > > OneTelescopeStripPositionY ; - vector< vector< double > > OneTelescopeStripPositionZ ; - - double X , Y , Z ; - - //Moving C to the 1.1 corner: - C.SetX( C.X() - ( Face/2 - StripPitch/2 ) * ( V.X() + U.X() ) ) ; - C.SetY( C.Y() - ( Face/2 - StripPitch/2 ) * ( V.Y() + U.Y() ) ) ; - C.SetZ( C.Z() - ( Face/2 - StripPitch/2 ) * ( V.Z() + U.Z() ) ) ; - - for( int i = 0 ; i < 128 ; ++i ){ - - lineX.clear() ; - lineY.clear() ; - lineZ.clear() ; - - for( int j = 0 ; j < 128 ; ++j ){ - X = C.X() + StripPitch * ( U.X()*i + V.X()*j ) ; - Y = C.Y() + StripPitch * ( U.Y()*i + V.Y()*j ) ; - Z = C.Z() + StripPitch * ( U.Z()*i + V.Z()*j ) ; - - lineX.push_back(X) ; - lineY.push_back(Y) ; - lineZ.push_back(Z) ; - - } - - OneTelescopeStripPositionX.push_back(lineX) ; - OneTelescopeStripPositionY.push_back(lineY) ; - OneTelescopeStripPositionZ.push_back(lineZ) ; - + double phi, + double distance, + double beta_u, + double beta_v, + double beta_w){ + + m_NumberOfTelescope++; + + double Pi = 3.141592654 ; + + // convert from degree to radian: + theta = theta * Pi/180. ; + phi = phi * Pi/180. ; + + //Vector U on Telescope Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis) + TVector3 U ; + //Vector V on Telescope Face (parallele to X Strip) + TVector3 V ; + //Vector W normal to Telescope Face (pointing CsI) + TVector3 W ; + //Vector position of Telescope Face center + TVector3 C ; + + C = TVector3 ( distance * sin(theta) * cos(phi) , + distance * sin(theta) * sin(phi) , + distance * cos(theta) ); + + TVector3 P = TVector3( cos(theta ) * cos(phi) , + cos(theta ) * sin(phi) , + -sin(theta) ); + + W = C.Unit() ; + U = W .Cross ( P ) ; + V = W .Cross ( U ); + + U = U.Unit(); + V = V.Unit(); + + U.Rotate( beta_u * Pi/180. , U ) ; + V.Rotate( beta_u * Pi/180. , U ) ; + + U.Rotate( beta_v * Pi/180. , V ) ; + V.Rotate( beta_v * Pi/180. , V ) ; + + U.Rotate( beta_w * Pi/180. , W ) ; + V.Rotate( beta_w * Pi/180. , W ) ; + + double Face = 98 ; //mm + double NumberOfStrip = 128 ; + double StripPitch = Face/NumberOfStrip ; //mm + + vector<double> lineX ; vector<double> lineY ; vector<double> lineZ ; + + vector< vector< double > > OneTelescopeStripPositionX ; + vector< vector< double > > OneTelescopeStripPositionY ; + vector< vector< double > > OneTelescopeStripPositionZ ; + + double X , Y , Z ; + + //Moving C to the 1.1 corner: + C.SetX( C.X() - ( Face/2 - StripPitch/2 ) * ( V.X() + U.X() ) ) ; + C.SetY( C.Y() - ( Face/2 - StripPitch/2 ) * ( V.Y() + U.Y() ) ) ; + C.SetZ( C.Z() - ( Face/2 - StripPitch/2 ) * ( V.Z() + U.Z() ) ) ; + + for( int i = 0 ; i < 128 ; ++i ){ + + lineX.clear() ; + lineY.clear() ; + lineZ.clear() ; + + for( int j = 0 ; j < 128 ; ++j ){ + X = C.X() + StripPitch * ( U.X()*i + V.X()*j ) ; + Y = C.Y() + StripPitch * ( U.Y()*i + V.Y()*j ) ; + Z = C.Z() + StripPitch * ( U.Z()*i + V.Z()*j ) ; + + lineX.push_back(X) ; + lineY.push_back(Y) ; + lineZ.push_back(Z) ; + } - m_StripPositionX.push_back( OneTelescopeStripPositionX ) ; - m_StripPositionY.push_back( OneTelescopeStripPositionY ) ; - m_StripPositionZ.push_back( OneTelescopeStripPositionZ ) ; + + OneTelescopeStripPositionX.push_back(lineX) ; + OneTelescopeStripPositionY.push_back(lineY) ; + OneTelescopeStripPositionZ.push_back(lineZ) ; + + } + m_StripPositionX.push_back( OneTelescopeStripPositionX ) ; + m_StripPositionY.push_back( OneTelescopeStripPositionY ) ; + m_StripPositionZ.push_back( OneTelescopeStripPositionZ ) ; } TVector3 TMust2Physics::GetPositionOfInteraction(const int i) const{ - TVector3 Position = TVector3 ( GetStripPositionX( TelescopeNumber[i] , Si_X[i] , Si_Y[i] ) , - GetStripPositionY( TelescopeNumber[i] , Si_X[i] , Si_Y[i] ) , - GetStripPositionZ( TelescopeNumber[i] , Si_X[i] , Si_Y[i] ) ) ; - - return(Position) ; - + TVector3 Position = TVector3 ( GetStripPositionX( TelescopeNumber[i] , Si_X[i] , Si_Y[i] ) , + GetStripPositionY( TelescopeNumber[i] , Si_X[i] , Si_Y[i] ) , + GetStripPositionZ( TelescopeNumber[i] , Si_X[i] , Si_Y[i] ) ) ; + + return(Position) ; + } TVector3 TMust2Physics::GetTelescopeNormal( const int i) const{ - TVector3 U = TVector3 ( GetStripPositionX( TelescopeNumber[i] , 128 , 1 ) , - GetStripPositionY( TelescopeNumber[i] , 128 , 1 ) , - GetStripPositionZ( TelescopeNumber[i] , 128 , 1 ) ) - + TVector3 U = TVector3 ( GetStripPositionX( TelescopeNumber[i] , 128 , 1 ) , + GetStripPositionY( TelescopeNumber[i] , 128 , 1 ) , + GetStripPositionZ( TelescopeNumber[i] , 128 , 1 ) ) + -TVector3 ( GetStripPositionX( TelescopeNumber[i] , 1 , 1 ) , - GetStripPositionY( TelescopeNumber[i] , 1 , 1 ) , - GetStripPositionZ( TelescopeNumber[i] , 1 , 1 ) ); - - TVector3 V = TVector3 ( GetStripPositionX( TelescopeNumber[i] , 128 , 128 ) , - GetStripPositionY( TelescopeNumber[i] , 128 , 128 ) , - GetStripPositionZ( TelescopeNumber[i] , 128 , 128 ) ) - + GetStripPositionY( TelescopeNumber[i] , 1 , 1 ) , + GetStripPositionZ( TelescopeNumber[i] , 1 , 1 ) ); + + TVector3 V = TVector3 ( GetStripPositionX( TelescopeNumber[i] , 128 , 128 ) , + GetStripPositionY( TelescopeNumber[i] , 128 , 128 ) , + GetStripPositionZ( TelescopeNumber[i] , 128 , 128 ) ) + -TVector3 ( GetStripPositionX( TelescopeNumber[i] , 128 , 1 ) , - GetStripPositionY( TelescopeNumber[i] , 128 , 1 ) , - GetStripPositionZ( TelescopeNumber[i] , 128 , 1 ) ); - - TVector3 Normal = U.Cross(V); - - return(Normal.Unit()) ; + GetStripPositionY( TelescopeNumber[i] , 128 , 1 ) , + GetStripPositionZ( TelescopeNumber[i] , 128 , 1 ) ); + + TVector3 Normal = U.Cross(V); + + return(Normal.Unit()) ; } /////////////////////////////////////////////////////////////////////////// namespace MUST2_LOCAL{ - // DSSD - // X - double fSi_X_E(const TMust2Data* m_EventData , const int i){ - static string name; name = "MUST2/T" ; - name+= NPL::itoa( m_EventData->GetMMStripXEDetectorNbr(i) ) ; - name+= "_Si_X" ; - name+= NPL::itoa( m_EventData->GetMMStripXEStripNbr(i) ) ; - name+= "_E"; - return CalibrationManager::getInstance()->ApplyCalibration(name, - m_EventData->GetMMStripXEEnergy(i) ); - } - - double fSi_X_T(const TMust2Data* m_EventData , const int i){ - static string name; name = "MUST2/T" ; - name+= NPL::itoa( m_EventData->GetMMStripXTDetectorNbr(i) ) ; - name+= "_Si_X" ; - name+= NPL::itoa( m_EventData->GetMMStripXTStripNbr(i) ) ; - name+="_T"; - return CalibrationManager::getInstance()->ApplyCalibration(name, - m_EventData->GetMMStripXTTime(i) ); - } - - // Y - double fSi_Y_E(const TMust2Data* m_EventData , const int i){ - static string name; name = "MUST2/T" ; - name+= NPL::itoa( m_EventData->GetMMStripYEDetectorNbr(i) ) ; - name+= "_Si_Y" ; - name+= NPL::itoa( m_EventData->GetMMStripYEStripNbr(i) ) ; - name+="_E"; - return CalibrationManager::getInstance()->ApplyCalibration( name, m_EventData->GetMMStripYEEnergy(i) ); - } - - double fSi_Y_T(const TMust2Data* m_EventData , const int i){ - static string name; name = "MUST2/T" ; - name+= NPL::itoa( m_EventData->GetMMStripYTDetectorNbr(i) ) ; - name+= "_Si_Y" ; - name+= NPL::itoa( m_EventData->GetMMStripYTStripNbr(i) ) ; - name+="_T"; - return CalibrationManager::getInstance()->ApplyCalibration( name , - m_EventData->GetMMStripYTTime(i) ); - } - - - // SiLi - double fSiLi_E(const TMust2Data* m_EventData , const int i){ - static string name; name = "MUST2/T" ; - name+= NPL::itoa( m_EventData->GetMMSiLiEDetectorNbr(i) ) ; - name+= "_SiLi" ; - name+= NPL::itoa( m_EventData->GetMMSiLiEPadNbr(i) ) ; - name+="_E"; - - return CalibrationManager::getInstance()->ApplyCalibration(name, m_EventData->GetMMSiLiEEnergy(i) ); - } - - double fSiLi_T(const TMust2Data* m_EventData , const int i){ - static string name; name ="MUST2/T" ; - name+= NPL::itoa( m_EventData->GetMMSiLiTDetectorNbr(i) ) ; - name+= "_SiLi" ; - name+= NPL::itoa( m_EventData->GetMMSiLiTPadNbr(i) ); - name+="_T"; - return CalibrationManager::getInstance()->ApplyCalibration( name , - m_EventData->GetMMSiLiTTime(i) ); - } - - // CsI - double fCsI_E(const TMust2Data* m_EventData , const int i){ - static string name; name = "MUST2/T" ; - name+= NPL::itoa( m_EventData->GetMMCsIEDetectorNbr(i) ) ; - name+= "_CsI" ; - name+= NPL::itoa( m_EventData->GetMMCsIECristalNbr(i) ) ; - name+="_E"; - return CalibrationManager::getInstance()->ApplyCalibration(name, - m_EventData->GetMMCsIEEnergy(i) ); - } - - double fCsI_T(const TMust2Data* m_EventData , const int i){ - static string name; name ="MUST2/T" ; - name+= NPL::itoa( m_EventData->GetMMCsITDetectorNbr(i) ) ; - name+= "_CsI" ; - name+= NPL::itoa( m_EventData->GetMMCsITCristalNbr(i) ) ; - name+="_T"; - return CalibrationManager::getInstance()->ApplyCalibration( name , - m_EventData->GetMMCsITTime(i) ); - } - + // DSSD + // X + double fSi_X_E(const TMust2Data* m_EventData , const int i){ + static string name; name = "MUST2/T" ; + name+= NPL::itoa( m_EventData->GetMMStripXEDetectorNbr(i) ) ; + name+= "_Si_X" ; + name+= NPL::itoa( m_EventData->GetMMStripXEStripNbr(i) ) ; + name+= "_E"; + return CalibrationManager::getInstance()->ApplyCalibration(name, + m_EventData->GetMMStripXEEnergy(i) ); + } + + double fSi_X_T(const TMust2Data* m_EventData , const int i){ + static string name; name = "MUST2/T" ; + name+= NPL::itoa( m_EventData->GetMMStripXTDetectorNbr(i) ) ; + name+= "_Si_X" ; + name+= NPL::itoa( m_EventData->GetMMStripXTStripNbr(i) ) ; + name+="_T"; + return CalibrationManager::getInstance()->ApplyCalibration(name, + m_EventData->GetMMStripXTTime(i) ); + } + + // Y + double fSi_Y_E(const TMust2Data* m_EventData , const int i){ + static string name; name = "MUST2/T" ; + name+= NPL::itoa( m_EventData->GetMMStripYEDetectorNbr(i) ) ; + name+= "_Si_Y" ; + name+= NPL::itoa( m_EventData->GetMMStripYEStripNbr(i) ) ; + name+="_E"; + return CalibrationManager::getInstance()->ApplyCalibration( name, m_EventData->GetMMStripYEEnergy(i) ); + } + + double fSi_Y_T(const TMust2Data* m_EventData , const int i){ + static string name; name = "MUST2/T" ; + name+= NPL::itoa( m_EventData->GetMMStripYTDetectorNbr(i) ) ; + name+= "_Si_Y" ; + name+= NPL::itoa( m_EventData->GetMMStripYTStripNbr(i) ) ; + name+="_T"; + return CalibrationManager::getInstance()->ApplyCalibration( name , + m_EventData->GetMMStripYTTime(i) ); + } + + + // SiLi + double fSiLi_E(const TMust2Data* m_EventData , const int i){ + static string name; name = "MUST2/T" ; + name+= NPL::itoa( m_EventData->GetMMSiLiEDetectorNbr(i) ) ; + name+= "_SiLi" ; + name+= NPL::itoa( m_EventData->GetMMSiLiEPadNbr(i) ) ; + name+="_E"; + + return CalibrationManager::getInstance()->ApplyCalibration(name, m_EventData->GetMMSiLiEEnergy(i) ); + } + + double fSiLi_T(const TMust2Data* m_EventData , const int i){ + static string name; name ="MUST2/T" ; + name+= NPL::itoa( m_EventData->GetMMSiLiTDetectorNbr(i) ) ; + name+= "_SiLi" ; + name+= NPL::itoa( m_EventData->GetMMSiLiTPadNbr(i) ); + name+="_T"; + return CalibrationManager::getInstance()->ApplyCalibration( name , + m_EventData->GetMMSiLiTTime(i) ); + } + + // CsI + double fCsI_E(const TMust2Data* m_EventData , const int i){ + static string name; name = "MUST2/T" ; + name+= NPL::itoa( m_EventData->GetMMCsIEDetectorNbr(i) ) ; + name+= "_CsI" ; + name+= NPL::itoa( m_EventData->GetMMCsIECristalNbr(i) ) ; + name+="_E"; + return CalibrationManager::getInstance()->ApplyCalibration(name, + m_EventData->GetMMCsIEEnergy(i) ); + } + + double fCsI_T(const TMust2Data* m_EventData , const int i){ + static string name; name ="MUST2/T" ; + name+= NPL::itoa( m_EventData->GetMMCsITDetectorNbr(i) ) ; + name+= "_CsI" ; + name+= NPL::itoa( m_EventData->GetMMCsITCristalNbr(i) ) ; + name+="_T"; + return CalibrationManager::getInstance()->ApplyCalibration( name , + m_EventData->GetMMCsITTime(i) ); + } + } //////////////////////////////////////////////////////////////////////////////// // Construct Method to be pass to the DetectorFactory // //////////////////////////////////////////////////////////////////////////////// NPL::VDetector* TMust2Physics::Construct(){ - return (NPL::VDetector*) new TMust2Physics(); + return (NPL::VDetector*) new TMust2Physics(); } //////////////////////////////////////////////////////////////////////////////// // Registering the construct method to the factory // //////////////////////////////////////////////////////////////////////////////// extern "C"{ - class proxy_must2{ - public: - proxy_must2(){ - NPL::DetectorFactory::getInstance()->AddToken("MUST2Array","MUST2"); - NPL::DetectorFactory::getInstance()->AddDetector("MUST2Array",TMust2Physics::Construct); - } - }; - - proxy_must2 p_must2; +class proxy_must2{ + public: + proxy_must2(){ + NPL::DetectorFactory::getInstance()->AddToken("M2Telescope","MUST2"); + NPL::DetectorFactory::getInstance()->AddDetector("M2Telescope",TMust2Physics::Construct); + } +}; + +proxy_must2 p_must2; } diff --git a/NPLib/Detectors/MUST2/TMust2Physics.h b/NPLib/Detectors/MUST2/TMust2Physics.h index b061220502dd8a792de6b01ccfd69727100af623..ca718633560bd05b39334a845016058b5bde27b8 100644 --- a/NPLib/Detectors/MUST2/TMust2Physics.h +++ b/NPLib/Detectors/MUST2/TMust2Physics.h @@ -30,6 +30,7 @@ #include "TMust2Spectra.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" +#include "NPInputParser.h" // ROOT #include "TVector2.h" #include "TVector3.h" @@ -98,7 +99,7 @@ class TMust2Physics : public TObject, public NPL::VDetector{ public: // Innherited from VDetector Class // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string) ; + void ReadConfiguration(NPL::InputParser parser) ; // Add Parameter to the CalibrationManger diff --git a/NPLib/Detectors/Microball/TMicroballPhysics.cxx b/NPLib/Detectors/Microball/TMicroballPhysics.cxx index d453661111ef580299da8b7af8f3457dada3f5e5..ef9ad79b3f7e105261a230d0ceff9d1ce84676a0 100644 --- a/NPLib/Detectors/Microball/TMicroballPhysics.cxx +++ b/NPLib/Detectors/Microball/TMicroballPhysics.cxx @@ -1,18 +1,18 @@ /***************************************************************************** - * Copyright (C) 2009-2016 this file is part of the NPTool Project * + * Copyright (C) 2009-2016 this file is part of the NPTool Project * * * * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * * For the list of contributors see $NPTOOL/Licence/Contributors * *****************************************************************************/ /***************************************************************************** - * Original Author: Pierre Morfouace contact address: morfouac@nscl.msu.edu * + * Original Author: Pierre Morfouace contact address: morfouac@nscl.msu.edu * * * - * Creation Date : June 2016 * + * Creation Date : June 2016 * * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class hold Microball Treated data * + * This class hold Microball Treated data * * * *---------------------------------------------------------------------------* * Comment: * @@ -34,7 +34,7 @@ using namespace std; #include "RootInput.h" #include "RootOutput.h" #include "NPDetectorFactory.h" - +#include "NPOptionManager.h" // ROOT #include "TChain.h" @@ -182,187 +182,45 @@ void TMicroballPhysics::Clear() { /////////////////////////////////////////////////////////////////////////// -void TMicroballPhysics::ReadConfiguration(string Path) { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - -bool bR1 = false; -bool bR2 = false; -bool bR3 = false; -bool bR4 = false; -bool bR5 = false; -bool bR6 = false; -bool bR7 = false; -bool bR8 = false; -bool bR9 = false; -vector<int> copyNumArray; -bool bFlip = false; - - bool ReadingStatus = false ; - -bool check_Ring1 = false; -bool check_Ring2 = false; -bool check_Ring3 = false; -bool check_Ring4 = false; -bool check_Ring5 = false; -bool check_Ring6 = false; -bool check_Ring7 = false; -bool check_Ring8 = false; -bool check_Ring9 = false; -bool check_Flip = false; - - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Start Up Microball bloc, Reading toggle to true - string name = "Microball"; - - if (LineBuffer.compare(0, name.length(), name) == 0) { - cout << "///" << endl ; - cout << "Microball found: " << endl ; - ReadingStatus = true ; - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, name.length(),name) == 0) { - cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << endl ; - ReadingStatus = false ; - } - - //Angle method - else if (DataBuffer.compare(0, 6, "RING1=") == 0) { - check_Ring1 = true; - ConfigFile >> DataBuffer ; - bR1 = atoi(DataBuffer.c_str()) ; - cout << "Ring1: " << bR1 << endl; - } - - else if (DataBuffer.compare(0, 6, "RING2=") == 0) { - check_Ring2 = true; - ConfigFile >> DataBuffer ; - bR2 = atoi(DataBuffer.c_str()) ; - cout << "Ring2: " << bR2 << endl; - } - - else if (DataBuffer.compare(0, 6, "RING3=") == 0) { - check_Ring3 = true; - ConfigFile >> DataBuffer ; - bR3 = atoi(DataBuffer.c_str()) ; - cout << "Ring3: " << bR3 << endl; - } - - else if (DataBuffer.compare(0, 6, "RING4=") == 0) { - check_Ring4 = true; - ConfigFile >> DataBuffer ; - bR4 = atoi(DataBuffer.c_str()) ; - cout << "Ring4: " << bR4 << endl; - } - - else if (DataBuffer.compare(0, 6, "RING5=") == 0) { - check_Ring5 = true; - ConfigFile >> DataBuffer ; - bR5 = atoi(DataBuffer.c_str()) ; - cout << "Ring5: " << bR5 << endl; - } - - else if (DataBuffer.compare(0, 6, "RING6=") == 0) { - check_Ring6 = true; - ConfigFile >> DataBuffer ; - bR6 = atoi(DataBuffer.c_str()) ; - cout << "Ring6: " << bR6 << endl; - } - - else if (DataBuffer.compare(0, 6, "RING7=") == 0) { - check_Ring7 = true; - ConfigFile >> DataBuffer ; - bR7 = atoi(DataBuffer.c_str()) ; - cout << "Ring7: " << bR7 << endl; - } - - else if (DataBuffer.compare(0, 6, "RING8=") == 0) { - check_Ring8 = true; - ConfigFile >> DataBuffer ; - bR8 = atoi(DataBuffer.c_str()) ; - cout << "Ring8: " << bR8 << endl; - } - - - else if (DataBuffer.compare(0, 6, "RING9=") == 0) { - check_Ring9 = true; - ConfigFile >> DataBuffer ; - bR9 = atoi(DataBuffer.c_str()) ; - cout << "Ring9: " << bR9 << endl; - } - - else if (DataBuffer.compare(0, 15, "DISABLE_CRYSTAL") == 0) { - ConfigFile >> DataBuffer ; - int item = atoi(DataBuffer.c_str()); - copyNumArray.push_back(item) ; - cout << "Disabled crystal: " << item << endl; - } - - else if (DataBuffer.compare(0, 14, "DETECTOR_FLIP=") == 0) { - check_Flip = true; - ConfigFile >> DataBuffer ; - bFlip = atoi(DataBuffer.c_str()) ; - cout << "Flip Detector: " << bFlip << endl; - } - - - //General - - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; - cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ; - } - if(check_Ring1 && check_Ring2 && check_Ring3 && - check_Ring4 && check_Ring5 && check_Ring6 && - check_Ring7 && check_Ring8 && check_Ring9 && - check_Flip){ +void TMicroballPhysics::ReadConfiguration(NPL::InputParser parser ) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Microball"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> token = {"RING1","RING2","RING3","RING4","RING5","RING6","RING7","RING8","RING9"}; + + vector<int> copyNumArray; + bool bFlip = false; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Microball " << i+1 << endl; + bool bR1 = blocks[i]->GetInt("RING1"); + bool bR2 = blocks[i]->GetInt("RING2"); + bool bR3 = blocks[i]->GetInt("RING3"); + bool bR4 = blocks[i]->GetInt("RING4"); + bool bR5 = blocks[i]->GetInt("RING5"); + bool bR6 = blocks[i]->GetInt("RING6"); + bool bR7 = blocks[i]->GetInt("RING7"); + bool bR8 = blocks[i]->GetInt("RING8"); + bool bR9 = blocks[i]->GetInt("RING9"); + if( blocks[i]->HasToken("DISABLE_CRYSTAL")) + copyNumArray.push_back( blocks[i]->GetInt("DISABLE_CRYSTAL")); + if(blocks[i]->HasToken("DETECTOR_FLIP")) + bFlip = blocks[i]->GetInt("DETECTOR_FLIP"); + } - // Reinitialisation of Check Boolean - check_Ring1 = false ; - check_Ring2 = false ; - check_Ring3 = false ; - check_Ring4 = false ; - check_Ring5 = false ; - check_Ring6 = false ; - check_Ring7 = false ; - check_Ring8 = false ; - check_Ring9 = false ; - check_Flip = false ; - - ReadingStatus = false ; - cout << "///"<< endl ; - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } - } + } + ReadAnalysisConfig(); } - - /////////////////////////////////////////////////////////////////////////// void TMicroballPhysics::InitSpectra() { m_Spectra = new TMicroballSpectra(m_NumberOfDetectors); diff --git a/NPLib/Detectors/Microball/TMicroballPhysics.h b/NPLib/Detectors/Microball/TMicroballPhysics.h index b16c9d8333b19cb8307716eb85294c3fe0a08d67..9fb4f6335e8eea9e813a7c820247ba54f37a4d68 100644 --- a/NPLib/Detectors/Microball/TMicroballPhysics.h +++ b/NPLib/Detectors/Microball/TMicroballPhysics.h @@ -1,20 +1,20 @@ #ifndef TMicroballPHYSICS_H #define TMicroballPHYSICS_H /***************************************************************************** - * Copyright (C) 2009-2016 this file is part of the NPTool Project * + * Copyright (C) 2009-2016 this file is part of the NPTool Project * * * * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * * For the list of contributors see $NPTOOL/Licence/Contributors * *****************************************************************************/ /***************************************************************************** - * Original Author: Pierre Morfouace contact address: morfouac@nscl.msu.edu * + * Original Author: Pierre Morfouace contact address: morfouac@nscl.msu.edu * * * - * Creation Date : June 2016 * + * Creation Date : June 2016 * * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class hold Microball Treated data * + * This class hold Microball Treated data * * * *---------------------------------------------------------------------------* * Comment: * @@ -38,7 +38,7 @@ using namespace std; #include "TMicroballSpectra.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" - +#include "NPInputParser.h" // forward declaration class TMicroballSpectra; @@ -72,7 +72,7 @@ class TMicroballPhysics : public TObject, public NPL::VDetector { // methods inherited from the VDetector ABC class public: // read stream from ConfigFile to pick-up detector parameters - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // add parameters to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/Detectors/Miniball/TMiniballPhysics.cxx b/NPLib/Detectors/Miniball/TMiniballPhysics.cxx index 5ff42cdfcdce17281f8f81c0b481142442992aff..5c10175cd45f596f140d8c6447b0da1f55a61423 100644 --- a/NPLib/Detectors/Miniball/TMiniballPhysics.cxx +++ b/NPLib/Detectors/Miniball/TMiniballPhysics.cxx @@ -34,6 +34,7 @@ using namespace std; #include "RootInput.h" #include "RootOutput.h" #include "NPDetectorFactory.h" +#include "NPOptionManager.h" // ROOT #include "TChain.h" @@ -192,88 +193,32 @@ void TMiniballPhysics::Clear() { /////////////////////////////////////////////////////////////////////////// -void TMiniballPhysics::ReadConfiguration(string Path) { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool ReadingStatus = false ; - - while (!ConfigFile.eof()){ - - getline(ConfigFile, LineBuffer); - - // If line is a Start Up Miniball bloc, Reading toggle to true - string name="Miniball"; - if (LineBuffer.compare(0, name.length(), name) == 0){ - cout << "///" << endl ; - cout << "Miniball found: " << endl ; - ReadingStatus = true ; +void TMiniballPhysics::ReadConfiguration(NPL::InputParser parser) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Miniball"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> token = {"R","Theta","Phi"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Miniball Cluster" << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + +// AddDetector(R,Theta,Phi); } - // Reading Block - while(ReadingStatus) - { - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, name.length(), name) == 0) { - cout << "\033[1;311mWARNING: Another detector is find before standard sequence of Token, Error may occured in detector definition\033[0m" << endl ; - ReadingStatus = false ; - } - - //Angle method - else if (DataBuffer=="THETA=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - cout << "Theta: " << atof(DataBuffer.c_str()) << "deg" << endl; - } - - else if (DataBuffer=="PHI=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - cout << "Phi: " << atof( DataBuffer.c_str() ) << "deg" << endl; - } - - else if (DataBuffer=="R=") { - check_R = true; - ConfigFile >> DataBuffer ; - cout << "R: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_Theta && check_Phi && check_R){ - m_NumberOfDetectors++; - - // Reinitialisation of Check Boolean - check_Theta = false ; - check_Phi = false ; - check_R = false ; - ReadingStatus = false ; - cout << "///"<< endl ; - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } -} + ReadAnalysisConfig(); +} /////////////////////////////////////////////////////////////////////////// diff --git a/NPLib/Detectors/Miniball/TMiniballPhysics.h b/NPLib/Detectors/Miniball/TMiniballPhysics.h index 41d0a1fb46ed3bb699ead1d4dd3b9fbed841b08d..717a5ed6e2d84f7bfdeae3d2736a62915ff1abc0 100644 --- a/NPLib/Detectors/Miniball/TMiniballPhysics.h +++ b/NPLib/Detectors/Miniball/TMiniballPhysics.h @@ -1,20 +1,20 @@ #ifndef TMiniballPHYSICS_H #define TMiniballPHYSICS_H /***************************************************************************** - * Copyright (C) 2009-2016 this file is part of the NPTool Project * + * Copyright (C) 2009-2016 this file is part of the NPTool Project * * * * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * * For the list of contributors see $NPTOOL/Licence/Contributors * *****************************************************************************/ /***************************************************************************** - * Original Author: Adrien Matta contact address: a.matta@surrey.ac.uk * + * Original Author: Adrien Matta contact address: matta@lpccaen.in2p3.fr * * * - * Creation Date : January 2016 * + * Creation Date : January 2016 * * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class hold Miniball Treated data * + * This class hold Miniball Treated data * * * *---------------------------------------------------------------------------* * Comment: * @@ -38,6 +38,7 @@ using namespace std; #include "TMiniballSpectra.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" +#include "NPInputParser.h" // forward declaration class TMiniballSpectra; @@ -73,7 +74,7 @@ class TMiniballPhysics : public TObject, public NPL::VDetector { // methods inherited from the VDetector ABC class public: // read stream from ConfigFile to pick-up detector parameters - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // add parameters to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/Detectors/Nana/TNanaPhysics.cxx b/NPLib/Detectors/Nana/TNanaPhysics.cxx index f9d80d30276d55bcf289e23d6ff8ffaceec30d9b..f3545009ecfbe60036adf58ca1deec30bbd84e7f 100644 --- a/NPLib/Detectors/Nana/TNanaPhysics.cxx +++ b/NPLib/Detectors/Nana/TNanaPhysics.cxx @@ -26,7 +26,7 @@ #include "RootInput.h" #include "NPDetectorFactory.h" #include "RootOutput.h" - +#include "NPOptionManager.h" // STL #include <vector> #include <iostream> @@ -122,193 +122,44 @@ void TNanaPhysics::Clear(){ } //////////////////////////////////////////////////////////////////////////////// -void TNanaPhysics::ReadConfiguration(string Path) { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, Az, Bz, Cz, Dz; - TVector3 A, B, C, D; - double Theta = 0, Phi = 0, R = 0, beta_u = 0 , beta_v = 0 , beta_w = 0; - - bool check_A = false; - bool check_C = false; - bool check_B = false; - bool check_D = false; - - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; - bool check_beta = false; - - bool ReadingStatus = false; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Nana bloc, reading toggle to true - // and toggle to true flags indicating which shape is treated. - if (LineBuffer.compare(0, 12, "NanaCluster") == 0 ) { - cout << "///////////////////////" << endl; - cout << "Detector found:" << endl; - ReadingStatus = true; +void TNanaPhysics::ReadConfiguration(NPL::InputParser parser) { + + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Nana"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + + vector<string> cart = {"A","B","C","D"}; + vector<string> sphe= {"R","Theta","Phi","Beta"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Nana cluster " << i+1 << endl; + TVector3 A = blocks[i]->GetTVector3("A","mm"); + TVector3 B = blocks[i]->GetTVector3("B","mm"); + TVector3 C = blocks[i]->GetTVector3("C","mm"); + TVector3 D = blocks[i]->GetTVector3("D","mm"); + AddDetector(A,B,C,D) ; } - // Reading Block - while (ReadingStatus) { - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n' ); - } - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 13, "NanaDetector") == 0) { - cout << "WARNING: Another Module is find before standard sequence of Token, Error may occured in Telecope definition" << endl; - ReadingStatus = false; - } + + else if(blocks[i]->HasTokenList(sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Nana cluster " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + vector<double> Beta = blocks[i]->GetVectorDouble("Beta","def"); + AddDetector(R,Theta,Phi,Beta[0],Beta[1],Beta[2]) ; + } + else{ + cout << "ERROR: Missing token for M2Telescope blocks, check your input file" << endl; + exit(1); + } + } +} - // Position method - else if (DataBuffer=="A=") { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az ; - - A = TVector3(Ax, Ay, Az); - cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; - } - else if (DataBuffer=="B=") { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz ; - - B = TVector3(Bx, By, Bz); - cout << "X128 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; - } - else if (DataBuffer == "C=") { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz ; - - C = TVector3(Cx, Cy, Cz); - cout << "X1 Y128 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; - } - else if (DataBuffer=="D=") { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz ; - - D = TVector3(Dx, Dy, Dz); - cout << "X128 Y128 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; - } // End Position Method - - // Angle method - else if (DataBuffer.compare(0, 6, "Theta=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta ; - cout << "Theta: " << Theta << endl; - } - else if (DataBuffer.compare(0, 4, "Phi=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi ; - cout << "Phi: " << Phi << endl; - } - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R ; - cout << "R: " << R << endl; - } - else if (DataBuffer.compare(0, 5, "Beta=") == 0) { - check_beta = true; - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w ; - cout << "Beta: " << beta_u << " " << beta_v << " " << beta_w << endl ; - } - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) { - ReadingStatus = false; - - // Add The previously define telescope - // With position method - if ( check_A && check_B && check_C && check_D ) { - AddDetector(A , - B , - C , - D ) ; - } - - // with angle method - else if ( check_Theta && check_Phi && check_R && check_beta ) { - AddDetector(Theta, - Phi, - R, - beta_u, - beta_v, - beta_w); - } - - // reset boolean flag for point positioning - check_A = false; - check_B = false; - check_C = false; - check_D = false; - - // reset boolean flag for angle positioning - check_Theta = false; - check_Phi = false; - check_R = false; - check_beta = false; - - } // end test for adding a module - - - } // end while for reading block - } // end while for reading file - - cout << endl << "/////////////////////////////" << endl<<endl; -} //////////////////////////////////////////////////////////////////////////////// void TNanaPhysics::ReadCalibrationFile(string Path){ diff --git a/NPLib/Detectors/Nana/TNanaPhysics.h b/NPLib/Detectors/Nana/TNanaPhysics.h index 3e9b6dc19f7cc4253c7be527459c8bf407746403..2a03bf7de09c41bca2c8a2c5cb4a9feec277abb9 100644 --- a/NPLib/Detectors/Nana/TNanaPhysics.h +++ b/NPLib/Detectors/Nana/TNanaPhysics.h @@ -31,7 +31,7 @@ using namespace std ; // NPL #include "NPVDetector.h" #include "TNanaData.h" - +#include "NPInputParser.h" // Root #include "TObject.h" #include "TVector3.h" @@ -51,7 +51,7 @@ class TNanaPhysics : public TObject, public NPL::VDetector{ // Innherited from VDetector Class // ///////////////////////////////////// // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Read stream at CalibFile and pick-up calibration parameter using Token // If argument is "Simulation" no change calibration is loaded diff --git a/NPLib/Detectors/NeutronWall/TNeutronWallPhysics.cxx b/NPLib/Detectors/NeutronWall/TNeutronWallPhysics.cxx index f323ef1ce3fa9796427e2990de6cfab3b2db43eb..437525590dc63cdea8ec222e8ec66269c2b9f493 100644 --- a/NPLib/Detectors/NeutronWall/TNeutronWallPhysics.cxx +++ b/NPLib/Detectors/NeutronWall/TNeutronWallPhysics.cxx @@ -1,18 +1,18 @@ /***************************************************************************** - * Copyright (C) 2009-2016 this file is part of the NPTool Project * + * Copyright (C) 2009-2016 this file is part of the NPTool Project * * * * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * * For the list of contributors see $NPTOOL/Licence/Contributors * *****************************************************************************/ /***************************************************************************** - * Original Author: Pierre Morfouace contact address: morfouac@nscl.msu.edu * + * Original Author: Pierre Morfouace contact address: morfouac@nscl.msu.edu * * * - * Creation Date : June 2016 * + * Creation Date : June 2016 * * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class hold NeutronWall Treated data * + * This class hold NeutronWall Treated data * * * *---------------------------------------------------------------------------* * Comment: * @@ -34,6 +34,7 @@ using namespace std; #include "RootInput.h" #include "RootOutput.h" #include "NPDetectorFactory.h" +#include "NPOptionManager.h" // ROOT #include "TChain.h" @@ -41,515 +42,337 @@ using namespace std; ClassImp(TNeutronWallPhysics) -/////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// TNeutronWallPhysics::TNeutronWallPhysics() -: m_EventData(new TNeutronWallData), -m_PreTreatedData(new TNeutronWallData), -m_EventPhysics(this), -m_Spectra(0), -m_E_RAW_Threshold(0), // adc channels -m_E_Threshold(0), // MeV -m_NumberOfDetectors(0) { -} + : m_EventData(new TNeutronWallData), + m_PreTreatedData(new TNeutronWallData), + m_EventPhysics(this), + m_Spectra(0), + m_E_RAW_Threshold(0), // adc channels + m_E_Threshold(0), // MeV + m_NumberOfDetectors(0) { + } /////////////////////////////////////////////////////////////////////////// void TNeutronWallPhysics::BuildSimplePhysicalEvent() { - BuildPhysicalEvent(); + BuildPhysicalEvent(); } /////////////////////////////////////////////////////////////////////////// void TNeutronWallPhysics::BuildPhysicalEvent() { - // apply thresholds and calibration - PreTreat(); - - // Neutron Wall - for (UShort_t e = 0; e < m_PreTreatedData->GetMultEnergy(); e++) { - if (m_PreTreatedData->GetE_DetectorNbr(e) == m_PreTreatedData->GetT_DetectorNbr(e)) { - DetectorNumber.push_back(m_PreTreatedData->GetE_DetectorNbr(e)); - NW_PadNumber.push_back(m_PreTreatedData->GetE_PadNbr(e)); - NW_Energy.push_back(m_PreTreatedData->Get_Energy(e)); - NW_Time.push_back(m_PreTreatedData->Get_Time(e)); - - NW_PosX.push_back(m_PreTreatedData->Get_NeutronWall_PosX(e)); - NW_PosY.push_back(m_PreTreatedData->Get_NeutronWall_PosY(e)); - NW_PosZ.push_back(m_PreTreatedData->Get_NeutronWall_PosZ(e)); - } + // apply thresholds and calibration + PreTreat(); + + // Neutron Wall + for (UShort_t e = 0; e < m_PreTreatedData->GetMultEnergy(); e++) { + if (m_PreTreatedData->GetE_DetectorNbr(e) == m_PreTreatedData->GetT_DetectorNbr(e)) { + DetectorNumber.push_back(m_PreTreatedData->GetE_DetectorNbr(e)); + NW_PadNumber.push_back(m_PreTreatedData->GetE_PadNbr(e)); + NW_Energy.push_back(m_PreTreatedData->Get_Energy(e)); + NW_Time.push_back(m_PreTreatedData->Get_Time(e)); + + NW_PosX.push_back(m_PreTreatedData->Get_NeutronWall_PosX(e)); + NW_PosY.push_back(m_PreTreatedData->Get_NeutronWall_PosY(e)); + NW_PosZ.push_back(m_PreTreatedData->Get_NeutronWall_PosZ(e)); } - - - // Veto Wall - for (UShort_t e = 0; e < m_PreTreatedData->GetVetoMultEnergy(); e++) { - if (m_PreTreatedData->GetE_VetoDetectorNbr(e) == m_PreTreatedData->GetT_VetoDetectorNbr(e)) { - VW_PadNumber.push_back(m_PreTreatedData->GetE_VetoPadNbr(e)); - VW_Energy.push_back(m_PreTreatedData->Get_VetoEnergy(e)); - VW_Time.push_back(m_PreTreatedData->Get_VetoTime(e)); - - VW_PosX.push_back(m_PreTreatedData->Get_VetoWall_PosX(e)); - VW_PosY.push_back(m_PreTreatedData->Get_VetoWall_PosY(e)); - VW_PosZ.push_back(m_PreTreatedData->Get_VetoWall_PosZ(e)); - } + } + + + // Veto Wall + for (UShort_t e = 0; e < m_PreTreatedData->GetVetoMultEnergy(); e++) { + if (m_PreTreatedData->GetE_VetoDetectorNbr(e) == m_PreTreatedData->GetT_VetoDetectorNbr(e)) { + VW_PadNumber.push_back(m_PreTreatedData->GetE_VetoPadNbr(e)); + VW_Energy.push_back(m_PreTreatedData->Get_VetoEnergy(e)); + VW_Time.push_back(m_PreTreatedData->Get_VetoTime(e)); + + VW_PosX.push_back(m_PreTreatedData->Get_VetoWall_PosX(e)); + VW_PosY.push_back(m_PreTreatedData->Get_VetoWall_PosY(e)); + VW_PosZ.push_back(m_PreTreatedData->Get_VetoWall_PosZ(e)); } - + } + } /////////////////////////////////////////////////////////////////////////// void TNeutronWallPhysics::PreTreat() { - // This method typically applies thresholds and calibrations - // Might test for disabled channels for more complex detector - - // clear pre-treated object - ClearPreTreatedData(); - - // instantiate CalibrationManager - static CalibrationManager* Cal = CalibrationManager::getInstance(); - - // Neutron Wall - // Energy - for (UShort_t i = 0; i < m_EventData->GetMultEnergy(); ++i) { - if (m_EventData->Get_Energy(i) > m_E_RAW_Threshold) { - Double_t EnergyNW = Cal->ApplyCalibration("NeutronWall/ENERGY"+NPL::itoa(m_EventData->GetE_DetectorNbr(i)),m_EventData->Get_Energy(i)); - if (EnergyNW > m_E_Threshold) { - m_PreTreatedData->SetEnergy(m_EventData->GetE_DetectorNbr(i),m_EventData->GetE_PadNbr(i), EnergyNW); - } - } - } - // Time - for (UShort_t i = 0; i < m_EventData->GetMultTime(); ++i) { - Double_t TimeNW= Cal->ApplyCalibration("NeutronWall/TIME"+NPL::itoa(m_EventData->GetT_DetectorNbr(i)),m_EventData->Get_Time(i)); - m_PreTreatedData->SetTime(m_EventData->GetT_DetectorNbr(i),m_EventData->GetT_PadNbr(i), TimeNW); + // This method typically applies thresholds and calibrations + // Might test for disabled channels for more complex detector + + // clear pre-treated object + ClearPreTreatedData(); + + // instantiate CalibrationManager + static CalibrationManager* Cal = CalibrationManager::getInstance(); + + // Neutron Wall + // Energy + for (UShort_t i = 0; i < m_EventData->GetMultEnergy(); ++i) { + if (m_EventData->Get_Energy(i) > m_E_RAW_Threshold) { + Double_t EnergyNW = Cal->ApplyCalibration("NeutronWall/ENERGY"+NPL::itoa(m_EventData->GetE_DetectorNbr(i)),m_EventData->Get_Energy(i)); + if (EnergyNW > m_E_Threshold) { + m_PreTreatedData->SetEnergy(m_EventData->GetE_DetectorNbr(i),m_EventData->GetE_PadNbr(i), EnergyNW); + } } - // Position - for(UShort_t i = 0; i < m_EventData->GetMult_NeutronWall_Position(); ++i){ - m_PreTreatedData->Set_NeutronWall_PosX(m_EventData->Get_NeutronWall_PosX(i)); - m_PreTreatedData->Set_NeutronWall_PosY(m_EventData->Get_NeutronWall_PosY(i)); - m_PreTreatedData->Set_NeutronWall_PosZ(m_EventData->Get_NeutronWall_PosZ(i)); - } - - - // Veto Wall - // Energy - for (UShort_t i = 0; i < m_EventData->GetVetoMultEnergy(); ++i) { - if (m_EventData->Get_VetoEnergy(i) > m_E_RAW_Threshold) { - Double_t EnergyVW = Cal->ApplyCalibration("VetoWall/ENERGY"+NPL::itoa(m_EventData->GetE_VetoPadNbr(i)),m_EventData->Get_VetoEnergy(i)); - - if (EnergyVW > m_E_Threshold) { - m_PreTreatedData->SetVetoEnergy(m_EventData->GetE_VetoDetectorNbr(i),m_EventData->GetE_VetoPadNbr(i), EnergyVW); - } - } - } - //Time - for (UShort_t i = 0; i < m_EventData->GetVetoMultTime(); ++i) { - Double_t TimeVW= Cal->ApplyCalibration("VetoWall/TIME"+NPL::itoa(m_EventData->GetT_VetoPadNbr(i)),m_EventData->Get_VetoTime(i)); - m_PreTreatedData->SetVetoTime(m_EventData->GetT_VetoDetectorNbr(i),m_EventData->GetT_VetoPadNbr(i), TimeVW); - } - // Position - for(UShort_t i = 0; i < m_EventData->GetMult_VetoWall_Position(); ++i){ - m_PreTreatedData->Set_VetoWall_PosX(m_EventData->Get_VetoWall_PosX(i)); - m_PreTreatedData->Set_VetoWall_PosY(m_EventData->Get_VetoWall_PosY(i)); - m_PreTreatedData->Set_VetoWall_PosZ(m_EventData->Get_VetoWall_PosZ(i)); + } + // Time + for (UShort_t i = 0; i < m_EventData->GetMultTime(); ++i) { + Double_t TimeNW= Cal->ApplyCalibration("NeutronWall/TIME"+NPL::itoa(m_EventData->GetT_DetectorNbr(i)),m_EventData->Get_Time(i)); + m_PreTreatedData->SetTime(m_EventData->GetT_DetectorNbr(i),m_EventData->GetT_PadNbr(i), TimeNW); + } + // Position + for(UShort_t i = 0; i < m_EventData->GetMult_NeutronWall_Position(); ++i){ + m_PreTreatedData->Set_NeutronWall_PosX(m_EventData->Get_NeutronWall_PosX(i)); + m_PreTreatedData->Set_NeutronWall_PosY(m_EventData->Get_NeutronWall_PosY(i)); + m_PreTreatedData->Set_NeutronWall_PosZ(m_EventData->Get_NeutronWall_PosZ(i)); + } + + + // Veto Wall + // Energy + for (UShort_t i = 0; i < m_EventData->GetVetoMultEnergy(); ++i) { + if (m_EventData->Get_VetoEnergy(i) > m_E_RAW_Threshold) { + Double_t EnergyVW = Cal->ApplyCalibration("VetoWall/ENERGY"+NPL::itoa(m_EventData->GetE_VetoPadNbr(i)),m_EventData->Get_VetoEnergy(i)); + + if (EnergyVW > m_E_Threshold) { + m_PreTreatedData->SetVetoEnergy(m_EventData->GetE_VetoDetectorNbr(i),m_EventData->GetE_VetoPadNbr(i), EnergyVW); + } } + } + //Time + for (UShort_t i = 0; i < m_EventData->GetVetoMultTime(); ++i) { + Double_t TimeVW= Cal->ApplyCalibration("VetoWall/TIME"+NPL::itoa(m_EventData->GetT_VetoPadNbr(i)),m_EventData->Get_VetoTime(i)); + m_PreTreatedData->SetVetoTime(m_EventData->GetT_VetoDetectorNbr(i),m_EventData->GetT_VetoPadNbr(i), TimeVW); + } + // Position + for(UShort_t i = 0; i < m_EventData->GetMult_VetoWall_Position(); ++i){ + m_PreTreatedData->Set_VetoWall_PosX(m_EventData->Get_VetoWall_PosX(i)); + m_PreTreatedData->Set_VetoWall_PosY(m_EventData->Get_VetoWall_PosY(i)); + m_PreTreatedData->Set_VetoWall_PosZ(m_EventData->Get_VetoWall_PosZ(i)); + } + + + + + + - - - - - - } /////////////////////////////////////////////////////////////////////////// -void TNeutronWallPhysics::ReadConfiguration(string Path) { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double Theta = 0 , Phi = 0 , R = 0 ; - double X = 0 , Y = 0 , Z = 0 ; - double Rot =0; - int Bars = 0; - double VWDistance = 0.0; - int VetoWall = 0; - double Overlap = 3; - string NWMaterial; - string VWMaterial; - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool check_rotation = false ; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - bool ReadingStatus = false ; - bool check_Bars = false ; - bool check_NWMaterial = false ; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Start Up NeutronWall bloc, Reading toggle to true - string name = "NeutronWall"; - - if (LineBuffer.compare(0, name.length(), name) == 0) { - cout << "///" << endl ; - cout << "NeutronWall found: " << endl ; - ReadingStatus = true ; - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, name.length(),name) == 0) { - cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << endl ; - ReadingStatus = false ; - } - - //Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta ; - cout << "Theta: " << Theta << endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi; - cout << "Phi: " << Phi << endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R ; - cout << "R: " << R << endl; - } - - //Position method - else if (DataBuffer.compare(0, 2, "X=") == 0) { - check_X = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - X = X ; - cout << "X: " << X << endl; - } - - else if (DataBuffer.compare(0, 2, "Y=") == 0) { - check_Y = true; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - Y = Y ; - cout << "Y: " << Y << endl; - } - - else if (DataBuffer.compare(0, 2, "Z=") == 0) { - check_Z = true; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - Z = Z ; - cout << "Z: " << Z << endl; - } - - - //General - else if (DataBuffer.compare(0, 4, "Rot=") == 0) { - check_rotation = true; - ConfigFile >> DataBuffer ; - Rot = atof(DataBuffer.c_str()); - Rot = Rot ; - cout << "Rotation: " << Rot << endl; - } - - //Bar number - else if (DataBuffer.compare(0, 5, "BARS=") == 0){ - check_Bars = true; - ConfigFile >> DataBuffer ; - Bars = atoi(DataBuffer.c_str()) ; - cout << "Bars: " << Bars << endl; - } - - - //Material type - else if (DataBuffer.compare(0, 11, "NWMATERIAL=") == 0){ - check_NWMaterial = true; - ConfigFile >> DataBuffer ; - NWMaterial = DataBuffer; - cout << "NWMaterials: " << NWMaterial << endl; - } - - //Distance - else if (DataBuffer.compare(0, 11, "VWDISTANCE=") == 0){ - //check_VWDistance = true; - ConfigFile >> DataBuffer ; - VWDistance = atof(DataBuffer.c_str()); - VWDistance = VWDistance; - cout << "VWDistance: " << VWDistance << endl; - } - - //Decide whether to add the vetowall or not, 1 means yes, 0 means no - else if (DataBuffer.compare(0, 9, "VETOWALL=") == 0){ - //check_VetoWall = true; - ConfigFile >> DataBuffer ; - VetoWall = atoi(DataBuffer.c_str()); - cout << "VetoWall: " << VetoWall << endl; - } - - //VetoWall Material - else if (DataBuffer.compare(0, 11, "VWMATERIAL=") == 0){ - //check_VWMaterial = true; - ConfigFile >> DataBuffer ; - VWMaterial = DataBuffer ; - cout << "VWMaterial: " << VWMaterial << endl; - } - - //Overlap - else if (DataBuffer.compare(0, 8, "OVERLAP=") == 0){ - ConfigFile >> DataBuffer ; - Overlap = atof(DataBuffer.c_str()); - Overlap = Overlap; - cout << "Overlap: " << Overlap << endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; - cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (( check_Theta && check_Phi && check_R && check_Bars && check_NWMaterial) - || - ( check_X && check_Y && check_Z && check_rotation && check_Bars && check_NWMaterial)){ - - - // Convert Cartesian to Spherical (detector always face the target) - if (check_X){ - R = sqrt (X*X+Y*Y+Z*Z); - Theta = acos(Z / (R) ); - Phi = atan2(Y,X); - } - - - - // Reinitialisation of Check Boolean - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_rotation = false ; - check_X = false ; - check_Y = false ; - check_Z = false ; - ReadingStatus = false ; - check_Bars = false ; - check_NWMaterial = false ; - cout << "///"<< endl ; - } - } +void TNeutronWallPhysics::ReadConfiguration(NPL::InputParser parser) { + + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("NeutronWall"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> token = {"R","THETA","PHI","BARS","VETOWALL","VWDISTANCE","NWMATERIAL","OVERLAP"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Neutron Wall " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + int Bars = blocks[i]->GetInt("BARS"); + int VetoWall = blocks[i]->GetInt("VETOWALL"); + double VWDistance = blocks[i]->GetDouble("VWDISTANCE","mm"); + string NWMaterial = blocks[i]->GetString("NWMATERIAL"); + int Overlap = blocks[i]->GetInt("OVERLAP"); } - + + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } + + ReadAnalysisConfig(); } /////////////////////////////////////////////////////////////////////////// void TNeutronWallPhysics::Clear() { - DetectorNumber.clear(); - NW_PadNumber.clear(); - NW_Energy.clear(); - NW_Time.clear(); - VW_PadNumber.clear(); - VW_Energy.clear(); - VW_Time.clear(); - - NW_PosX.clear(); - NW_PosY.clear(); - NW_PosZ.clear(); - VW_PosX.clear(); - VW_PosY.clear(); - VW_PosZ.clear(); + DetectorNumber.clear(); + NW_PadNumber.clear(); + NW_Energy.clear(); + NW_Time.clear(); + VW_PadNumber.clear(); + VW_Energy.clear(); + VW_Time.clear(); + + NW_PosX.clear(); + NW_PosY.clear(); + NW_PosZ.clear(); + VW_PosX.clear(); + VW_PosY.clear(); + VW_PosZ.clear(); } /////////////////////////////////////////////////////////////////////////// void TNeutronWallPhysics::ReadAnalysisConfig() { - bool ReadingStatus = false; - - // path to file - string FileName = "./configs/ConfigNeutronWall.dat"; - - // open analysis config file - ifstream AnalysisConfigFile; - AnalysisConfigFile.open(FileName.c_str()); - - if (!AnalysisConfigFile.is_open()) { - cout << " No ConfigNeutronWall.dat found: Default parameter loaded for Analayis " << FileName << endl; - return; - } - cout << " Loading user parameter for Analysis from ConfigNeutronWall.dat " << endl; - - // Save it in a TAsciiFile - TAsciiFile* asciiConfig = RootOutput::getInstance()->GetAsciiFileAnalysisConfig(); - asciiConfig->AppendLine("%%% ConfigNeutronWall.dat %%%"); - asciiConfig->Append(FileName.c_str()); - asciiConfig->AppendLine(""); - // read analysis config file - string LineBuffer,DataBuffer,whatToDo; - while (!AnalysisConfigFile.eof()) { - // Pick-up next line - getline(AnalysisConfigFile, LineBuffer); - - // search for "header" - string name = "ConfigNeutronWall"; - if (LineBuffer.compare(0, name.length(), name) == 0) - ReadingStatus = true; - - // loop on tokens and data - while (ReadingStatus ) { - whatToDo=""; - AnalysisConfigFile >> whatToDo; - - // Search for comment symbol (%) - if (whatToDo.compare(0, 1, "%") == 0) { - AnalysisConfigFile.ignore(numeric_limits<streamsize>::max(), '\n' ); - } - - else if (whatToDo=="E_RAW_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_E_RAW_Threshold = atof(DataBuffer.c_str()); - cout << whatToDo << " " << m_E_RAW_Threshold << endl; - } - - else if (whatToDo=="E_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_E_Threshold = atof(DataBuffer.c_str()); - cout << whatToDo << " " << m_E_Threshold << endl; - } - - else { - ReadingStatus = false; - } - } + bool ReadingStatus = false; + + // path to file + string FileName = "./configs/ConfigNeutronWall.dat"; + + // open analysis config file + ifstream AnalysisConfigFile; + AnalysisConfigFile.open(FileName.c_str()); + + if (!AnalysisConfigFile.is_open()) { + cout << " No ConfigNeutronWall.dat found: Default parameter loaded for Analayis " << FileName << endl; + return; + } + cout << " Loading user parameter for Analysis from ConfigNeutronWall.dat " << endl; + + // Save it in a TAsciiFile + TAsciiFile* asciiConfig = RootOutput::getInstance()->GetAsciiFileAnalysisConfig(); + asciiConfig->AppendLine("%%% ConfigNeutronWall.dat %%%"); + asciiConfig->Append(FileName.c_str()); + asciiConfig->AppendLine(""); + // read analysis config file + string LineBuffer,DataBuffer,whatToDo; + while (!AnalysisConfigFile.eof()) { + // Pick-up next line + getline(AnalysisConfigFile, LineBuffer); + + // search for "header" + string name = "ConfigNeutronWall"; + if (LineBuffer.compare(0, name.length(), name) == 0) + ReadingStatus = true; + + // loop on tokens and data + while (ReadingStatus ) { + whatToDo=""; + AnalysisConfigFile >> whatToDo; + + // Search for comment symbol (%) + if (whatToDo.compare(0, 1, "%") == 0) { + AnalysisConfigFile.ignore(numeric_limits<streamsize>::max(), '\n' ); + } + + else if (whatToDo=="E_RAW_THRESHOLD") { + AnalysisConfigFile >> DataBuffer; + m_E_RAW_Threshold = atof(DataBuffer.c_str()); + cout << whatToDo << " " << m_E_RAW_Threshold << endl; + } + + else if (whatToDo=="E_THRESHOLD") { + AnalysisConfigFile >> DataBuffer; + m_E_Threshold = atof(DataBuffer.c_str()); + cout << whatToDo << " " << m_E_Threshold << endl; + } + + else { + ReadingStatus = false; + } } + } } /////////////////////////////////////////////////////////////////////////// void TNeutronWallPhysics::InitSpectra() { - m_Spectra = new TNeutronWallSpectra(m_NumberOfDetectors); + m_Spectra = new TNeutronWallSpectra(m_NumberOfDetectors); } /////////////////////////////////////////////////////////////////////////// void TNeutronWallPhysics::FillSpectra() { - m_Spectra -> FillRawSpectra(m_EventData); - m_Spectra -> FillPreTreatedSpectra(m_PreTreatedData); - m_Spectra -> FillPhysicsSpectra(m_EventPhysics); + m_Spectra -> FillRawSpectra(m_EventData); + m_Spectra -> FillPreTreatedSpectra(m_PreTreatedData); + m_Spectra -> FillPhysicsSpectra(m_EventPhysics); } /////////////////////////////////////////////////////////////////////////// void TNeutronWallPhysics::CheckSpectra() { - m_Spectra->CheckSpectra(); + m_Spectra->CheckSpectra(); } /////////////////////////////////////////////////////////////////////////// void TNeutronWallPhysics::ClearSpectra() { - // To be done + // To be done } /////////////////////////////////////////////////////////////////////////// map< string , TH1*> TNeutronWallPhysics::GetSpectra() { - if(m_Spectra) - return m_Spectra->GetMapHisto(); - else{ - map< string , TH1*> empty; - return empty; - } + if(m_Spectra) + return m_Spectra->GetMapHisto(); + else{ + map< string , TH1*> empty; + return empty; + } } //////////////////////////////////////////////////////////////////////////////// vector<TCanvas*> TNeutronWallPhysics::GetCanvas() { - if(m_Spectra) - return m_Spectra->GetCanvas(); - else{ - vector<TCanvas*> empty; - return empty; - } + if(m_Spectra) + return m_Spectra->GetCanvas(); + else{ + vector<TCanvas*> empty; + return empty; + } } /////////////////////////////////////////////////////////////////////////// void TNeutronWallPhysics::WriteSpectra() { - m_Spectra->WriteSpectra(); + m_Spectra->WriteSpectra(); } /////////////////////////////////////////////////////////////////////////// void TNeutronWallPhysics::AddParameterToCalibrationManager() { - CalibrationManager* Cal = CalibrationManager::getInstance(); - for (int i = 0; i < m_NumberOfDetectors; ++i) { - Cal->AddParameter("NeutronWall", "D"+ NPL::itoa(i+1)+"_ENERGY","NeutronWall_D"+ NPL::itoa(i+1)+"_ENERGY"); - Cal->AddParameter("NeutronWall", "D"+ NPL::itoa(i+1)+"_TIME","NeutronWall_D"+ NPL::itoa(i+1)+"_TIME"); - } + CalibrationManager* Cal = CalibrationManager::getInstance(); + for (int i = 0; i < m_NumberOfDetectors; ++i) { + Cal->AddParameter("NeutronWall", "D"+ NPL::itoa(i+1)+"_ENERGY","NeutronWall_D"+ NPL::itoa(i+1)+"_ENERGY"); + Cal->AddParameter("NeutronWall", "D"+ NPL::itoa(i+1)+"_TIME","NeutronWall_D"+ NPL::itoa(i+1)+"_TIME"); + } } /////////////////////////////////////////////////////////////////////////// void TNeutronWallPhysics::InitializeRootInputRaw() { - TChain* inputChain = RootInput::getInstance()->GetChain(); - inputChain->SetBranchStatus("NeutronWall", true ); - inputChain->SetBranchAddress("NeutronWall", &m_EventData ); + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus("NeutronWall", true ); + inputChain->SetBranchAddress("NeutronWall", &m_EventData ); } /////////////////////////////////////////////////////////////////////////// void TNeutronWallPhysics::InitializeRootInputPhysics() { - TChain* inputChain = RootInput::getInstance()->GetChain(); - inputChain->SetBranchAddress("NeutronWall", &m_EventPhysics); + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchAddress("NeutronWall", &m_EventPhysics); } /////////////////////////////////////////////////////////////////////////// void TNeutronWallPhysics::InitializeRootOutput() { - TTree* outputTree = RootOutput::getInstance()->GetTree(); - outputTree->Branch("NeutronWall", "TNeutronWallPhysics", &m_EventPhysics); + TTree* outputTree = RootOutput::getInstance()->GetTree(); + outputTree->Branch("NeutronWall", "TNeutronWallPhysics", &m_EventPhysics); } @@ -558,7 +381,7 @@ void TNeutronWallPhysics::InitializeRootOutput() { // Construct Method to be pass to the DetectorFactory // //////////////////////////////////////////////////////////////////////////////// NPL::VDetector* TNeutronWallPhysics::Construct() { - return (NPL::VDetector*) new TNeutronWallPhysics(); + return (NPL::VDetector*) new TNeutronWallPhysics(); } @@ -567,14 +390,14 @@ NPL::VDetector* TNeutronWallPhysics::Construct() { // Registering the construct method to the factory // //////////////////////////////////////////////////////////////////////////////// extern "C"{ - class proxy_NeutronWall{ - public: - proxy_NeutronWall(){ - NPL::DetectorFactory::getInstance()->AddToken("NeutronWall","NeutronWall"); - NPL::DetectorFactory::getInstance()->AddDetector("NeutronWall",TNeutronWallPhysics::Construct); - } - }; - - proxy_NeutronWall p_NeutronWall; +class proxy_NeutronWall{ + public: + proxy_NeutronWall(){ + NPL::DetectorFactory::getInstance()->AddToken("NeutronWall","NeutronWall"); + NPL::DetectorFactory::getInstance()->AddDetector("NeutronWall",TNeutronWallPhysics::Construct); + } +}; + +proxy_NeutronWall p_NeutronWall; } diff --git a/NPLib/Detectors/NeutronWall/TNeutronWallPhysics.h b/NPLib/Detectors/NeutronWall/TNeutronWallPhysics.h index a60bcaa4442aa754638e988f128ef01f4dd468f2..961f4d3966d271d23f9bd61acaf41f1144a208a3 100644 --- a/NPLib/Detectors/NeutronWall/TNeutronWallPhysics.h +++ b/NPLib/Detectors/NeutronWall/TNeutronWallPhysics.h @@ -38,7 +38,7 @@ using namespace std; #include "TNeutronWallSpectra.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" - +#include "NPInputParser.h" // forward declaration class TNeutronWallSpectra; @@ -82,7 +82,7 @@ class TNeutronWallPhysics : public TObject, public NPL::VDetector { // methods inherited from the VDetector ABC class public: // read stream from ConfigFile to pick-up detector parameters - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // add parameters to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/Detectors/Paris/TParisPhysics.cxx b/NPLib/Detectors/Paris/TParisPhysics.cxx index 5675ff15c69dd07c383e38a6bda2cffd9d05bbfe..3cda5ae8d8c06a7de40ab8ba642ef2cc11643611 100644 --- a/NPLib/Detectors/Paris/TParisPhysics.cxx +++ b/NPLib/Detectors/Paris/TParisPhysics.cxx @@ -26,7 +26,7 @@ #include "RootInput.h" #include "NPDetectorFactory.h" #include "RootOutput.h" - +#include "NPOptionManager.h" // STL #include <vector> #include <iostream> @@ -153,359 +153,41 @@ void TParisPhysics::Clear(){ } //////////////////////////////////////////////////////////////////////////////// -void TParisPhysics::ReadConfiguration(string Path) { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, Az, Bz, Cz, Dz; - TVector3 A, B, C, D; - double Theta = 0, Phi = 0, R = 0, beta_u = 0 , beta_v = 0 , beta_w = 0; - - bool check_A = false; - bool check_C = false; - bool check_B = false; - bool check_D = false; - - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; - bool check_beta = false; - - bool ReadingStatus = false; - - bool isCluster = false; - bool isPhoswich = false; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Paris bloc, reading toggle to true - // and toggle to true flags indicating which shape is treated. - if (LineBuffer.compare(0, 12, "ParisCluster") == 0 || - LineBuffer.compare(0, 13, "ParisPhoswish") == 0 ) { - cout << "///////////////////////" << endl; - cout << "Module found:" << endl; - - if (LineBuffer.compare(0, 12, "ParisCluster") == 0) isCluster = true; - if (LineBuffer.compare(0, 13, "ParisPhoswich") == 0) isPhoswich = true; - ReadingStatus = true; +void TParisPhysics::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("ParisCluster"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> cart = {"A","B","C","D"}; + vector<string> sphe = {"R","THETA","PHI","BETA"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// ParisCluster " << i+1 << endl; + TVector3 A = blocks[i]->GetTVector3("A","mm"); + TVector3 B = blocks[i]->GetTVector3("B","mm"); + TVector3 C = blocks[i]->GetTVector3("C","mm"); + TVector3 D = blocks[i]->GetTVector3("D","mm"); + + AddDetector(A,B,C,D); + } + else if(blocks[i]->HasTokenList(sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// ParisCluster " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> Beta = blocks[i]->GetVectorDouble("BETA","deg"); + + AddDetector(R,Theta,Phi,Beta[0],Beta[1],Beta[2]); + } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } - // Else don't toggle to Reading Block Status - else ReadingStatus = false; - - // Reading Block - while (ReadingStatus) { - if (isCluster) { // square shape - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n' ); - } - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 12, "ParisCluster") == 0) { - cout << "WARNING: Another Module is find before standard sequence of Token, Error may occured in Telecope definition" << endl; - ReadingStatus = false; - } - - // Position method - else if (DataBuffer=="A=") { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az ; - - A = TVector3(Ax, Ay, Az); - cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; - } - else if (DataBuffer=="B=") { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz ; - - B = TVector3(Bx, By, Bz); - cout << "X128 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; - } - else if (DataBuffer=="C=") { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz ; - - C = TVector3(Cx, Cy, Cz); - cout << "X1 Y128 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; - } - else if (DataBuffer=="D=") { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz ; - - D = TVector3(Dx, Dy, Dz); - cout << "X128 Y128 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; - } // End Position Method - - // Angle method - else if (DataBuffer== "Theta="){ - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta ; - cout << "Theta: " << Theta << endl; - } - else if (DataBuffer == "Phi=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi ; - cout << "Phi: " << Phi << endl; - } - else if (DataBuffer =="R="){ - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R ; - cout << "R: " << R << endl; - } - else if (DataBuffer=="beta=") { - check_beta = true; - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w ; - cout << "Beta: " << beta_u << " " << beta_v << " " << beta_w << endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) { - ReadingStatus = false; - - // Add The previously define telescope - // With position method - if ( check_A && check_B && check_C && check_D ) { - AddModuleSquare(A , - B , - C , - D ) ; - } - - // with angle method - else if ( check_Theta && check_Phi && check_R && check_beta ) { - AddModuleSquare(Theta , - Phi , - R , - beta_u , - beta_v , - beta_w ); - } - - // reset boolean flag for point positioning - check_A = false; - check_B = false; - check_C = false; - check_D = false; - - // reset boolean flag for angle positioning - check_Theta = false; - check_Phi = false; - check_R = false; - check_beta = false; - - // reset boolean flag for shape determination - isCluster = false; - isPhoswich = false; - } // end test for adding a module - } // end test for ParisCluster shape - - else if (isPhoswich) { // ParisPhoswich shape - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n' ); - } - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 13, "ParisPhoswich") == 0) { - cout << "WARNING: Another Module is find before standard sequence of Token, Error may occured in Telecope definition" << endl; - ReadingStatus = false; - } - - // Position method - else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az ; - - A = TVector3(Ax, Ay, Az); - cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz ; - - B = TVector3(Bx, By, Bz); - cout << "X128 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz ; - - C = TVector3(Cx, Cy, Cz); - cout << "X1 Y128 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; - } - else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz ; - - D = TVector3(Dx, Dy, Dz); - cout << "X128 Y128 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; - } // End Position Method - - // Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta ; - cout << "Theta: " << Theta << endl; - } - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi ; - cout << "Phi: " << Phi << endl; - } - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R ; - cout << "R: " << R << endl; - } - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - check_beta = true; - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w ; - cout << "Beta: " << beta_u << " " << beta_v << " " << beta_w << endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) { - ReadingStatus = false; - - // Add The previously define telescope - // With position method - if ( check_A && check_B && check_C && check_D ) { - AddModuleDummyShape(A , - B , - C , - D ) ; - } - - // with angle method - else if ( check_Theta && check_Phi && check_R && check_beta ) { - AddModuleDummyShape(Theta, - Phi, - R, - beta_u, - beta_v, - beta_w); - } - - // reset boolean flag for point positioning - check_A = false; - check_B = false; - check_C = false; - check_D = false; - - // reset boolean flag for angle positioning - check_Theta = false; - check_Phi = false; - check_R = false; - check_beta = false; - - // reset boolean flag for shape determination - isPhoswich = false; - isCluster = false; - } // end test for adding a module - } // end test for ParisPhoswich shape - - - } // end while for reading block - } // end while for reading file - - cout << endl << "/////////////////////////////" << endl<<endl; + } + } //////////////////////////////////////////////////////////////////////////////// @@ -722,7 +404,7 @@ void TParisPhysics::AddModuleSquare(double theta, } //////////////////////////////////////////////////////////////////////////////// -void TParisPhysics::AddModuleDummyShape(TVector3 C_X1_Y1, +void TParisPhysics::AddDetector(TVector3 C_X1_Y1, TVector3 C_X128_Y1, TVector3 C_X1_Y128, TVector3 C_X128_Y128) @@ -787,7 +469,7 @@ void TParisPhysics::AddModuleDummyShape(TVector3 C_X1_Y1, } //////////////////////////////////////////////////////////////////////////////// -void TParisPhysics::AddModuleDummyShape(double theta, +void TParisPhysics::AddDetector(double theta, double phi, double distance, double beta_u, diff --git a/NPLib/Detectors/Paris/TParisPhysics.h b/NPLib/Detectors/Paris/TParisPhysics.h index b52cb217e2e2e503ca9cff5dc9a35895ad6adfce..5538d363c6398fb329087e873b73134a30906d41 100644 --- a/NPLib/Detectors/Paris/TParisPhysics.h +++ b/NPLib/Detectors/Paris/TParisPhysics.h @@ -31,7 +31,7 @@ using namespace std ; // NPL #include "NPVDetector.h" #include "TParisData.h" - +#include "NPInputParser.h" // Root #include "TObject.h" #include "TVector3.h" @@ -51,7 +51,7 @@ class TParisPhysics : public TObject, public NPL::VDetector{ // Innherited from VDetector Class // ///////////////////////////////////// // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Read stream at CalibFile and pick-up calibration parameter using Token // If argument is "Simulation" no change calibration is loaded @@ -98,13 +98,13 @@ class TParisPhysics : public TObject, public NPL::VDetector{ // Case of a DummyShape module // Add a Module using Corner Coordinate information - void AddModuleDummyShape(TVector3 C_X1_Y1, + void AddDetector(TVector3 C_X1_Y1, TVector3 C_X128_Y1, TVector3 C_X1_Y128, TVector3 C_X128_Y128);//! // Add a Module using R Theta Phi of Si center information - void AddModuleDummyShape(double theta, + void AddDetector(double theta, double phi, double distance, double beta_u, diff --git a/NPLib/Detectors/Plastic/TPlasticPhysics.cxx b/NPLib/Detectors/Plastic/TPlasticPhysics.cxx index 0c6119c8540208a8fdf55e15563d13beaabd836f..0d81c0b3cf6cf87c88182cc529944661582d84a5 100644 --- a/NPLib/Detectors/Plastic/TPlasticPhysics.cxx +++ b/NPLib/Detectors/Plastic/TPlasticPhysics.cxx @@ -25,6 +25,7 @@ #include "RootOutput.h" #include "RootInput.h" #include "NPDetectorFactory.h" +#include "NPOptionManager.h" // STL #include <iostream> @@ -40,262 +41,161 @@ using namespace std; // tranform an integer to a string string itoa(int value) { - char buffer [33]; - sprintf(buffer,"%d",value); - return buffer; + char buffer [33]; + sprintf(buffer,"%d",value); + return buffer; } ClassImp(TPlasticPhysics) -/////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// TPlasticPhysics::TPlasticPhysics() - { - NumberOfDetector = 0 ; - EventData = new TPlasticData ; - EventPhysics = this ; - } - +{ + NumberOfDetector = 0 ; + EventData = new TPlasticData ; + EventPhysics = this ; +} + /////////////////////////////////////////////////////////////////////////// TPlasticPhysics::~TPlasticPhysics() - {} - +{} + /////////////////////////////////////////////////////////////////////////// void TPlasticPhysics::Clear() - { - DetectorNumber.clear() ; - Energy.clear() ; - Time.clear() ; - } - -/////////////////////////////////////////////////////////////////////////// -void TPlasticPhysics::ReadConfiguration(string Path) - { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool check_Thickness = false ; - bool check_Radius = false ; - bool check_LeadThickness = false ; - bool check_Scintillator = false ; - bool check_Height = false ; - bool check_Width = false ; - bool check_Shape = false ; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - bool ReadingStatus = false ; - - while (!ConfigFile.eof()) - { - - getline(ConfigFile, LineBuffer); - - // If line is a Start Up Plastic bloc, Reading toggle to true - if (LineBuffer.compare(0, 7, "Plastic") == 0) - { - cout << "///" << endl ; - cout << "Platic found: " << endl ; - ReadingStatus = true ; - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus) - { - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} +{ + DetectorNumber.clear() ; + Energy.clear() ; + Time.clear() ; +} - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 6, "Plastic") == 0) { - cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << endl ; - ReadingStatus = false ; - } - - //Angle method - else if (DataBuffer=="THETA=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - cout << "Theta: " << atof(DataBuffer.c_str()) << "deg" << endl; - } +/////////////////////////////////////////////////////////////////////////// +void TPlasticPhysics::ReadConfiguration(NPL::InputParser parser) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Plastic"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> cart = {"X","Y","Z"}; + vector<string> sphe = {"R","Theta","Phi"}; + vector<string> square= {"Shape","Height","Width","Thickness","Scintillator","LeadThickness"}; + vector<string> cylind= {"Shape","Radius","Thickness","Scintillator","LeadThickness"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Plastic " << i+1 << endl; + double X = blocks[i]->GetDouble("X","mm"); + double Y = blocks[i]->GetDouble("Y","mm"); + double Z = blocks[i]->GetDouble("Z","mm"); + + if(blocks[i]->HasTokenList(square)){ + string Shape = blocks[i]->GetString("Shape"); + double H = blocks[i]->GetDouble("Height","mm"); + double W = blocks[i]->GetDouble("Width","mm"); + double T = blocks[i]->GetDouble("Thickness","mm"); + string Mat = blocks[i]->GetString("Scintillator"); + double Lead = blocks[i]->GetDouble("LeadThickness","mm"); + } + + else if(blocks[i]->HasTokenList(cylind)){ + string Shape = blocks[i]->GetString("Shape"); + double R = blocks[i]->GetDouble("Radius","mm"); + double T = blocks[i]->GetDouble("Thickness","mm"); + string Mat = blocks[i]->GetString("Scintillator"); + double Lead = blocks[i]->GetDouble("LeadThickness","mm"); + } - else if (DataBuffer=="PHI=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - cout << "Phi: " << atof( DataBuffer.c_str() ) << "deg" << endl; - } + } + else if(blocks[i]->HasTokenList(sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Plastic " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + + if(blocks[i]->HasTokenList(square)){ + string Shape = blocks[i]->GetString("Shape"); + double H = blocks[i]->GetDouble("Height","mm"); + double W = blocks[i]->GetDouble("Width","mm"); + double T = blocks[i]->GetDouble("Thickness","mm"); + string Mat = blocks[i]->GetString("Scintillator"); + double Lead = blocks[i]->GetDouble("LeadThickness","mm"); + } + + else if(blocks[i]->HasTokenList(cylind)){ + string Shape = blocks[i]->GetString("Shape"); + double R = blocks[i]->GetDouble("Radius","mm"); + double T = blocks[i]->GetDouble("Thickness","mm"); + string Mat = blocks[i]->GetString("Scintillator"); + double Lead = blocks[i]->GetDouble("LeadThickness","mm"); + } - else if (DataBuffer=="R=") { - check_R = true; - ConfigFile >> DataBuffer ; - cout << "R: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - //Position method - else if (DataBuffer=="X=") { - check_X = true; - ConfigFile >> DataBuffer ; - cout << "X: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } + } - else if (DataBuffer=="Y=") { - check_Y = true; - ConfigFile >> DataBuffer ; - cout << "Y: " << atof( DataBuffer.c_str() ) << "mm"<< endl; - } - else if (DataBuffer=="Z=") { - check_Z = true; - ConfigFile >> DataBuffer ; - cout << "Z: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - - //General - else if (DataBuffer=="Shape=") { - check_Shape = true; - ConfigFile >> DataBuffer ; - cout << "Shape: " << DataBuffer << endl; - } - - // Cylindrical shape - else if (DataBuffer== "Radius=") { - check_Radius = true; - ConfigFile >> DataBuffer ; - cout << "Plastic Radius: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - // Squared shape - else if (DataBuffer=="Width=") { - check_Width = true; - ConfigFile >> DataBuffer ; - cout << "Plastic Width: " <<atof( DataBuffer.c_str() ) << "mm" << endl; - } - - else if (DataBuffer== "Height=") { - check_Height = true; - ConfigFile >> DataBuffer ; - cout << "Plastic Height: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - // Common - else if (DataBuffer=="Thickness=") { - check_Thickness = true; - ConfigFile >> DataBuffer ; - cout << "Plastic Thickness: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - else if (DataBuffer== "Scintillator=") { - check_Scintillator = true ; - ConfigFile >> DataBuffer ; - cout << "Plastic Scintillator type: " << DataBuffer << endl; - } - - else if (DataBuffer=="LeadThickness=") { - check_LeadThickness = true; - ConfigFile >> DataBuffer ; - cout << "Lead Thickness : " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else - {ReadingStatus = false; cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ;} - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if ( ((check_Theta && check_Phi && check_R) ||( check_X && check_Y && check_Z) )&& check_Thickness && check_LeadThickness && check_Scintillator && (check_Radius || (check_Height && check_Width)) && check_Shape ) - { - NumberOfDetector++; - - // Reinitialisation of Check Boolean - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_Thickness = false ; - check_Radius = false ; - check_LeadThickness = false ; - check_Scintillator = false ; - check_Height = false ; - check_Width = false ; - check_Shape = false ; - check_X = false ; - check_Y = false ; - check_Z = false ; - ReadingStatus = false ; - cout << "///"<< endl ; - } - } - } - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } +} /////////////////////////////////////////////////////////////////////////// void TPlasticPhysics::AddParameterToCalibrationManager() - { - CalibrationManager* Cal = CalibrationManager::getInstance(); - - for(int i = 0 ; i < NumberOfDetector ; i++) - { - for( int j = 0 ; j < 16 ; j++) - { - Cal->AddParameter("Plastic", "Detector"+ NPL::itoa(i+1)+"_E","Plastic_Detector"+ NPL::itoa(i+1)+"_E") ; - Cal->AddParameter("Plastic", "Detector"+ NPL::itoa(i+1)+"_T","Plastic_Detector"+ NPL::itoa(i+1)+"_T") ; - } - - } - } - +{ + CalibrationManager* Cal = CalibrationManager::getInstance(); + + for(int i = 0 ; i < NumberOfDetector ; i++) + { + for( int j = 0 ; j < 16 ; j++) + { + Cal->AddParameter("Plastic", "Detector"+ NPL::itoa(i+1)+"_E","Plastic_Detector"+ NPL::itoa(i+1)+"_E") ; + Cal->AddParameter("Plastic", "Detector"+ NPL::itoa(i+1)+"_T","Plastic_Detector"+ NPL::itoa(i+1)+"_T") ; + } + + } +} + /////////////////////////////////////////////////////////////////////////// void TPlasticPhysics::InitializeRootInputRaw() - { - TChain* inputChain = RootInput::getInstance()->GetChain() ; - inputChain->SetBranchStatus ( "Plastic" , true ) ; - inputChain->SetBranchStatus ( "fPlastic_*" , true ) ; - inputChain->SetBranchAddress( "Plastic" , &EventData ) ; - } +{ + TChain* inputChain = RootInput::getInstance()->GetChain() ; + inputChain->SetBranchStatus ( "Plastic" , true ) ; + inputChain->SetBranchStatus ( "fPlastic_*" , true ) ; + inputChain->SetBranchAddress( "Plastic" , &EventData ) ; +} /////////////////////////////////////////////////////////////////////////// void TPlasticPhysics::InitializeRootInputPhysics() - { - TChain* inputChain = RootInput::getInstance()->GetChain(); - inputChain->SetBranchStatus ( "Plastic", true ); - inputChain->SetBranchStatus ( "DetectorNumber", true ); - inputChain->SetBranchStatus ( "Energy", true ); - inputChain->SetBranchStatus ( "Time", true ); - inputChain->SetBranchAddress( "Plastic", &EventPhysics ); - } +{ + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus ( "Plastic", true ); + inputChain->SetBranchStatus ( "DetectorNumber", true ); + inputChain->SetBranchStatus ( "Energy", true ); + inputChain->SetBranchStatus ( "Time", true ); + inputChain->SetBranchAddress( "Plastic", &EventPhysics ); +} /////////////////////////////////////////////////////////////////////////// void TPlasticPhysics::InitializeRootOutput() - { - TTree* outputTree = RootOutput::getInstance()->GetTree() ; - outputTree->Branch( "Plastic" , "TPlasticPhysics" , &EventPhysics ) ; - } +{ + TTree* outputTree = RootOutput::getInstance()->GetTree() ; + outputTree->Branch( "Plastic" , "TPlasticPhysics" , &EventPhysics ) ; +} /////////////////////////////////////////////////////////////////////////// void TPlasticPhysics::BuildPhysicalEvent() - { - BuildSimplePhysicalEvent() ; - } +{ + BuildSimplePhysicalEvent() ; +} /////////////////////////////////////////////////////////////////////////// void TPlasticPhysics::BuildSimplePhysicalEvent() - { - for(unsigned int i = 0 ; i < EventData->GetEnergyMult() ; i++) - { - DetectorNumber.push_back( EventData->GetPlasticNumber(i) ) ; - Energy.push_back( CalibrationManager::getInstance()->ApplyCalibration("Plastic/Detector" + NPL::itoa( EventData->GetPlasticNumber(i) ) +"_E",EventData->GetEnergy(i) ) ); - Time.push_back( CalibrationManager::getInstance()->ApplyCalibration( "Plastic/Detector" + NPL::itoa( EventData->GetPlasticNumber(i) ) +"_T",EventData->GetTime(i) ) ); - } +{ + for(unsigned int i = 0 ; i < EventData->GetEnergyMult() ; i++) + { + DetectorNumber.push_back( EventData->GetPlasticNumber(i) ) ; + Energy.push_back( CalibrationManager::getInstance()->ApplyCalibration("Plastic/Detector" + NPL::itoa( EventData->GetPlasticNumber(i) ) +"_E",EventData->GetEnergy(i) ) ); + Time.push_back( CalibrationManager::getInstance()->ApplyCalibration( "Plastic/Detector" + NPL::itoa( EventData->GetPlasticNumber(i) ) +"_T",EventData->GetTime(i) ) ); + } - } +} //////////////////////////////////////////////////////////////////////////////// // Construct Method to be pass to the DetectorFactory // diff --git a/NPLib/Detectors/Plastic/TPlasticPhysics.h b/NPLib/Detectors/Plastic/TPlasticPhysics.h index cbc759eba85442199309d55c740709b25b74d927..ee4946518130216e7d1b13a177bf8639bceeeb0e 100644 --- a/NPLib/Detectors/Plastic/TPlasticPhysics.h +++ b/NPLib/Detectors/Plastic/TPlasticPhysics.h @@ -33,9 +33,9 @@ using namespace std ; #include "TPlasticData.h" #include "NPVDetector.h" #include "NPCalibrationManager.h" +#include "NPInputParser.h" -class TPlasticPhysics : public TObject, public NPL::VDetector -{ +class TPlasticPhysics : public TObject, public NPL::VDetector{ public: // Constructor and Destructor TPlasticPhysics(); ~TPlasticPhysics(); @@ -51,7 +51,7 @@ class TPlasticPhysics : public TObject, public NPL::VDetector public: // inherrited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManger diff --git a/NPLib/Detectors/QQQ/TQQQPhysics.cxx b/NPLib/Detectors/QQQ/TQQQPhysics.cxx index 59791d6abb7f5dc06d07c2baacf1e23512f25323..6185f674d432f16a62d2c267c89b593b32281b6a 100644 --- a/NPLib/Detectors/QQQ/TQQQPhysics.cxx +++ b/NPLib/Detectors/QQQ/TQQQPhysics.cxx @@ -24,7 +24,7 @@ #include "RootOutput.h" #include "RootInput.h" #include "NPDetectorFactory.h" - +#include "NPOptionManager.h" // STL #include <iostream> #include <sstream> @@ -65,173 +65,41 @@ void TQQQPhysics::Clear(){ Time .clear() ; } /////////////////////////////////////////////////////////////////////////// -void TQQQPhysics::ReadConfiguration(string Path) { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double TLX , BLX , BRX , TRX , TLY , BLY , BRY , TRY , TLZ , BLZ , BRZ , TRZ ; - double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ; - bool check_A = false ; - bool check_B = false ; - bool check_C = false ; - bool check_D = false ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool check_beta = false ; - bool ReadingStatus = false ; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - // If line is a Start Up QQQ bloc, Reading toggle to true - if (LineBuffer.compare(0, 4, "QQQ") == 0 &&LineBuffer.compare(0, 5, "QQQA") != 0) { - cout << "QQQ found: " << endl ; - ReadingStatus = true ; - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // Finding another telescope (safety), toggle out - else if (DataBuffer=="QQQ") { - cout << "WARNING: Another Telescope is founnd before standard sequence of Token, Error may occured in detector definition" << endl ; - ReadingStatus = false ; - } - - //Position method - else if (DataBuffer=="A=") { - check_A = true; - ConfigFile >> DataBuffer ; - TLX = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - TLY = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - TLZ = atof(DataBuffer.c_str()) ; - cout << " A corner Position : (" << TLX << ";"<< TLY << ";"<< TLZ << ")"<<endl; - } - - else if (DataBuffer=="B=") { - check_B = true; - ConfigFile >> DataBuffer ; - BLX = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - BLY = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - BLZ = atof(DataBuffer.c_str()) ; - cout << " B corner Position : (" << BLX << ";"<< BLY << ";"<< BLZ << ")"<<endl; - - } - - else if (DataBuffer=="C=") { - check_C = true; - ConfigFile >> DataBuffer ; - BRX = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - BRY = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - BRZ = atof(DataBuffer.c_str()) ; - cout << " C corner Position : (" << BRX << ";"<< BRY << ";"<< BRZ << ")"<<endl; - - } - - else if (DataBuffer=="D=") { - check_D = true; - ConfigFile >> DataBuffer ; - TRX = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - TRY = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - TRZ = atof(DataBuffer.c_str()) ; - cout << " D corner Position : (" << TRX << ";"<< TRY << ";"<< TRZ << ")"<<endl; - } - - - //Angle method - else if (DataBuffer=="THETA=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - cout << " Theta : " << Theta << "deg"<<endl; - } - - else if (DataBuffer=="PHI=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - cout << " Phi : " << Phi << "deg"<<endl; - } - - else if (DataBuffer=="R=") { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - cout << " R : " << R << "mm"<<endl; - } - - - else if (DataBuffer=="BETA=") { - check_beta = true; - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - cout << " Beta : (" << beta_u << "deg ; "<< beta_v << "deg ; "<< beta_w << "deg"<<endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else - {ReadingStatus = false; cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ;} - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) { - ReadingStatus = false; - - ///Add The previously define telescope - //With position method - if ((check_A && check_B && check_C && check_D) || !(check_Theta && check_Phi && check_R)) { - NumberOfDetector++; - } - - //with angle method - else if ((check_Theta && check_Phi && check_R) || !(check_A && check_B && check_C && check_D)) { - NumberOfDetector++; - } - - // Reinitialisation of Check Boolean - - check_A = false ; - check_B = false ; - check_C = false ; - check_D = false ; +void TQQQPhysics::ReadConfiguration(NPL::InputParser parser) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("QQQ"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> cart = {"A","B","C","D"}; + vector<string> sphe = {"R","THETA","PHI","BETA"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// QQQ " << i+1 << endl; + TVector3 A = blocks[i]->GetTVector3("A","mm"); + TVector3 B = blocks[i]->GetTVector3("B","mm"); + TVector3 C = blocks[i]->GetTVector3("C","mm"); + TVector3 D = blocks[i]->GetTVector3("D","mm"); + NumberOfDetector++; + } + else if(blocks[i]->HasTokenList(sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// QQQ " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> Beta = blocks[i]->GetVectorDouble("BETA","deg"); + NumberOfDetector++; + } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_beta = false ; - ReadingStatus = false ; - - } - } - } - - InitializeStandardParameter() ; - ReadAnalysisConfig() ; + InitializeStandardParameter(); + ReadAnalysisConfig(); } diff --git a/NPLib/Detectors/QQQ/TQQQPhysics.h b/NPLib/Detectors/QQQ/TQQQPhysics.h index af699b72697ed63d56a5685a703211763caf3d80..49fdc134c0e98d2ce9bd58f2f555e3e166176db6 100644 --- a/NPLib/Detectors/QQQ/TQQQPhysics.h +++ b/NPLib/Detectors/QQQ/TQQQPhysics.h @@ -32,10 +32,9 @@ using namespace std ; #include "TQQQData.h" #include "NPVDetector.h" #include "NPCalibrationManager.h" +#include "NPInputParser.h" - -class TQQQPhysics : public TObject, public NPL::VDetector -{ +class TQQQPhysics : public TObject, public NPL::VDetector{ public: // Constructor and Destructor TQQQPhysics(); ~TQQQPhysics(); @@ -48,7 +47,7 @@ class TQQQPhysics : public TObject, public NPL::VDetector public: // inherrited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/Detectors/SPEG/TSpegPhysics.h b/NPLib/Detectors/SPEG/TSpegPhysics.h index c2da232aa4e9161ed12b37243fcde9e44e3d4094..6167f8b0ab74703be5e76f644f44e337843581d1 100644 --- a/NPLib/Detectors/SPEG/TSpegPhysics.h +++ b/NPLib/Detectors/SPEG/TSpegPhysics.h @@ -42,8 +42,7 @@ using namespace std ; #include "NPVDetector.h" #include "NPCalibrationManager.h" -class TSpegPhysics : public TObject, public NPL::VDetector -{ +class TSpegPhysics : public TObject, public NPL::VDetector{ public: // Constructor and Destructor TSpegPhysics(); ~TSpegPhysics(); @@ -248,7 +247,7 @@ class TSpegPhysics : public TObject, public NPL::VDetector public: // inherrited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(string Path); // Add Parameter to the CalibrationManger diff --git a/NPLib/Detectors/SSSD/TSSSDPhysics.cxx b/NPLib/Detectors/SSSD/TSSSDPhysics.cxx index 64022d43a879e857ba7d3c4d49902019e5002cdb..30d614f7e7b7314d7c9e68ffc0f8a5825bd34177 100644 --- a/NPLib/Detectors/SSSD/TSSSDPhysics.cxx +++ b/NPLib/Detectors/SSSD/TSSSDPhysics.cxx @@ -24,7 +24,7 @@ #include "RootOutput.h" #include "RootInput.h" #include "NPDetectorFactory.h" - +#include "NPOptionManager.h" // STL #include <iostream> #include <sstream> @@ -39,14 +39,14 @@ using namespace SSSD_LOCAL; // tranform an integer to a string string itoa(int value) { - char buffer [33]; - sprintf(buffer,"%d",value); - return buffer; + char buffer [33]; + sprintf(buffer,"%d",value); + return buffer; } ClassImp(TSSSDPhysics) -/////////////////////////////////////////////////////////////////////////// -TSSSDPhysics::TSSSDPhysics(){ + /////////////////////////////////////////////////////////////////////////// + TSSSDPhysics::TSSSDPhysics(){ NumberOfDetector = 0; EventData = new TSSSDData; PreTreatedData = new TSSSDData; @@ -56,375 +56,243 @@ TSSSDPhysics::TSSSDPhysics(){ } /////////////////////////////////////////////////////////////////////////// TSSSDPhysics::~TSSSDPhysics() - {} +{} /////////////////////////////////////////////////////////////////////////// void TSSSDPhysics::Clear(){ - DetectorNumber .clear() ; - StripNumber .clear() ; - Energy .clear() ; - Time .clear() ; - } + DetectorNumber .clear() ; + StripNumber .clear() ; + Energy .clear() ; + Time .clear() ; +} /////////////////////////////////////////////////////////////////////////// -void TSSSDPhysics::ReadConfiguration(string Path) { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double TLX , BLX , BRX , TRX , TLY , BLY , BRY , TRY , TLZ , BLZ , BRZ , TRZ ; - double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ; - bool check_A = false ; - bool check_B = false ; - bool check_C = false ; - bool check_D = false ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool check_beta = false ; - bool ReadingStatus = false ; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - // If line is a Start Up SSSD bloc, Reading toggle to true - if (LineBuffer.compare(0, 4, "SSSD") == 0 &&LineBuffer.compare(0, 5, "SSSDA") != 0) { - cout << "SSSD found: " << endl ; - ReadingStatus = true ; - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // Finding another telescope (safety), toggle out - else if (DataBuffer=="SSSD") { - cout << "WARNING: Another Telescope is founnd before standard sequence of Token, Error may occured in detector definition" << endl ; - ReadingStatus = false ; - } - - //Position method - else if (DataBuffer=="A=") { - check_A = true; - ConfigFile >> DataBuffer ; - TLX = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - TLY = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - TLZ = atof(DataBuffer.c_str()) ; - cout << " A corner Position : (" << TLX << ";"<< TLY << ";"<< TLZ << ")"<<endl; - } - - else if (DataBuffer=="B=") { - check_B = true; - ConfigFile >> DataBuffer ; - BLX = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - BLY = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - BLZ = atof(DataBuffer.c_str()) ; - cout << " B corner Position : (" << BLX << ";"<< BLY << ";"<< BLZ << ")"<<endl; - - } - - else if (DataBuffer=="C=") { - check_C = true; - ConfigFile >> DataBuffer ; - BRX = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - BRY = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - BRZ = atof(DataBuffer.c_str()) ; - cout << " C corner Position : (" << BRX << ";"<< BRY << ";"<< BRZ << ")"<<endl; - - } - - else if (DataBuffer=="D=") { - check_D = true; - ConfigFile >> DataBuffer ; - TRX = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - TRY = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - TRZ = atof(DataBuffer.c_str()) ; - cout << " D corner Position : (" << TRX << ";"<< TRY << ";"<< TRZ << ")"<<endl; - } - - - //Angle method - else if (DataBuffer=="THETA=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - cout << " Theta : " << Theta << "deg"<<endl; - } - - else if (DataBuffer=="PHI=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - cout << " Phi : " << Phi << "deg"<<endl; - } - - else if (DataBuffer=="R=") { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - cout << " R : " << R << "mm"<<endl; - } - +void TSSSDPhysics::ReadConfiguration(NPL::InputParser parser) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("SSSD"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> cart = {"A","B","C","D"}; + vector<string> sphe = {"R","THETA","PHI","BETA"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// SSSD " << i+1 << endl; + TVector3 A = blocks[i]->GetTVector3("A","mm"); + TVector3 B = blocks[i]->GetTVector3("B","mm"); + TVector3 C = blocks[i]->GetTVector3("C","mm"); + TVector3 D = blocks[i]->GetTVector3("D","mm"); + NumberOfDetector++; + } + else if(blocks[i]->HasTokenList(sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// SSSD " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> Beta = blocks[i]->GetVectorDouble("BETA","deg"); + NumberOfDetector++; + } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } - else if (DataBuffer=="BETA=") { - check_beta = true; - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - cout << " Beta : (" << beta_u << "deg ; "<< beta_v << "deg ; "<< beta_w << "deg"<<endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else - {ReadingStatus = false; cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ;} - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) { - ReadingStatus = false; - - ///Add The previously define telescope - //With position method - if ((check_A && check_B && check_C && check_D) || !(check_Theta && check_Phi && check_R)) { - NumberOfDetector++; - } - - //with angle method - else if ((check_Theta && check_Phi && check_R) || !(check_A && check_B && check_C && check_D)) { - NumberOfDetector++; - } - - // Reinitialisation of Check Boolean - - check_A = false ; - check_B = false ; - check_C = false ; - check_D = false ; - - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_beta = false ; - ReadingStatus = false ; - - } - } - } - - InitializeStandardParameter() ; - ReadAnalysisConfig() ; + InitializeStandardParameter() ; + ReadAnalysisConfig() ; } /////////////////////////////////////////////////////////////////////////// void TSSSDPhysics::AddParameterToCalibrationManager(){ - CalibrationManager* Cal = CalibrationManager::getInstance(); - - for(int i = 0 ; i < NumberOfDetector ; ++i){ - - for( int j = 0 ; j < 16 ; ++j){ - Cal->AddParameter("SSSD", "Detector"+ NPL::itoa(i+1)+"_Strip"+ NPL::itoa(j+1)+"_E","SSSD_DETECTOR_"+ NPL::itoa(i+1)+"_STRIP_"+ NPL::itoa(j+1)+"_E") ; - Cal->AddParameter("SSSD", "Detector"+ NPL::itoa(i+1)+"_Strip"+ NPL::itoa(j+1)+"_T","SSSD_DETECTOR_"+ NPL::itoa(i+1)+"_STRIP_"+ NPL::itoa(j+1)+"_T") ; - } - } + CalibrationManager* Cal = CalibrationManager::getInstance(); + + for(int i = 0 ; i < NumberOfDetector ; ++i){ + + for( int j = 0 ; j < 16 ; ++j){ + Cal->AddParameter("SSSD", "Detector"+ NPL::itoa(i+1)+"_Strip"+ NPL::itoa(j+1)+"_E","SSSD_DETECTOR_"+ NPL::itoa(i+1)+"_STRIP_"+ NPL::itoa(j+1)+"_E") ; + Cal->AddParameter("SSSD", "Detector"+ NPL::itoa(i+1)+"_Strip"+ NPL::itoa(j+1)+"_T","SSSD_DETECTOR_"+ NPL::itoa(i+1)+"_STRIP_"+ NPL::itoa(j+1)+"_T") ; + } } - +} + /////////////////////////////////////////////////////////////////////////// void TSSSDPhysics::InitializeRootInputRaw(){ - TChain* inputChain = RootInput::getInstance()->GetChain(); - inputChain->SetBranchStatus ( "SSSD" , true ); - inputChain->SetBranchStatus ( "fSSSD_*" , true ); - inputChain->SetBranchAddress( "SSSD" , &EventData ); - } + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus ( "SSSD" , true ); + inputChain->SetBranchStatus ( "fSSSD_*" , true ); + inputChain->SetBranchAddress( "SSSD" , &EventData ); +} /////////////////////////////////////////////////////////////////////////// void TSSSDPhysics::InitializeRootInputPhysics(){ - TChain* inputChain = RootInput::getInstance()->GetChain(); - inputChain->SetBranchStatus ( "SSSD" , true ); - inputChain->SetBranchStatus ( "DetectorNumber", true ); - inputChain->SetBranchStatus ( "StripNumber" , true ); - inputChain->SetBranchStatus ( "Energy" , true ); - inputChain->SetBranchStatus ( "Time" , true ); - inputChain->SetBranchAddress( "SSSD" , &EventPhysics ); - - } + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus ( "SSSD" , true ); + inputChain->SetBranchStatus ( "DetectorNumber", true ); + inputChain->SetBranchStatus ( "StripNumber" , true ); + inputChain->SetBranchStatus ( "Energy" , true ); + inputChain->SetBranchStatus ( "Time" , true ); + inputChain->SetBranchAddress( "SSSD" , &EventPhysics ); + +} /////////////////////////////////////////////////////////////////////////// void TSSSDPhysics::InitializeRootOutput(){ - TTree* outputTree = RootOutput::getInstance()->GetTree() ; - outputTree->Branch( "SSSD" , "TSSSDPhysics" , &EventPhysics ) ; - } + TTree* outputTree = RootOutput::getInstance()->GetTree() ; + outputTree->Branch( "SSSD" , "TSSSDPhysics" , &EventPhysics ) ; +} /////////////////////////////////////////////////////////////////////////// void TSSSDPhysics::BuildPhysicalEvent(){ - BuildSimplePhysicalEvent() ; - } + BuildSimplePhysicalEvent() ; +} /////////////////////////////////////////////////////////////////////////// void TSSSDPhysics::BuildSimplePhysicalEvent(){ - PreTreat(); - for(unsigned int i = 0 ; i < PreTreatedData->GetEnergyMult() ; ++i){ - DetectorNumber .push_back( PreTreatedData->GetEnergyDetectorNbr(i) ) ; - StripNumber .push_back( PreTreatedData->GetEnergyStripNbr(i) ) ; - Energy .push_back( PreTreatedData->GetEnergy(i) ) ; - // Look For associate Time - for(unsigned int j = 0 ; j < PreTreatedData->GetTimeMult() ; ++j ){ - if(PreTreatedData->GetEnergyDetectorNbr(i) == PreTreatedData->GetTimeDetectorNbr(j) && PreTreatedData->GetEnergyStripNbr(i)==PreTreatedData->GetTimeStripNbr(j)) - Time.push_back(PreTreatedData->GetTime(j)); - } - } - return; + PreTreat(); + for(unsigned int i = 0 ; i < PreTreatedData->GetEnergyMult() ; ++i){ + DetectorNumber .push_back( PreTreatedData->GetEnergyDetectorNbr(i) ) ; + StripNumber .push_back( PreTreatedData->GetEnergyStripNbr(i) ) ; + Energy .push_back( PreTreatedData->GetEnergy(i) ) ; + // Look For associate Time + for(unsigned int j = 0 ; j < PreTreatedData->GetTimeMult() ; ++j ){ + if(PreTreatedData->GetEnergyDetectorNbr(i) == PreTreatedData->GetTimeDetectorNbr(j) && PreTreatedData->GetEnergyStripNbr(i)==PreTreatedData->GetTimeStripNbr(j)) + Time.push_back(PreTreatedData->GetTime(j)); + } } - + return; +} + /////////////////////////////////////////////////////////////////////////// void TSSSDPhysics::PreTreat(){ ClearPreTreatedData(); - + // E - for(int i = 0 ; i < EventData->GetEnergyMult() ; ++i){ - if(EventData->GetEnergy(i) > m_Pedestal_Threshold && ChannelStatus[EventData->GetEnergyDetectorNbr(i)-1][EventData->GetEnergyStripNbr(i)-1]){ - double E = fSi_E(EventData , i); - if( E > m_E_Threshold ){ - PreTreatedData->SetEnergyDetectorNbr( EventData->GetEnergyDetectorNbr(i) ) ; - PreTreatedData->SetEnergyStripNbr( EventData->GetEnergyStripNbr(i) ) ; - PreTreatedData->SetEnergy( E ) ; - } - } - } - // T - for(int i = 0 ; i < EventData->GetTimeMult() ; ++i){ - if(ChannelStatus[EventData->GetTimeDetectorNbr(i)-1][EventData->GetTimeStripNbr(i)-1]){ - PreTreatedData->SetTimeDetectorNbr( EventData->GetTimeDetectorNbr(i) ) ; - PreTreatedData->SetTimeStripNbr( EventData->GetTimeStripNbr(i) ) ; - PreTreatedData->SetTime( fSi_T(EventData , i) ) ; - } - } + for(int i = 0 ; i < EventData->GetEnergyMult() ; ++i){ + if(EventData->GetEnergy(i) > m_Pedestal_Threshold && ChannelStatus[EventData->GetEnergyDetectorNbr(i)-1][EventData->GetEnergyStripNbr(i)-1]){ + double E = fSi_E(EventData , i); + if( E > m_E_Threshold ){ + PreTreatedData->SetEnergyDetectorNbr( EventData->GetEnergyDetectorNbr(i) ) ; + PreTreatedData->SetEnergyStripNbr( EventData->GetEnergyStripNbr(i) ) ; + PreTreatedData->SetEnergy( E ) ; + } + } + } + // T + for(int i = 0 ; i < EventData->GetTimeMult() ; ++i){ + if(ChannelStatus[EventData->GetTimeDetectorNbr(i)-1][EventData->GetTimeStripNbr(i)-1]){ + PreTreatedData->SetTimeDetectorNbr( EventData->GetTimeDetectorNbr(i) ) ; + PreTreatedData->SetTimeStripNbr( EventData->GetTimeStripNbr(i) ) ; + PreTreatedData->SetTime( fSi_T(EventData , i) ) ; + } } +} /////////////////////////////////////////////////////////////////////////// void TSSSDPhysics::InitializeStandardParameter(){ - // Enable all channel - vector<bool> TempChannelStatus; - ChannelStatus.clear(); - TempChannelStatus.resize(16,true); - for(int i = 0 ; i < NumberOfDetector ; ++i) - ChannelStatus[i] = TempChannelStatus; - } + // Enable all channel + vector<bool> TempChannelStatus; + ChannelStatus.clear(); + TempChannelStatus.resize(16,true); + for(int i = 0 ; i < NumberOfDetector ; ++i) + ChannelStatus[i] = TempChannelStatus; +} /////////////////////////////////////////////////////////////////////////// void TSSSDPhysics::ReadAnalysisConfig(){ - bool ReadingStatus = false; - - // path to file - string FileName = "./configs/ConfigSSSD.dat"; - - // open analysis config file - ifstream AnalysisConfigFile; - AnalysisConfigFile.open(FileName.c_str()); - - if (!AnalysisConfigFile.is_open()) { - cout << " No ConfigMust2.dat found: Default parameter loaded for Analayis " << FileName << endl; - return; - } - cout << " Loading user parameter for Analysis from ConfigSSSD.dat " << endl; - - // Save it in a TAsciiFile - TAsciiFile* asciiConfig = RootOutput::getInstance()->GetAsciiFileAnalysisConfig(); - asciiConfig->AppendLine("%%% ConfigSSSD.dat %%%"); - asciiConfig->Append(FileName.c_str()); - asciiConfig->AppendLine(""); - - // read analysis config file - string LineBuffer,DataBuffer,whatToDo; - while (!AnalysisConfigFile.eof()) { - // Pick-up next line - getline(AnalysisConfigFile, LineBuffer); - - // search for "header" - if (LineBuffer.compare(0, 11, "ConfigSSSD") == 0) ReadingStatus = true; - - // loop on tokens and data - while (ReadingStatus) { - - whatToDo= "" ; - AnalysisConfigFile >> whatToDo; - - // Search for comment symbol (%) - if (whatToDo.compare(0, 1, "%") == 0) { - AnalysisConfigFile.ignore(numeric_limits<streamsize>::max(), '\n' ); - } - - else if (whatToDo=="PEDESTAL_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_Pedestal_Threshold = atof(DataBuffer.c_str() ); - cout << "PEDESTAL THRESHOLD " << m_Pedestal_Threshold << endl; - } - - - else if (whatToDo=="DISABLE_ALL") { - AnalysisConfigFile >> DataBuffer; - cout << whatToDo << " " << DataBuffer << endl; - int Detector = atoi(DataBuffer.substr(2,1).c_str()); - vector< bool > ChannelStatusBuffer; - ChannelStatusBuffer.resize(16,false); - ChannelStatus[Detector-1] = ChannelStatusBuffer; - } - - else if (whatToDo=="DISABLE_CHANNEL") { - AnalysisConfigFile >> DataBuffer; - cout << whatToDo << " " << DataBuffer << endl; - int telescope = atoi(DataBuffer.substr(2,1).c_str()); - int channel = -1; - if (DataBuffer.compare(3,3,"STR") == 0) { - channel = atoi(DataBuffer.substr(6).c_str()); - *(ChannelStatus[telescope-1].begin()+channel-1) = false; - } - - else { - cout << "Warning: detector type for SSSD unknown!" << endl; - } - } - - else { - ReadingStatus = false; - } + bool ReadingStatus = false; + + // path to file + string FileName = "./configs/ConfigSSSD.dat"; + + // open analysis config file + ifstream AnalysisConfigFile; + AnalysisConfigFile.open(FileName.c_str()); + + if (!AnalysisConfigFile.is_open()) { + cout << " No ConfigMust2.dat found: Default parameter loaded for Analayis " << FileName << endl; + return; + } + cout << " Loading user parameter for Analysis from ConfigSSSD.dat " << endl; + + // Save it in a TAsciiFile + TAsciiFile* asciiConfig = RootOutput::getInstance()->GetAsciiFileAnalysisConfig(); + asciiConfig->AppendLine("%%% ConfigSSSD.dat %%%"); + asciiConfig->Append(FileName.c_str()); + asciiConfig->AppendLine(""); + + // read analysis config file + string LineBuffer,DataBuffer,whatToDo; + while (!AnalysisConfigFile.eof()) { + // Pick-up next line + getline(AnalysisConfigFile, LineBuffer); + + // search for "header" + if (LineBuffer.compare(0, 11, "ConfigSSSD") == 0) ReadingStatus = true; + + // loop on tokens and data + while (ReadingStatus) { + + whatToDo= "" ; + AnalysisConfigFile >> whatToDo; + + // Search for comment symbol (%) + if (whatToDo.compare(0, 1, "%") == 0) { + AnalysisConfigFile.ignore(numeric_limits<streamsize>::max(), '\n' ); + } + + else if (whatToDo=="PEDESTAL_THRESHOLD") { + AnalysisConfigFile >> DataBuffer; + m_Pedestal_Threshold = atof(DataBuffer.c_str() ); + cout << "PEDESTAL THRESHOLD " << m_Pedestal_Threshold << endl; } - } + + + else if (whatToDo=="DISABLE_ALL") { + AnalysisConfigFile >> DataBuffer; + cout << whatToDo << " " << DataBuffer << endl; + int Detector = atoi(DataBuffer.substr(2,1).c_str()); + vector< bool > ChannelStatusBuffer; + ChannelStatusBuffer.resize(16,false); + ChannelStatus[Detector-1] = ChannelStatusBuffer; + } + + else if (whatToDo=="DISABLE_CHANNEL") { + AnalysisConfigFile >> DataBuffer; + cout << whatToDo << " " << DataBuffer << endl; + int telescope = atoi(DataBuffer.substr(2,1).c_str()); + int channel = -1; + if (DataBuffer.compare(3,3,"STR") == 0) { + channel = atoi(DataBuffer.substr(6).c_str()); + *(ChannelStatus[telescope-1].begin()+channel-1) = false; + } + + else { + cout << "Warning: detector type for SSSD unknown!" << endl; + } + } + + else { + ReadingStatus = false; + } + } + } } /////////////////////////////////////////////////////////////////////////// double SSSD_LOCAL::fSi_E( const TSSSDData* EventData , const int i ) - { - return CalibrationManager::getInstance()->ApplyCalibration( "SSSD/Detector" + NPL::itoa( EventData->GetEnergyDetectorNbr(i) ) + "_Strip" + NPL::itoa( EventData->GetEnergyStripNbr(i) ) +"_E", - EventData->GetEnergy(i) ); - } - - +{ + return CalibrationManager::getInstance()->ApplyCalibration( "SSSD/Detector" + NPL::itoa( EventData->GetEnergyDetectorNbr(i) ) + "_Strip" + NPL::itoa( EventData->GetEnergyStripNbr(i) ) +"_E", + EventData->GetEnergy(i) ); +} + + double SSSD_LOCAL::fSi_T( const TSSSDData* EventData , const int i ) - { - return CalibrationManager::getInstance()->ApplyCalibration( "SSSD/Detector" + NPL::itoa( EventData->GetEnergyDetectorNbr(i) ) + "_Strip" + NPL::itoa( EventData->GetEnergyStripNbr(i) ) +"_T", - EventData->GetTime(i) ); - } - - - +{ + return CalibrationManager::getInstance()->ApplyCalibration( "SSSD/Detector" + NPL::itoa( EventData->GetEnergyDetectorNbr(i) ) + "_Strip" + NPL::itoa( EventData->GetEnergyStripNbr(i) ) +"_T", + EventData->GetTime(i) ); +} + + + //////////////////////////////////////////////////////////////////////////////// // Construct Method to be pass to the DetectorFactory // //////////////////////////////////////////////////////////////////////////////// diff --git a/NPLib/Detectors/SSSD/TSSSDPhysics.h b/NPLib/Detectors/SSSD/TSSSDPhysics.h index cfc9b68e04563f45baf786ecdf9bdbfea38b8941..95b3724fd0048383fe7d67fd95f64789ef1ac0c3 100644 --- a/NPLib/Detectors/SSSD/TSSSDPhysics.h +++ b/NPLib/Detectors/SSSD/TSSSDPhysics.h @@ -32,10 +32,9 @@ using namespace std ; #include "TSSSDData.h" #include "NPVDetector.h" #include "NPCalibrationManager.h" +#include "NPInputParser.h" - -class TSSSDPhysics : public TObject, public NPL::VDetector -{ +class TSSSDPhysics : public TObject, public NPL::VDetector{ public: // Constructor and Destructor TSSSDPhysics(); ~TSSSDPhysics(); @@ -48,7 +47,7 @@ class TSSSDPhysics : public TObject, public NPL::VDetector public: // inherrited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/Detectors/Sharc/TSharcPhysics.cxx b/NPLib/Detectors/Sharc/TSharcPhysics.cxx index 494750128d692639e143f1f982dfa936a11f44f0..b32e03fec3595a5ee5a2bb59db6c052c2aefddd5 100644 --- a/NPLib/Detectors/Sharc/TSharcPhysics.cxx +++ b/NPLib/Detectors/Sharc/TSharcPhysics.cxx @@ -457,178 +457,44 @@ void TSharcPhysics::Clear(){ //// Innherited from VDetector Class //// /////////////////////////////////////////////////////////////////////////// -void TSharcPhysics::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double R,Phi,Z; - R = 0 ; Phi = 0 ; Z = 0; - TVector3 Pos; - bool check_R = false ; - bool check_Phi = false ; - bool check_Z = false ; - - bool ReadingStatusQQQ = false ; - bool ReadingStatusBOX = false ; - bool ReadingStatus = false ; - - bool VerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); ; - - while (!ConfigFile.eof()){ - - getline(ConfigFile, LineBuffer); - // cout << LineBuffer << endl; - if (LineBuffer.compare(0, 5, "Sharc") == 0) - ReadingStatus = true; - - while (ReadingStatus && !ConfigFile.eof()) { - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // CD case - if (DataBuffer=="SharcQQQ"){ - if(VerboseLevel) cout << "///" << endl ; - if(VerboseLevel) cout << "QQQ Quadrant found: " << endl ; - ReadingStatusQQQ = true ; - } - - // Box case - else if (DataBuffer=="SharcBOX"){ - if(VerboseLevel) cout << "///" << endl ; - if(VerboseLevel) cout << "Box Detector found: " << endl ; - ReadingStatusBOX = true ; - } - - // Reading Block - while(ReadingStatusQQQ){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - //Position method - else if (DataBuffer == "Z=") { - check_Z = true; - ConfigFile >> DataBuffer ; - Z= atof(DataBuffer.c_str()); - if(VerboseLevel) cout << " Z= " << Z << "mm" << endl; - } - - else if (DataBuffer == "R=") { - check_R = true; - ConfigFile >> DataBuffer ; - R= atof(DataBuffer.c_str()); - if(VerboseLevel) cout << " R= " << R << "mm" << endl; - } - - else if (DataBuffer == "Phi=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi= atof(DataBuffer.c_str()); - if(VerboseLevel) cout << " Phi= " << Phi << "deg" << endl; - } - - else if (DataBuffer == "ThicknessDector=") { - /*ignore that*/ - } +void TSharcPhysics::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Sharc"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatusQQQ = false; - cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << endl ; - exit(1); - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_R && check_Phi && check_Z){ - - ReadingStatusQQQ = false; - AddQQQDetector(R,Phi,Z); - // Reinitialisation of Check Boolean - check_R = false ; - check_Phi = false ; - } - - } - - while(ReadingStatusBOX){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - //Position method - else if (DataBuffer == "Z=") { - check_Z = true; - ConfigFile >> DataBuffer ; - Z= atof(DataBuffer.c_str()); - if(VerboseLevel) cout << " Z= " << Z << "mm" << endl; - } - - else if (DataBuffer == "ThicknessDector1=") { - /*ignore this */ - } - - else if (DataBuffer == "ThicknessDector2=") { - /*ignore this */ - } - - else if (DataBuffer == "ThicknessDector3=") { - /*ignore this */ - } - - else if (DataBuffer == "ThicknessDector4=") { - /*ignore this */ - } - - else if (DataBuffer == "ThicknessPAD1=") { - /*ignore this */ - } - - else if (DataBuffer == "ThicknessPAD2=") { - /*ignore this */ - } - - else if (DataBuffer == "ThicknessPAD3=") { - /*ignore this */ - } - - else if (DataBuffer == "ThicknessPAD4=") { - /*ignore this */ - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatusBOX = false; - cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << endl ; - exit(1); - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_Z){ - ReadingStatusBOX = false; - AddBoxDetector(Z); - // Reinitialisation of Check Boolean - check_R = false ; - check_Phi = false ; - check_Z = false ; + vector<string> tokenQQQ = {"Z","R","Phi","ThicknessDetector"}; + vector<string> tokenBOX = {"Z","ThicknessDetector1","ThicknessDetector2","ThicknessDetector3","ThicknessDetector4","ThicknessPAD1","ThicknessPAD2","ThicknessPAD3","ThicknessPAD4"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + + if(blocks[i]->GetMainValue()=="QQQ" && blocks[i]->HasTokenList(tokenQQQ)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Sharc QQQ " << i+1 << endl; + double Z = blocks[i]->GetDouble("Z","mm"); + double R = blocks[i]->GetDouble("R","mm"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + double Thickness= blocks[i]->GetDouble("ThicknessDetector","micrometer"); + AddQQQDetector(R,Phi,Z); + } + else if(blocks[i]->GetMainValue()=="BOX" && blocks[i]->HasTokenList(tokenBOX)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Sharc Box " << i+1 << endl; + double Z = blocks[i]->GetDouble("Z","mm"); + double Thickness1= blocks[i]->GetDouble("ThicknessDetector1","micrometer"); + double Thickness2= blocks[i]->GetDouble("ThicknessDetector2","micrometer"); + double Thickness3= blocks[i]->GetDouble("ThicknessDetector3","micrometer"); + double Thickness4= blocks[i]->GetDouble("ThicknessDetector4","micrometer"); + double ThicknessPAD1 = blocks[i]->GetDouble("ThicknessPAD1","micrometer"); + double ThicknessPAD2 = blocks[i]->GetDouble("ThicknessPAD2","micrometer"); + double ThicknessPAD3 = blocks[i]->GetDouble("ThicknessPAD3","micrometer"); + double ThicknessPAD4 = blocks[i]->GetDouble("ThicknessPAD4","micrometer"); + AddBoxDetector(Z); + } - } - } + else{ + cout << "Warning: check your input file formatting " << endl; } } - InitializeStandardParameter(); ReadAnalysisConfig(); } diff --git a/NPLib/Detectors/Sharc/TSharcPhysics.h b/NPLib/Detectors/Sharc/TSharcPhysics.h index 9c6db3610aa13f902ff934caab57cc35b48a4765..ea5504dde59666fd1806f0e939716af72974f36f 100644 --- a/NPLib/Detectors/Sharc/TSharcPhysics.h +++ b/NPLib/Detectors/Sharc/TSharcPhysics.h @@ -30,6 +30,7 @@ #include "TSharcSpectra.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" +#include "NPInputParser.h" // ROOT #include "TVector2.h" #include "TVector3.h" @@ -88,7 +89,7 @@ class TSharcPhysics : public TObject, public NPL::VDetector{ public: // Innherited from VDetector Class // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string) ; + void ReadConfiguration(NPL::InputParser) ; // Add Parameter to the CalibrationManger diff --git a/NPLib/Detectors/SiLi/TSiLiPhysics.cxx b/NPLib/Detectors/SiLi/TSiLiPhysics.cxx index cbddfe749d1e5f46450f52ee876c06e15c0093de..08f7a8d4e432cdd037e3421dce7f4a742f36569e 100644 --- a/NPLib/Detectors/SiLi/TSiLiPhysics.cxx +++ b/NPLib/Detectors/SiLi/TSiLiPhysics.cxx @@ -25,6 +25,7 @@ #include "RootOutput.h" #include "RootInput.h" #include "NPDetectorFactory.h" +#include "NPOptionManager.h" // STL #include <iostream> @@ -40,198 +41,110 @@ using namespace std; // tranform an integer to a string string itoa(int value) { - char buffer [33]; - sprintf(buffer,"%d",value); - return buffer; + char buffer [33]; + sprintf(buffer,"%d",value); + return buffer; } ClassImp(TSiLiPhysics) -/////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// TSiLiPhysics::TSiLiPhysics() - { - NumberOfDetector = 0 ; - EventData = new TSiLiData ; - PreTreatedData = new TSiLiData ; - EventPhysics = this ; - m_Spectra = NULL; - m_SiLi_E_Threshold = 0; - m_SiLi_RAW_Threshold = 0; - } - +{ + NumberOfDetector = 0 ; + EventData = new TSiLiData ; + PreTreatedData = new TSiLiData ; + EventPhysics = this ; + m_Spectra = NULL; + m_SiLi_E_Threshold = 0; + m_SiLi_RAW_Threshold = 0; +} + /////////////////////////////////////////////////////////////////////////// TSiLiPhysics::~TSiLiPhysics() - {} - -/////////////////////////////////////////////////////////////////////////// -void TSiLiPhysics::Clear() - { +{} - DetectorNumber.clear() ; - Energy.clear() ; - Time.clear() ; - } - /////////////////////////////////////////////////////////////////////////// -void TSiLiPhysics::ReadConfiguration(string Path) - { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - bool check_Thickness = false ; - bool check_Height = false ; - bool check_Width = false ; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - bool ReadingStatus = false ; - - while (!ConfigFile.eof()) - { - - getline(ConfigFile, LineBuffer); - - // If line is a Start Up SiLi bloc, Reading toggle to true - if (LineBuffer.compare(0, 4, "SiLi") == 0) - { - cout << "///" << endl ; - cout << "SiLi found: " << endl ; - ReadingStatus = true ; - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus) - { - // Pickup Next Word - ConfigFile >> DataBuffer ; +void TSiLiPhysics::Clear() +{ - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} + DetectorNumber.clear() ; + Energy.clear() ; + Time.clear() ; +} - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 4, "SiLi") == 0) { - cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << endl ; - ReadingStatus = false ; - } +/////////////////////////////////////////////////////////////////////////// +void TSiLiPhysics::ReadConfiguration(NPL::InputParser parser){ - - //Position method - else if (DataBuffer=="X=") { - check_X = true; - ConfigFile >> DataBuffer ; - cout << "X: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("SiLi"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; - else if (DataBuffer=="Y=") { - check_Y = true; - ConfigFile >> DataBuffer ; - cout << "Y: " << atof( DataBuffer.c_str() ) << "mm"<< endl; - } + vector<string> token = {"X","Y","Z","Width","Height","Thickness"}; - else if (DataBuffer=="Z=") { - check_Z = true; - ConfigFile >> DataBuffer ; - cout << "Z: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - - // Squared shape - else if (DataBuffer=="Width=") { - check_Width = true; - ConfigFile >> DataBuffer ; - cout << "SiLi Width: " <<atof( DataBuffer.c_str() ) << "mm" << endl; - } - - else if (DataBuffer== "Height=") { - check_Height = true; - ConfigFile >> DataBuffer ; - cout << "SiLi Height: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - // Common - else if (DataBuffer=="Thickness=") { - check_Thickness = true; - ConfigFile >> DataBuffer ; - cout << "SiLi Thickness: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else - {ReadingStatus = false; cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ;} - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if ( check_Thickness && check_Height && check_Width && check_X && check_Y && check_Z ) - { - NumberOfDetector++; - - // Reinitialisation of Check Boolean - check_Thickness = false ; - check_Height = false ; - check_Width = false ; - check_X = false ; - check_Y = false ; - check_Z = false ; - ReadingStatus = false ; - cout << "///"<< endl ; - } - } - } - } + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// SiLi " << i+1 << endl; + double X = blocks[i]->GetDouble("X","mm"); + double Y = blocks[i]->GetDouble("Y","mm"); + double Z = blocks[i]->GetDouble("Z","mm"); + double Width = blocks[i]->GetDouble("Width","mm"); + double Height = blocks[i]->GetDouble("Height","mm"); + double Thickness = blocks[i]->GetDouble("Thickness","mm"); + } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } +} /////////////////////////////////////////////////////////////////////////// void TSiLiPhysics::AddParameterToCalibrationManager() - { - CalibrationManager* Cal = CalibrationManager::getInstance(); - - for(int i = 0 ; i < NumberOfDetector ; i++) - { - Cal->AddParameter("SiLi", "Detector"+ NPL::itoa(i+1)+"_E","SiLi_Detector"+ NPL::itoa(i+1)+"_E") ; - Cal->AddParameter("SiLi", "Detector"+ NPL::itoa(i+1)+"_T","SiLi_Detector"+ NPL::itoa(i+1)+"_T") ; - } - } - +{ + CalibrationManager* Cal = CalibrationManager::getInstance(); + + for(int i = 0 ; i < NumberOfDetector ; i++) + { + Cal->AddParameter("SiLi", "Detector"+ NPL::itoa(i+1)+"_E","SiLi_Detector"+ NPL::itoa(i+1)+"_E") ; + Cal->AddParameter("SiLi", "Detector"+ NPL::itoa(i+1)+"_T","SiLi_Detector"+ NPL::itoa(i+1)+"_T") ; + } +} + /////////////////////////////////////////////////////////////////////////// void TSiLiPhysics::InitializeRootInputRaw() - { - TChain* inputChain = RootInput::getInstance()->GetChain() ; - inputChain->SetBranchStatus ( "SiLi" , true ) ; - inputChain->SetBranchStatus ( "fSiLi_*" , true ) ; - inputChain->SetBranchAddress( "SiLi" , &EventData ) ; - } +{ + TChain* inputChain = RootInput::getInstance()->GetChain() ; + inputChain->SetBranchStatus ( "SiLi" , true ) ; + inputChain->SetBranchStatus ( "fSiLi_*" , true ) ; + inputChain->SetBranchAddress( "SiLi" , &EventData ) ; +} /////////////////////////////////////////////////////////////////////////// void TSiLiPhysics::InitializeRootInputPhysics() - { - TChain* inputChain = RootInput::getInstance()->GetChain(); - inputChain->SetBranchStatus ( "SiLi", true ); - inputChain->SetBranchStatus ( "DetectorNumber", true ); - inputChain->SetBranchStatus ( "Energy", true ); - inputChain->SetBranchStatus ( "Time", true ); - inputChain->SetBranchAddress( "SiLi", &EventPhysics ); - } +{ + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus ( "SiLi", true ); + inputChain->SetBranchStatus ( "DetectorNumber", true ); + inputChain->SetBranchStatus ( "Energy", true ); + inputChain->SetBranchStatus ( "Time", true ); + inputChain->SetBranchAddress( "SiLi", &EventPhysics ); +} /////////////////////////////////////////////////////////////////////////// void TSiLiPhysics::InitializeRootOutput() - { - TTree* outputTree = RootOutput::getInstance()->GetTree() ; - outputTree->Branch( "SiLi" , "TSiLiPhysics" , &EventPhysics ) ; - } +{ + TTree* outputTree = RootOutput::getInstance()->GetTree() ; + outputTree->Branch( "SiLi" , "TSiLiPhysics" , &EventPhysics ) ; +} /////////////////////////////////////////////////////////////////////////// void TSiLiPhysics::InitSpectra(){ - m_Spectra = new TSiLiSpectra(NumberOfDetector); + m_Spectra = new TSiLiSpectra(NumberOfDetector); } /////////////////////////////////////////////////////////////////////////// void TSiLiPhysics::FillSpectra(){ - m_Spectra -> FillRawSpectra(EventData); - m_Spectra -> FillPreTreatedSpectra(PreTreatedData); - m_Spectra -> FillPhysicsSpectra(EventPhysics); + m_Spectra -> FillRawSpectra(EventData); + m_Spectra -> FillPreTreatedSpectra(PreTreatedData); + m_Spectra -> FillPhysicsSpectra(EventPhysics); } /////////////////////////////////////////////////////////////////////////// void TSiLiPhysics::CheckSpectra(){ @@ -259,65 +172,65 @@ void TSiLiPhysics::PreTreat(){ ClearPreTreatedData(); double E,T; for(unsigned int i = 0 ; i < EventData->GetEnergyMult() ; ++i) + { + if( EventData->GetEEnergy(i)>m_SiLi_RAW_Threshold ) { - if( EventData->GetEEnergy(i)>m_SiLi_RAW_Threshold ) - { - E=CalibrationManager::getInstance()->ApplyCalibration("SiLi/Detector" + NPL::itoa( EventData->GetENumber(i) ) +"_E",EventData->GetEEnergy(i)); - if(E>m_SiLi_E_Threshold) - { - PreTreatedData->SetENumber( EventData->GetENumber(i) ); - PreTreatedData->SetEEnergy( E ); - } - } + E=CalibrationManager::getInstance()->ApplyCalibration("SiLi/Detector" + NPL::itoa( EventData->GetENumber(i) ) +"_E",EventData->GetEEnergy(i)); + if(E>m_SiLi_E_Threshold) + { + PreTreatedData->SetENumber( EventData->GetENumber(i) ); + PreTreatedData->SetEEnergy( E ); + } } + } for(unsigned int i = 0 ; i < EventData->GetTimeMult() ; ++i) - { - T=CalibrationManager::getInstance()->ApplyCalibration("SiLi/Detector"+ NPL::itoa(EventData->GetTNumber(i))+"_T",EventData->GetTTime(i) ) ; - PreTreatedData->SetTNumber( EventData->GetTNumber(i) ); - PreTreatedData->SetTTime( T ); - - } - + { + T=CalibrationManager::getInstance()->ApplyCalibration("SiLi/Detector"+ NPL::itoa(EventData->GetTNumber(i))+"_T",EventData->GetTTime(i) ) ; + PreTreatedData->SetTNumber( EventData->GetTNumber(i) ); + PreTreatedData->SetTTime( T ); + + } + } /////////////////////////////////////////////////////////////////////////// void TSiLiPhysics::BuildPhysicalEvent() - { - BuildSimplePhysicalEvent() ; - } +{ + BuildSimplePhysicalEvent() ; +} /////////////////////////////////////////////////////////////////////////// void TSiLiPhysics::BuildSimplePhysicalEvent() - { - PreTreat(); +{ + PreTreat(); - double SiLi_T=-1000; - double SiLi_E=-1000; - int SiLi_N=-1000; - vector<double> SiLi_E_vect,SiLi_T_vect; - vector<int> SiLi_N_vect; - for(unsigned int j = 0 ; j < EventData->GetEnergyMult() ; j++) + double SiLi_T=-1000; + double SiLi_E=-1000; + int SiLi_N=-1000; + vector<double> SiLi_E_vect,SiLi_T_vect; + vector<int> SiLi_N_vect; + for(unsigned int j = 0 ; j < EventData->GetEnergyMult() ; j++) + { + SiLi_E=PreTreatedData->GetEEnergy(j); + SiLi_N=PreTreatedData->GetENumber(j); + for(unsigned int i = 0 ; i < EventData->GetTimeMult() ; i++) + { + if(PreTreatedData->GetENumber(j)==PreTreatedData->GetTNumber(i)) { - SiLi_E=PreTreatedData->GetEEnergy(j); - SiLi_N=PreTreatedData->GetENumber(j); - for(unsigned int i = 0 ; i < EventData->GetTimeMult() ; i++) - { - if(PreTreatedData->GetENumber(j)==PreTreatedData->GetTNumber(i)) - { - SiLi_T=EventData->GetTTime(i); - } - } - SiLi_E_vect.push_back( SiLi_E); - SiLi_T_vect.push_back( SiLi_T); - SiLi_N_vect.push_back( SiLi_N); + SiLi_T=EventData->GetTTime(i); } - for(unsigned int i = 0 ; i < SiLi_E_vect.size() ; i++) - { - DetectorNumber.push_back( SiLi_N_vect[i] ) ; - Energy.push_back( SiLi_E_vect[i] ); - Time.push_back( SiLi_T_vect[i] ); - } + } + SiLi_E_vect.push_back( SiLi_E); + SiLi_T_vect.push_back( SiLi_T); + SiLi_N_vect.push_back( SiLi_N); + } + for(unsigned int i = 0 ; i < SiLi_E_vect.size() ; i++) + { + DetectorNumber.push_back( SiLi_N_vect[i] ) ; + Energy.push_back( SiLi_E_vect[i] ); + Time.push_back( SiLi_T_vect[i] ); + } - } +} //////////////////////////////////////////////////////////////////////////////// diff --git a/NPLib/Detectors/SiLi/TSiLiPhysics.h b/NPLib/Detectors/SiLi/TSiLiPhysics.h index 9c4ca023b13c4418d3fc4455c4b7ec15182efe68..9f14ec5243dec252b1dc3395eed7022abc656efb 100644 --- a/NPLib/Detectors/SiLi/TSiLiPhysics.h +++ b/NPLib/Detectors/SiLi/TSiLiPhysics.h @@ -35,6 +35,7 @@ class TSiLiSpectra; #include "TSiLiSpectra.h" #include "NPVDetector.h" #include "NPCalibrationManager.h" +#include "NPInputParser.h" class TSiLiPhysics : public TObject, public NPL::VDetector { @@ -53,7 +54,7 @@ class TSiLiPhysics : public TObject, public NPL::VDetector public: // inherrited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManger diff --git a/NPLib/Detectors/SiRes/TSiResPhysics.cxx b/NPLib/Detectors/SiRes/TSiResPhysics.cxx index 10c84c3b37c5713eabd675d7fa68371a883c52fe..e22bac6dee568f18087cdf8f997b86ace681f71b 100644 --- a/NPLib/Detectors/SiRes/TSiResPhysics.cxx +++ b/NPLib/Detectors/SiRes/TSiResPhysics.cxx @@ -25,7 +25,7 @@ #include "RootOutput.h" #include "RootInput.h" #include "NPDetectorFactory.h" - +#include "NPOptionManager.h" // STL #include <iostream> #include <sstream> @@ -76,120 +76,31 @@ void TSiResPhysics::Clear() } /////////////////////////////////////////////////////////////////////////// -void TSiResPhysics::ReadConfiguration(string Path) - { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - bool check_Thickness = false ; - bool check_Height = false ; - bool check_Width = false ; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - bool ReadingStatus = false ; - - while (!ConfigFile.eof()) - { - - getline(ConfigFile, LineBuffer); - - // If line is a Start Up SiRes bloc, Reading toggle to true - if (LineBuffer.compare(0, 5, "SiRes") == 0) - { - cout << "///" << endl ; - cout << "SiRes found: " << endl ; - ReadingStatus = true ; - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus) - { - // Pickup Next Word - ConfigFile >> DataBuffer ; +void TSiResPhysics::ReadConfiguration(NPL::InputParser parser) { - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("SiRes"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 5, "SiRes") == 0) { - cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << endl ; - ReadingStatus = false ; - } - - //Position method - else if (DataBuffer=="X=") { - check_X = true; - ConfigFile >> DataBuffer ; - cout << "X: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } + vector<string> token = {"X","Y","Z","Width","Height","Thickness"}; - else if (DataBuffer=="Y=") { - check_Y = true; - ConfigFile >> DataBuffer ; - cout << "Y: " << atof( DataBuffer.c_str() ) << "mm"<< endl; - } - - else if (DataBuffer=="Z=") { - check_Z = true; - ConfigFile >> DataBuffer ; - cout << "Z: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - - - // Squared shape - else if (DataBuffer=="Width=") { - check_Width = true; - ConfigFile >> DataBuffer ; - cout << "SiRes Width: " <<atof( DataBuffer.c_str() ) << "mm" << endl; - } - - else if (DataBuffer== "Height=") { - check_Height = true; - ConfigFile >> DataBuffer ; - cout << "SiRes Height: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - // Common - else if (DataBuffer=="Thickness=") { - check_Thickness = true; - ConfigFile >> DataBuffer ; - cout << "SiRes Thickness: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else - {ReadingStatus = false; cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ;} - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if ( check_Thickness && check_Height && check_Width && check_X && check_Y && check_Z ) - { - NumberOfDetector++; - - // Reinitialisation of Check Boolean - check_Thickness = false ; - check_Height = false ; - check_Width = false ; - check_X = false ; - check_Y = false ; - check_Z = false ; - ReadingStatus = false ; - cout << "///"<< endl ; - } - } - } - } + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// SiRes " << i+1 << endl; + double X = blocks[i]->GetDouble("X","mm"); + double Y = blocks[i]->GetDouble("Y","mm"); + double Z = blocks[i]->GetDouble("Z","mm"); + double Width = blocks[i]->GetDouble("Width","mm"); + double Height = blocks[i]->GetDouble("Height","mm"); + double Thickness = blocks[i]->GetDouble("Thickness","mm"); + } + else{ + cout << "Warning: check your input file formatting " << endl; + } + } +} /////////////////////////////////////////////////////////////////////////// void TSiResPhysics::AddParameterToCalibrationManager() { diff --git a/NPLib/Detectors/SiRes/TSiResPhysics.h b/NPLib/Detectors/SiRes/TSiResPhysics.h index 492402f86a1c7b4d463bcc514f3e562f5c090714..a67a1db8dc15169be8bc17f46d91269eacd96408 100644 --- a/NPLib/Detectors/SiRes/TSiResPhysics.h +++ b/NPLib/Detectors/SiRes/TSiResPhysics.h @@ -35,7 +35,7 @@ class TSiResSpectra; #include "TSiResSpectra.h" #include "NPVDetector.h" #include "NPCalibrationManager.h" - +#include "NPInputParser.h" class TSiResPhysics : public TObject, public NPL::VDetector { public: // Constructor and Destructor @@ -57,7 +57,7 @@ class TSiResPhysics : public TObject, public NPL::VDetector public: // inherrited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManger diff --git a/NPLib/Detectors/SplitPole/TSplitPolePhysics.cxx b/NPLib/Detectors/SplitPole/TSplitPolePhysics.cxx index 50daf2a8e5344e0968d802c073c992ccc83d20f5..17d3e235b628af12ec77820f87697e532fa65daa 100644 --- a/NPLib/Detectors/SplitPole/TSplitPolePhysics.cxx +++ b/NPLib/Detectors/SplitPole/TSplitPolePhysics.cxx @@ -38,6 +38,7 @@ using namespace std; #include "RootInput.h" #include "NPDetectorFactory.h" #include "NPCalibrationManager.h" +#include "NPOptionManager.h" // ROOT #include "TChain.h" @@ -101,47 +102,27 @@ void TSplitPolePhysics::Clear() /////////////////////////////////////////////////////////////////////////// -void TSplitPolePhysics::ReadConfiguration(string Path) -{ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer, DataBuffer; +void TSplitPolePhysics::ReadConfiguration(NPL::InputParser parser) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("SplitPole"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; - bool ReadingStatus = false; - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); + vector<string> token = {""}; - // If SplitPole detector found, toggle Reading Block Status - if (LineBuffer.compare(0, 9, "SplitPole") == 0) { - cout << "Detector found: " << endl; - ReadingStatus = true; - } - // else don't toggle to Reading Block Status - else ReadingStatus = false; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + /* if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// XXX " << i+1 << endl; + } - // Reading Block - while (ReadingStatus) { - // Pickup Next Word - ConfigFile >> DataBuffer; + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + }*/ + } - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) {ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 9, "SplitPole") == 0) { - cout << "WARNING: Another Telescope is find before standard sequence of Token, Error may occured in Telecope definition" << endl; - ReadingStatus = false; - } - - // If no Detector Token and no comment, toggle out - else { - ReadingStatus = false; -// cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl; - } - } - } - // read specific SplitPole configuration parameters ReadAnalysisConfig(); diff --git a/NPLib/Detectors/SplitPole/TSplitPolePhysics.h b/NPLib/Detectors/SplitPole/TSplitPolePhysics.h index 779fc3787aa70da7c7d31ec7e759e3cdb8c1832c..af6d05855971925967f03fc00ce08b94c4e02820 100644 --- a/NPLib/Detectors/SplitPole/TSplitPolePhysics.h +++ b/NPLib/Detectors/SplitPole/TSplitPolePhysics.h @@ -37,6 +37,7 @@ using namespace std; #include "TSplitPoleNMR.h" #include "TSplitPoleSpectra.h" #include "NPVDetector.h" +#include "NPInputParser.h" // forward declaration class TSplitPoleSpectra; @@ -91,7 +92,7 @@ class TSplitPolePhysics : public TObject, public NPL::VDetector public: // inherited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/Detectors/TRex/TTRexPhysics.cxx b/NPLib/Detectors/TRex/TTRexPhysics.cxx index ba614c410b411ea9b26b93239028e1d0b4b695c9..f4c52530f60c0a9c474d413f36f7b596d4a11b2c 100644 --- a/NPLib/Detectors/TRex/TTRexPhysics.cxx +++ b/NPLib/Detectors/TRex/TTRexPhysics.cxx @@ -6,7 +6,7 @@ *****************************************************************************/ /***************************************************************************** - * Original Author: Adrien Matta contact address: a.matta@surrey.ac.uk * + * Original Author: Adrien Matta contact address: matta@lpccaen.in2p3.fr * * * * Creation Date : January 2016 * * Last update : * @@ -34,7 +34,7 @@ using namespace std; #include "RootInput.h" #include "RootOutput.h" #include "NPDetectorFactory.h" - +#include "NPOptionManager.h" // ROOT #include "TChain.h" ClassImp(TTRexPhysics) @@ -83,10 +83,10 @@ void TTRexPhysics::BuildPhysicalEvent() { } } if(checkTime) - Time.push_back(tt); + Time.push_back(tt); else Time.push_back(-1000); - + bool checkPAD = false; double pp; // Look for associated time @@ -97,7 +97,7 @@ void TTRexPhysics::BuildPhysicalEvent() { } } if(checkPAD) - PAD_E.push_back(pp); + PAD_E.push_back(pp); else PAD_E.push_back(-1000); } @@ -245,103 +245,30 @@ void TTRexPhysics::Clear() { /////////////////////////////////////////////////////////////////////////// -void TTRexPhysics::ReadConfiguration(string Path) { - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer; - string DataBuffer; - - double X,Y,Z; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - bool ReadingStatus = false ; - - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Start Up TRex bloc, Reading toggle to true - string name = "TRex"; - - if (LineBuffer.compare(0, name.length(), name) == 0) { - cout << "///" << endl ; - cout << "TRex found: " << endl ; - ReadingStatus = true ; +void TTRexPhysics::ReadConfiguration(NPL::InputParser parser) { + + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("TRex"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " Detector found " << endl; + + vector<string> token = {"X","Y","Z"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + double X = blocks[i]->GetDouble("X","mm"); + double Y = blocks[i]->GetDouble("Y","mm"); + double Z = blocks[i]->GetDouble("Z","mm"); + AddBarrelDetector(X,Y,Z); + if(blocks[i]->HasToken("Chamber")) + blocks[i]->GetInt("Chamber"); } - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, name.length(),name) == 0) { - cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << endl ; - ReadingStatus = false ; - } - - //Position method - else if (DataBuffer.compare(0, 2, "X=") == 0) { - check_X = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - X = X ; - cout << "X: " << X << endl; - } - - else if (DataBuffer.compare(0, 2, "Y=") == 0) { - check_Y = true; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - Y = Y ; - cout << "Y: " << Y << endl; - } - - else if (DataBuffer.compare(0, 2, "Z=") == 0) { - check_Z = true; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - Z = Z ; - cout << "Z: " << Z << endl; - } - - else if (DataBuffer.compare(0, 8, "Chamber=") == 0) { - ConfigFile >> DataBuffer ; - } - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; - cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_X && check_Y && check_Z){ - // Convert Cartesian to Spherical (detector always face the target) - AddBarrelDetector(X,Y,Z); - - // Reinitialisation of Check Boolean - check_X = false ; - check_Y = false ; - check_Z = false ; - ReadingStatus = false ; - cout << "///"<< endl ; - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } } - /////////////////////////////////////////////////////////////////////////// void TTRexPhysics::InitSpectra() { m_Spectra = new TTRexSpectra(m_NumberOfDetectors); @@ -387,10 +314,10 @@ void TTRexPhysics::AddBarrelDetector(double X, double Y, double Z){ m_NumberOfDetectors++; double StripPitchFront= 50/16.; double StripPitchBack= 50/16.; - + // Half the length of the wafer (square wafer) - double A = (50-StripPitchFront)*0.5; - double B = (50-StripPitchBack)*0.5; + double A = (50-StripPitchFront)*0.5; + double B = (50-StripPitchBack)*0.5; double Zc=0; if(Z<0){// Up Stream Zc = Z +B; @@ -504,11 +431,11 @@ TVector3 TTRexPhysics::GetPositionOfInteraction(const int& i,bool random) const{ Position = TVector3 ( GetStripPositionX( DetectorNumber[i], Strip_Front[i], Strip_Back[i] ), GetStripPositionY( DetectorNumber[i] , Strip_Front[i], Strip_Back[i] ), GetStripPositionZ( DetectorNumber[i] , Strip_Front[i], Strip_Back[i] )) ; - + if(random){ return Position; } - + return Position ; } diff --git a/NPLib/Detectors/TRex/TTRexPhysics.h b/NPLib/Detectors/TRex/TTRexPhysics.h index 1333aafb36b455ef6fb3241dc2cd52258e635450..2d0dde6580fee27eca448e028556c2850c0f6c6d 100644 --- a/NPLib/Detectors/TRex/TTRexPhysics.h +++ b/NPLib/Detectors/TRex/TTRexPhysics.h @@ -1,20 +1,20 @@ #ifndef TTRexPHYSICS_H #define TTRexPHYSICS_H /***************************************************************************** - * Copyright (C) 2009-2016 this file is part of the NPTool Project * + * Copyright (C) 2009-2016 this file is part of the NPTool Project * * * * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * * For the list of contributors see $NPTOOL/Licence/Contributors * *****************************************************************************/ /***************************************************************************** - * Original Author: Adrien Matta contact address: a.matta@surrey.ac.uk * + * Original Author: Adrien Matta contact address: a.matta@surrey.ac.uk * * * - * Creation Date : January 2016 * + * Creation Date : January 2016 * * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class hold TRex Raw data * + * This class hold TRex Raw data * * * *---------------------------------------------------------------------------* * Comment: * @@ -39,6 +39,7 @@ using namespace std; #include "TTRexSpectra.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" +#include "NPInputParser.h" // forward declaration class TTRexSpectra; @@ -76,7 +77,7 @@ class TTRexPhysics : public TObject, public NPL::VDetector { // methods inherited from the VDetector ABC class public: // read stream from ConfigFile to pick-up detector parameters - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // add parameters to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/Detectors/Tiara/TTiaraBarrelPhysics.cxx b/NPLib/Detectors/Tiara/TTiaraBarrelPhysics.cxx index 801585e52f3d878e742fc4dc1d2cf2871c2f554f..c08f8f74591de4763b5898f32b3c9575d23975a2 100644 --- a/NPLib/Detectors/Tiara/TTiaraBarrelPhysics.cxx +++ b/NPLib/Detectors/Tiara/TTiaraBarrelPhysics.cxx @@ -205,145 +205,6 @@ bool TTiaraBarrelPhysics :: IsValidChannel(const string DetectorType, const int /////////////////////////////////////////////////////////////////////////// void TTiaraBarrelPhysics::ReadAnalysisConfig(){ - /* bool ReadingStatus = false; - - // path to file - string FileName = "./configs/ConfigTiaraBarrel.dat"; - - // open analysis config file - ifstream AnalysisConfigFile; - AnalysisConfigFile.open(FileName.c_str()); - - if (!AnalysisConfigFile.is_open()) { - cout << " No ConfigTiaraBarrel.dat found: Default parameter loaded for Analayis " << FileName << endl; - return; - } - cout << " Loading user parameter for Analysis from ConfigTiaraBarrel.dat " << endl; - - // Save it in a TAsciiFile - TAsciiFile* asciiConfig = RootOutput::getInstance()->GetAsciiFileAnalysisConfig(); - asciiConfig->AppendLine("%%% ConfigTiaraBarrel.dat %%%"); - asciiConfig->Append(FileName.c_str()); - asciiConfig->AppendLine(""); - // read analysis config file - string LineBuffer,DataBuffer,whatToDo; - while (!AnalysisConfigFile.eof()) { - // Pick-up next line - getline(AnalysisConfigFile, LineBuffer); - - // search for "header" - if (LineBuffer.compare(0, 11, "ConfigTiaraBarrel") == 0) ReadingStatus = true; - - // loop on tokens and data - while (ReadingStatus ) { - - whatToDo=""; - AnalysisConfigFile >> whatToDo; - - // Search for comment symbol (%) - if (whatToDo.compare(0, 1, "%") == 0) { - AnalysisConfigFile.ignore(numeric_limits<streamsize>::max(), '\n' ); - } - - else if (whatToDo=="MAX_STRIP_MULTIPLICITY") { - AnalysisConfigFile >> DataBuffer; - m_MaximumStripMultiplicityAllowed = atoi(DataBuffer.c_str() ); - cout << "MAXIMUN STRIP MULTIPLICITY " << m_MaximumStripMultiplicityAllowed << endl; - } - - else if (whatToDo=="STRIP_ENERGY_MATCHING_SIGMA") { - AnalysisConfigFile >> DataBuffer; - m_StripEnergyMatchingSigma = atof(DataBuffer.c_str() ); - cout << "STRIP ENERGY MATCHING SIGMA " << m_StripEnergyMatchingSigma <<endl; - } - - else if (whatToDo=="STRIP_ENERGY_MATCHING_NUMBER_OF_SIGMA") { - AnalysisConfigFile >> DataBuffer; - m_StripEnergyMatchingNumberOfSigma = atoi(DataBuffer.c_str() ); - cout << "STRIP ENERGY MATCHING NUMBER OF SIGMA " << m_StripEnergyMatchingNumberOfSigma << endl; - } - - else if (whatToDo== "DISABLE_ALL") { - AnalysisConfigFile >> DataBuffer; - cout << whatToDo << " " << DataBuffer << endl; - int Detector = atoi(DataBuffer.substr(2,1).c_str()); - vector< bool > ChannelStatus; - ChannelStatus.resize(24,false); - m_RingChannelStatus[Detector-1] = ChannelStatus; - ChannelStatus.resize(48,false); - m_SectorChannelStatus[Detector-1] = ChannelStatus; - } - - else if (whatToDo == "DISABLE_CHANNEL") { - AnalysisConfigFile >> DataBuffer; - cout << whatToDo << " " << DataBuffer << endl; - int Detector = atoi(DataBuffer.substr(2,1).c_str()); - int channel = -1; - if (DataBuffer.compare(3,4,"STRF") == 0) { - channel = atoi(DataBuffer.substr(7).c_str()); - *(m_RingChannelStatus[Detector-1].begin()+channel-1) = false; - } - - else if (DataBuffer.compare(3,4,"STRB") == 0) { - channel = atoi(DataBuffer.substr(7).c_str()); - *(m_SectorChannelStatus[Detector-1].begin()+channel-1) = false; - } - - else cout << "Warning: detector type for TiaraBarrel unknown!" << endl; - -} - -else if (whatToDo=="TAKE_E_RING") { - m_Take_E_Ring = true; - cout << whatToDo << endl; -} - -else if (whatToDo=="TAKE_E_SECTOR") { - m_Take_E_Ring = false; - cout << whatToDo << endl; -} - -else if (whatToDo=="TAKE_T_RING") { - m_Take_T_Sector = false; - cout << whatToDo << endl; -} - -else if (whatToDo=="TAKE_T_SECTOR") { - m_Take_T_Sector = true; - cout << whatToDo << endl; -} - -else if (whatToDo=="STRIP_RING_E_RAW_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_StripRing_E_RAW_Threshold = atoi(DataBuffer.c_str()); - cout << whatToDo << " " << m_StripRing_E_RAW_Threshold << endl; -} - -else if (whatToDo=="STRIP_SECTOR_E_RAW_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_StripSector_E_RAW_Threshold = atoi(DataBuffer.c_str()); - cout << whatToDo << " " << m_StripSector_E_RAW_Threshold << endl; -} - -else if (whatToDo=="STRIP_RING_E_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_StripRing_E_Threshold = atoi(DataBuffer.c_str()); - cout << whatToDo << " " << m_StripRing_E_Threshold << endl; -} - -else if (whatToDo=="STRIP_SECTOR_THRESHOLD") { - AnalysisConfigFile >> DataBuffer; - m_StripSector_E_Threshold = atoi(DataBuffer.c_str()); - cout << whatToDo << " " << m_StripSector_E_Threshold << endl; -} - -else { - ReadingStatus = false; -} - -} -} -*/ } /////////////////////////////////////////////////////////////////////////// @@ -372,375 +233,301 @@ void TTiaraBarrelPhysics::Clear(){ //// Innherited from VDetector Class //// /////////////////////////////////////////////////////////////////////////// -void TTiaraBarrelPhysics::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double X,Y,Z; - X = 0 ; Y = 0 ; Z = 0; - TVector3 Pos; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - - bool ReadingStatusStrip = false ; - bool ReadingStatus = false ; - - bool VerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); ; - - - //while (getline(ConfigFile, LineBuffer)){ - while (!ConfigFile.eof()){ - - getline(ConfigFile, LineBuffer); - // cout << LineBuffer << endl; - if (LineBuffer.find("TiaraInnerBarrel") != std::string::npos) - ReadingStatus = true; - - while (ReadingStatus && !ConfigFile.eof()) { - check_X=true; check_Y=true ; check_Z=true; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } +void TTiaraBarrelPhysics::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithTokenAndValue("Tiara","Barrel"); - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////something here? - - // // Barrel case - // if (DataBuffer=="TiaraBarrelStrip"){ - // if(VerboseLevel) cout << "///" << endl ; - // if(VerboseLevel) cout << "Detector found: " << endl ; - // ReadingStatusStrip = true ; - // } - - // // Reading Block - // while(ReadingStatusStrip){ - // // Pickup Next Word - // ConfigFile >> DataBuffer ; - - // // Comment Line - // if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // //Position method - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////end of something here? - - // else if (DataBuffer == "X=") { - // check_X = true; - // ConfigFile >> DataBuffer ; - // X= atof(DataBuffer.c_str()); - // if(VerboseLevel) cout << " X= " << X << "mm" << endl; - // } - - // else if (DataBuffer == "Y=") { - // check_Y = true; - // ConfigFile >> DataBuffer ; - // Y= atof(DataBuffer.c_str()); - // if(VerboseLevel) cout << " Y= " << Y << "mm" << endl; - // } - - // else if (DataBuffer == "Z=") { - // check_Z = true; - // ConfigFile >> DataBuffer ; - // Z= atof(DataBuffer.c_str()); - // if(VerboseLevel) cout << " Z= " << Z << "deg" << endl; - // } - - // else if (DataBuffer == "ThicknessDector=") { - // /*ignore that*/ - // } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else { - } + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; - ///////////////////////////////////////////////// - // If All necessary information there, toggle out + vector<string> token = {"InnerBarrel","OuterBarrel","Chamber"}; - if (check_X && check_Y && check_Z){ - ReadingStatus= false; - AddDetector(X,Y,Z); - // Reinitialisation of Check Boolean - check_X = false ; - check_Y = false ; - check_Z = false ; - } - } + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Barrel " << i+1 << endl; + int inner = blocks[i]->GetInt("InnerBarrel"); + int outer = blocks[i]->GetInt("OuterBarrel"); + int chamber = blocks[i]->GetInt("Chamber"); } - InitializeStandardParameter(); - ReadAnalysisConfig(); - } - /////////////////////////////////////////////////////////////////////////// - void TTiaraBarrelPhysics::InitSpectra(){ - m_Spectra = new TTiaraBarrelSpectra(m_NumberOfDetector); - } - /////////////////////////////////////////////////////////////////////////// - void TTiaraBarrelPhysics::FillSpectra(){ - m_Spectra -> FillRawSpectra(m_EventData); - m_Spectra -> FillPreTreatedSpectra(m_PreTreatedData); - m_Spectra -> FillPhysicsSpectra(m_EventPhysics); - } - /////////////////////////////////////////////////////////////////////////// - void TTiaraBarrelPhysics::CheckSpectra(){ - // To be done - } - /////////////////////////////////////////////////////////////////////////// - void TTiaraBarrelPhysics::ClearSpectra(){ - // To be done - } - /////////////////////////////////////////////////////////////////////////// - map< string,TH1* > TTiaraBarrelPhysics::GetSpectra() { - if(m_Spectra) - return m_Spectra->GetMapHisto(); else{ - map< string,TH1* > empty; - return empty; + cout << "ERROR: check your input file formatting " << endl; + exit(1); } + } - } - /////////////////////////////////////////////////////////////////////////// - void TTiaraBarrelPhysics::AddParameterToCalibrationManager(){ - CalibrationManager* Cal = CalibrationManager::getInstance(); - // E and T - for(int i = 0 ; i < m_NumberOfDetector ; ++i){ - for( int j = 0 ; j < 4 ; ++j){ - Cal->AddParameter("TIARABARREL","B"+NPL::itoa(i+1)+"_UPSTREAM"+NPL::itoa(j+1)+"_E","TIARABARREL_B"+NPL::itoa(i+1)+"_UPSTREAM"+NPL::itoa(j+1)+"_E") ; - Cal->AddParameter("TIARABARREL","B"+NPL::itoa(i+1)+"_DOWNSTREAM"+NPL::itoa(j+1)+"_E","TIARABARREL_B"+NPL::itoa(i+1)+"_DOWNSTREAM"+NPL::itoa(j+1)+"_E") ; + InitializeStandardParameter(); + ReadAnalysisConfig(); +} +/////////////////////////////////////////////////////////////////////////// +void TTiaraBarrelPhysics::InitSpectra(){ + m_Spectra = new TTiaraBarrelSpectra(m_NumberOfDetector); +} - Cal->AddParameter("TIARABARREL","MATCHSTICK_B"+NPL::itoa(i+1)+"_UPSTREAM"+NPL::itoa(j+1)+"_E","TIARABARREL_MATCHSTICK_B"+NPL::itoa(i+1)+"_UPSTREAM"+NPL::itoa(j+1)+"_E") ; - Cal->AddParameter("TIARABARREL","MATCHSTICK_B"+NPL::itoa(i+1)+"_DOWNSTREAM"+NPL::itoa(j+1)+"_E","TIARABARREL_MATCHSTICK_B"+NPL::itoa(i+1)+"_DOWNSTREAM"+NPL::itoa(j+1)+"_E") ; +/////////////////////////////////////////////////////////////////////////// +void TTiaraBarrelPhysics::FillSpectra(){ + m_Spectra -> FillRawSpectra(m_EventData); + m_Spectra -> FillPreTreatedSpectra(m_PreTreatedData); + m_Spectra -> FillPhysicsSpectra(m_EventPhysics); +} +/////////////////////////////////////////////////////////////////////////// +void TTiaraBarrelPhysics::CheckSpectra(){ + // To be done +} +/////////////////////////////////////////////////////////////////////////// +void TTiaraBarrelPhysics::ClearSpectra(){ + // To be done +} +/////////////////////////////////////////////////////////////////////////// +map< string,TH1* > TTiaraBarrelPhysics::GetSpectra() { + if(m_Spectra) + return m_Spectra->GetMapHisto(); + else{ + map< string,TH1* > empty; + return empty; + } - Cal->AddParameter("TIARABARREL","BALLISTIC_B"+NPL::itoa(i+1)+"_STRIP"+NPL::itoa(j+1),"TIARABARREL_BALLISTIC_B"+NPL::itoa(i+1)+"_STRIP"+NPL::itoa(j+1)) ; - Cal->AddParameter("TIARABARREL","B"+NPL::itoa(i+1)+"_STRIP"+NPL::itoa(j+1)+"_POS","TIARABARREL_B"+NPL::itoa(i+1)+"_STRIP"+NPL::itoa(j+1)+"_POS") ; +} +/////////////////////////////////////////////////////////////////////////// +void TTiaraBarrelPhysics::AddParameterToCalibrationManager(){ + CalibrationManager* Cal = CalibrationManager::getInstance(); + // E and T + for(int i = 0 ; i < m_NumberOfDetector ; ++i){ + for( int j = 0 ; j < 4 ; ++j){ + Cal->AddParameter("TIARABARREL","B"+NPL::itoa(i+1)+"_UPSTREAM"+NPL::itoa(j+1)+"_E","TIARABARREL_B"+NPL::itoa(i+1)+"_UPSTREAM"+NPL::itoa(j+1)+"_E") ; + Cal->AddParameter("TIARABARREL","B"+NPL::itoa(i+1)+"_DOWNSTREAM"+NPL::itoa(j+1)+"_E","TIARABARREL_B"+NPL::itoa(i+1)+"_DOWNSTREAM"+NPL::itoa(j+1)+"_E") ; - } + Cal->AddParameter("TIARABARREL","MATCHSTICK_B"+NPL::itoa(i+1)+"_UPSTREAM"+NPL::itoa(j+1)+"_E","TIARABARREL_MATCHSTICK_B"+NPL::itoa(i+1)+"_UPSTREAM"+NPL::itoa(j+1)+"_E") ; + Cal->AddParameter("TIARABARREL","MATCHSTICK_B"+NPL::itoa(i+1)+"_DOWNSTREAM"+NPL::itoa(j+1)+"_E","TIARABARREL_MATCHSTICK_B"+NPL::itoa(i+1)+"_DOWNSTREAM"+NPL::itoa(j+1)+"_E") ; - Cal->AddParameter("TIARABARREL","TIARABARREL/B" + NPL::itoa( i+1 ) + "_BACK_E","TIARABARREL_B" + NPL::itoa( i+1 ) + "_BACK_E"); + Cal->AddParameter("TIARABARREL","BALLISTIC_B"+NPL::itoa(i+1)+"_STRIP"+NPL::itoa(j+1),"TIARABARREL_BALLISTIC_B"+NPL::itoa(i+1)+"_STRIP"+NPL::itoa(j+1)) ; + Cal->AddParameter("TIARABARREL","B"+NPL::itoa(i+1)+"_STRIP"+NPL::itoa(j+1)+"_POS","TIARABARREL_B"+NPL::itoa(i+1)+"_STRIP"+NPL::itoa(j+1)+"_POS") ; } - return; - } + Cal->AddParameter("TIARABARREL","TIARABARREL/B" + NPL::itoa( i+1 ) + "_BACK_E","TIARABARREL_B" + NPL::itoa( i+1 ) + "_BACK_E"); - /////////////////////////////////////////////////////////////////////////////// - void TTiaraBarrelPhysics::InitializeRootInputRaw(){ - TChain* inputChain = RootInput::getInstance()->GetChain(); - inputChain->SetBranchStatus( "TiaraBarrel" , true ); - inputChain->SetBranchStatus( "fTiaraBarrel_*" , true ); - inputChain->SetBranchAddress( "TiaraBarrel" , &m_EventData ); } + return; - /////////////////////////////////////////////////////////////////////////////// - void TTiaraBarrelPhysics::InitializeRootInputPhysics(){ - TChain* inputChain = RootInput::getInstance()->GetChain(); - inputChain->SetBranchStatus("TiaraBarrel" , true ); - inputChain->SetBranchStatus("EventMultiplicity",true); - inputChain->SetBranchStatus("DetectorNumber",true); - inputChain->SetBranchStatus("Strip_E",true); - inputChain->SetBranchStatus("Strip_T",true); - inputChain->SetBranchStatus("Strip_N",true); - inputChain->SetBranchStatus("Strip_Pos",true); - inputChain->SetBranchStatus("DownStream_E",true); - inputChain->SetBranchStatus("DownStream_T",true); - inputChain->SetBranchStatus("UpStream_E",true); - inputChain->SetBranchStatus("UpStream_T",true); - inputChain->SetBranchStatus("Back_E",true); - inputChain->SetBranchStatus("Back_T",true); - inputChain->SetBranchStatus("Outer_Strip_E",true); - inputChain->SetBranchStatus("Outer_Strip_T",true); - inputChain->SetBranchStatus("Outer_Strip_N",true); - inputChain->SetBranchStatus("Outer_Back_E",true); - inputChain->SetBranchStatus("Outer_Back_T",true); - inputChain->SetBranchAddress("TiaraBarrel" , &m_EventPhysics ); - - } +} - /////////////////////////////////////////////////////////////////////////////// - void TTiaraBarrelPhysics::InitializeRootOutput(){ - TTree* outputTree = RootOutput::getInstance()->GetTree(); - outputTree->Branch( "TiaraBarrel" , "TTiaraBarrelPhysics" , &m_EventPhysics ); - } +/////////////////////////////////////////////////////////////////////////////// +void TTiaraBarrelPhysics::InitializeRootInputRaw(){ + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus( "TiaraBarrel" , true ); + inputChain->SetBranchStatus( "fTiaraBarrel_*" , true ); + inputChain->SetBranchAddress( "TiaraBarrel" , &m_EventData ); +} - ///// Specific to TiaraBarrelArray //// - void TTiaraBarrelPhysics::AddDetector(double X,double Y,double Z){ - cout << "Adding Tiara Barrel centered at : ("<<X<<";"<<Y<<";"<<Z<<")"<<endl; +/////////////////////////////////////////////////////////////////////////////// +void TTiaraBarrelPhysics::InitializeRootInputPhysics(){ + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus("TiaraBarrel" , true ); + inputChain->SetBranchStatus("EventMultiplicity",true); + inputChain->SetBranchStatus("DetectorNumber",true); + inputChain->SetBranchStatus("Strip_E",true); + inputChain->SetBranchStatus("Strip_T",true); + inputChain->SetBranchStatus("Strip_N",true); + inputChain->SetBranchStatus("Strip_Pos",true); + inputChain->SetBranchStatus("DownStream_E",true); + inputChain->SetBranchStatus("DownStream_T",true); + inputChain->SetBranchStatus("UpStream_E",true); + inputChain->SetBranchStatus("UpStream_T",true); + inputChain->SetBranchStatus("Back_E",true); + inputChain->SetBranchStatus("Back_T",true); + inputChain->SetBranchStatus("Outer_Strip_E",true); + inputChain->SetBranchStatus("Outer_Strip_T",true); + inputChain->SetBranchStatus("Outer_Strip_N",true); + inputChain->SetBranchStatus("Outer_Back_E",true); + inputChain->SetBranchStatus("Outer_Back_T",true); + inputChain->SetBranchAddress("TiaraBarrel" , &m_EventPhysics ); - m_NumberOfDetector+=8; +} - /* - double StripPitchSector = (Wedge_Phi_Max-Wedge_Phi_Min)/Wedge_Sector_NumberOfStrip ; - double StripPitchRing = (Wedge_R_Max-Wedge_R_Min)/Wedge_Ring_NumberOfStrip ; +/////////////////////////////////////////////////////////////////////////////// +void TTiaraBarrelPhysics::InitializeRootOutput(){ + TTree* outputTree = RootOutput::getInstance()->GetTree(); + outputTree->Branch( "TiaraBarrel" , "TTiaraBarrelPhysics" , &m_EventPhysics ); +} - TVector3 Strip_1_1; +///// Specific to TiaraBarrelArray //// +void TTiaraBarrelPhysics::AddDetector(double X,double Y,double Z){ + cout << "Adding Tiara Barrel centered at : ("<<X<<";"<<Y<<";"<<Z<<")"<<endl; - m_NumberOfDetector++; - Strip_1_1=TVector3(0,0,Z); + m_NumberOfDetector+=8; - // Buffer object to fill Position Array - vector<double> lineX ; vector<double> lineY ; vector<double> lineZ ; + /* + double StripPitchSector = (Wedge_Phi_Max-Wedge_Phi_Min)/Wedge_Sector_NumberOfStrip ; + double StripPitchRing = (Wedge_R_Max-Wedge_R_Min)/Wedge_Ring_NumberOfStrip ; - vector< vector< double > > OneWedgeStripPositionX ; - vector< vector< double > > OneWedgeStripPositionY ; - vector< vector< double > > OneWedgeStripPositionZ ; + TVector3 Strip_1_1; - TVector3 StripCenter = Strip_1_1; - for(int f = 0 ; f < Wedge_Ring_NumberOfStrip ; f++){ - lineX.clear() ; - lineY.clear() ; - lineZ.clear() ; + m_NumberOfDetector++; + Strip_1_1=TVector3(0,0,Z); - for(int b = 0 ; b < Wedge_Sector_NumberOfStrip ; b++){ - StripCenter = Strip_1_1; - StripCenter.SetY(Wedge_R_Max-f*StripPitchRing); - StripCenter.SetZ(Z); - StripCenter.RotateZ(Phi+Wedge_Phi_Min+b*StripPitchSector); - lineX.push_back( StripCenter.X() ); - lineY.push_back( StripCenter.Y() ); - lineZ.push_back( StripCenter.Z() ); - } - OneWedgeStripPositionX.push_back(lineX); - OneWedgeStripPositionY.push_back(lineY); - OneWedgeStripPositionZ.push_back(lineZ); - } - m_StripPositionX.push_back( OneWedgeStripPositionX ) ; - m_StripPositionY.push_back( OneWedgeStripPositionY ) ; - m_StripPositionZ.push_back( OneWedgeStripPositionZ ) ; + // Buffer object to fill Position Array + vector<double> lineX ; vector<double> lineY ; vector<double> lineZ ; - return;*/ - } - /////////////////////////////////////////////////////////////////////////////// - TVector3 TTiaraBarrelPhysics::GetDetectorNormal( const int i) const{ + vector< vector< double > > OneWedgeStripPositionX ; + vector< vector< double > > OneWedgeStripPositionY ; + vector< vector< double > > OneWedgeStripPositionZ ; - return (TVector3(0,0,i)); + TVector3 StripCenter = Strip_1_1; + for(int f = 0 ; f < Wedge_Ring_NumberOfStrip ; f++){ + lineX.clear() ; + lineY.clear() ; + lineZ.clear() ; + for(int b = 0 ; b < Wedge_Sector_NumberOfStrip ; b++){ + StripCenter = Strip_1_1; + StripCenter.SetY(Wedge_R_Max-f*StripPitchRing); + StripCenter.SetZ(Z); + StripCenter.RotateZ(Phi+Wedge_Phi_Min+b*StripPitchSector); + lineX.push_back( StripCenter.X() ); + lineY.push_back( StripCenter.Y() ); + lineZ.push_back( StripCenter.Z() ); } - /////////////////////////////////////////////////////////////////////////////// - TVector3 TTiaraBarrelPhysics::GetPositionOfInteraction(const int i) const{ - // All in mm - double INNERBARREL_PCB_Width = 27.76; - double INNERBARREL_ActiveWafer_Length = 94.80; - double INNERBARREL_ActiveWafer_Width = 24.0; - double StripPitch = INNERBARREL_ActiveWafer_Width/4.0; - - double X = (Strip_N[i]*StripPitch-0.5*INNERBARREL_ActiveWafer_Width)-(0.5*StripPitch); - double Y = INNERBARREL_PCB_Width*(0.5+sin(45*deg)); - double Z = Strip_Pos[i]*(0.5*INNERBARREL_ActiveWafer_Length); - //original version of the line above = double Z = (Strip_Pos[i]-0.5)*INNERBARREL_ActiveWafer_Length; - TVector3 POS(X,Y,-Z); - POS.RotateZ((DetectorNumber[i]-1)*45*deg); - return( POS ) ; + OneWedgeStripPositionX.push_back(lineX); + OneWedgeStripPositionY.push_back(lineY); + OneWedgeStripPositionZ.push_back(lineZ); } - /////////////////////////////////////////////////////////////////////////////// - TVector3 TTiaraBarrelPhysics::GetRandomisedPositionOfInteraction(const int i) const{ - TVector3 RandomPOS = GetPositionOfInteraction(i); - TVector3 v1(-12.0, 27.76*(0.5+sin(45*deg)), 0.0); // the numbers used in this line and the one below are related to those in lines 594-597 - TVector3 v2(12.0, 27.76*(0.5+sin(45*deg)), 0.0); - v1.RotateZ((DetectorNumber[i]-1)*45*deg); - v2.RotateZ((DetectorNumber[i]-1)*45*deg); - TVector3 u = (v2-v1).Unit(); - double RandomNumber = Random->Rndm(); - TVector3 DeltaHolder((RandomNumber*6.0)-3.0,(RandomNumber*6.0)-3.0,0.0); - TVector3 DeltaVector(u.X()*DeltaHolder.X(),u.Y()*DeltaHolder.Y(),u.Z()*DeltaHolder.Z()); - RandomPOS.SetXYZ(RandomPOS.X()+DeltaVector.X(),RandomPOS.Y()+DeltaVector.Y(),RandomPOS.Z()+DeltaVector.Z()); - return( RandomPOS ); - } - /////////////////////////////////////////////////////////////////////////////// - void TTiaraBarrelPhysics::InitializeStandardParameter(){ - /* // Enable all channel - vector< bool > ChannelStatus; - m_RingChannelStatus.clear() ; - m_SectorChannelStatus.clear() ; - - ChannelStatus.resize(16,true); - for(int i = 0 ; i < m_NumberOfDetector ; ++i){ - m_RingChannelStatus[i] = ChannelStatus; - } + m_StripPositionX.push_back( OneWedgeStripPositionX ) ; + m_StripPositionY.push_back( OneWedgeStripPositionY ) ; + m_StripPositionZ.push_back( OneWedgeStripPositionZ ) ; - ChannelStatus.resize(8,true); - for(int i = 0 ; i < m_NumberOfDetector ; ++i){ - m_SectorChannelStatus[i] = ChannelStatus; - } + return;*/ +} +/////////////////////////////////////////////////////////////////////////////// +TVector3 TTiaraBarrelPhysics::GetDetectorNormal( const int i) const{ - m_MaximumStripMultiplicityAllowed = m_NumberOfDetector ; - */ - return; - } - /////////////////////////////////////////////////////////////////////////////// - double TTiaraBarrelPhysics::Cal_Strip_Upstream_E(const int i){ - static string name; name ="TIARABARREL/B" ; - name+= NPL::itoa( m_EventData->GetFrontUpstreamEDetectorNbr(i) ) ; - name+= "_UPSTREAM" ; - name+= NPL::itoa( m_EventData->GetFrontUpstreamEStripNbr(i) ) ; - name+= "_E"; - return CalibrationManager::getInstance()->ApplyCalibration(name, - Match_Strip_Upstream_E(i) ); - } - /////////////////////////////////////////////////////////////////////////////// - double TTiaraBarrelPhysics::Cal_Strip_Downstream_E(const int i){ - static string name; name = "TIARABARREL/B" ; - name+= NPL::itoa( m_EventData->GetFrontDownstreamEDetectorNbr(i) ) ; - name+= "_DOWNSTREAM" ; - name+= NPL::itoa( m_EventData->GetFrontDownstreamEStripNbr(i) ) ; - name+= "_E"; - return CalibrationManager::getInstance()->ApplyCalibration(name, - Match_Strip_Downstream_E(i) ); - } - /////////////////////////////////////////////////////////////////////////////// - double TTiaraBarrelPhysics::Match_Strip_Upstream_E(const int i){ - static string name; name = "TIARABARREL/MATCHSTICK_B" ; - name+= NPL::itoa( m_EventData->GetFrontUpstreamEDetectorNbr(i) ) ; - name+= "_UPSTREAM" ; - name+= NPL::itoa( m_EventData->GetFrontUpstreamEStripNbr(i) ) ; - name+= "_E"; - return CalibrationManager::getInstance()->ApplyCalibration(name, - m_EventData->GetFrontUpstreamEEnergy(i) ); - } - /////////////////////////////////////////////////////////////////////////////// - double TTiaraBarrelPhysics::Match_Strip_Downstream_E(const int i){ - static string name; name ="TIARABARREL/MATCHSTICK_B" ; - name+= NPL::itoa( m_EventData->GetFrontDownstreamEDetectorNbr(i) ) ; - name+= "_DOWNSTREAM" ; - name+= NPL::itoa( m_EventData->GetFrontDownstreamEStripNbr(i) ) ; - name+= "_E"; - return CalibrationManager::getInstance()->ApplyCalibration(name, - m_EventData->GetFrontDownstreamEEnergy(i) ); - } - /////////////////////////////////////////////////////////////////////////////// - double TTiaraBarrelPhysics::Cal_Back_E(const int i){ - static string name; name = "TIARABARREL/B" ; - name+= NPL::itoa( m_EventData->GetBackEDetectorNbr(i) ) ; - name+= "_BACK_E"; - return CalibrationManager::getInstance()->ApplyCalibration(name, m_EventData->GetBackEEnergy(i)); - } + return (TVector3(0,0,i)); - //////////////////////////////////////////////////////////////////////////// - void TTiaraBarrelPhysics::WriteSpectra(){ - m_Spectra->WriteSpectra(); - } +} +/////////////////////////////////////////////////////////////////////////////// +TVector3 TTiaraBarrelPhysics::GetPositionOfInteraction(const int i) const{ + // All in mm + double INNERBARREL_PCB_Width = 27.76; + double INNERBARREL_ActiveWafer_Length = 94.80; + double INNERBARREL_ActiveWafer_Width = 24.0; + double StripPitch = INNERBARREL_ActiveWafer_Width/4.0; + + double X = (Strip_N[i]*StripPitch-0.5*INNERBARREL_ActiveWafer_Width)-(0.5*StripPitch); + double Y = INNERBARREL_PCB_Width*(0.5+sin(45*deg)); + double Z = Strip_Pos[i]*(0.5*INNERBARREL_ActiveWafer_Length); + //original version of the line above = double Z = (Strip_Pos[i]-0.5)*INNERBARREL_ActiveWafer_Length; + TVector3 POS(X,Y,-Z); + POS.RotateZ((DetectorNumber[i]-1)*45*deg); + return( POS ) ; +} +/////////////////////////////////////////////////////////////////////////////// +TVector3 TTiaraBarrelPhysics::GetRandomisedPositionOfInteraction(const int i) const{ + TVector3 RandomPOS = GetPositionOfInteraction(i); + TVector3 v1(-12.0, 27.76*(0.5+sin(45*deg)), 0.0); // the numbers used in this line and the one below are related to those in lines 594-597 + TVector3 v2(12.0, 27.76*(0.5+sin(45*deg)), 0.0); + v1.RotateZ((DetectorNumber[i]-1)*45*deg); + v2.RotateZ((DetectorNumber[i]-1)*45*deg); + TVector3 u = (v2-v1).Unit(); + double RandomNumber = Random->Rndm(); + TVector3 DeltaHolder((RandomNumber*6.0)-3.0,(RandomNumber*6.0)-3.0,0.0); + TVector3 DeltaVector(u.X()*DeltaHolder.X(),u.Y()*DeltaHolder.Y(),u.Z()*DeltaHolder.Z()); + RandomPOS.SetXYZ(RandomPOS.X()+DeltaVector.X(),RandomPOS.Y()+DeltaVector.Y(),RandomPOS.Z()+DeltaVector.Z()); + return( RandomPOS ); +} +/////////////////////////////////////////////////////////////////////////////// +void TTiaraBarrelPhysics::InitializeStandardParameter(){ + /* // Enable all channel + vector< bool > ChannelStatus; + m_RingChannelStatus.clear() ; + m_SectorChannelStatus.clear() ; + + ChannelStatus.resize(16,true); + for(int i = 0 ; i < m_NumberOfDetector ; ++i){ + m_RingChannelStatus[i] = ChannelStatus; + } + ChannelStatus.resize(8,true); + for(int i = 0 ; i < m_NumberOfDetector ; ++i){ + m_SectorChannelStatus[i] = ChannelStatus; + } - //////////////////////////////////////////////////////////////////////////////// - // Construct Method to be pass to the DetectorFactory // - //////////////////////////////////////////////////////////////////////////////// - NPL::VDetector* TTiaraBarrelPhysics::Construct(){ - return (NPL::VDetector*) new TTiaraBarrelPhysics(); - } + m_MaximumStripMultiplicityAllowed = m_NumberOfDetector ; + */ + return; +} +/////////////////////////////////////////////////////////////////////////////// +double TTiaraBarrelPhysics::Cal_Strip_Upstream_E(const int i){ + static string name; name ="TIARABARREL/B" ; + name+= NPL::itoa( m_EventData->GetFrontUpstreamEDetectorNbr(i) ) ; + name+= "_UPSTREAM" ; + name+= NPL::itoa( m_EventData->GetFrontUpstreamEStripNbr(i) ) ; + name+= "_E"; + return CalibrationManager::getInstance()->ApplyCalibration(name, + Match_Strip_Upstream_E(i) ); +} +/////////////////////////////////////////////////////////////////////////////// +double TTiaraBarrelPhysics::Cal_Strip_Downstream_E(const int i){ + static string name; name = "TIARABARREL/B" ; + name+= NPL::itoa( m_EventData->GetFrontDownstreamEDetectorNbr(i) ) ; + name+= "_DOWNSTREAM" ; + name+= NPL::itoa( m_EventData->GetFrontDownstreamEStripNbr(i) ) ; + name+= "_E"; + return CalibrationManager::getInstance()->ApplyCalibration(name, + Match_Strip_Downstream_E(i) ); +} +/////////////////////////////////////////////////////////////////////////////// +double TTiaraBarrelPhysics::Match_Strip_Upstream_E(const int i){ + static string name; name = "TIARABARREL/MATCHSTICK_B" ; + name+= NPL::itoa( m_EventData->GetFrontUpstreamEDetectorNbr(i) ) ; + name+= "_UPSTREAM" ; + name+= NPL::itoa( m_EventData->GetFrontUpstreamEStripNbr(i) ) ; + name+= "_E"; + return CalibrationManager::getInstance()->ApplyCalibration(name, + m_EventData->GetFrontUpstreamEEnergy(i) ); +} +/////////////////////////////////////////////////////////////////////////////// +double TTiaraBarrelPhysics::Match_Strip_Downstream_E(const int i){ + static string name; name ="TIARABARREL/MATCHSTICK_B" ; + name+= NPL::itoa( m_EventData->GetFrontDownstreamEDetectorNbr(i) ) ; + name+= "_DOWNSTREAM" ; + name+= NPL::itoa( m_EventData->GetFrontDownstreamEStripNbr(i) ) ; + name+= "_E"; + return CalibrationManager::getInstance()->ApplyCalibration(name, + m_EventData->GetFrontDownstreamEEnergy(i) ); +} +/////////////////////////////////////////////////////////////////////////////// +double TTiaraBarrelPhysics::Cal_Back_E(const int i){ + static string name; name = "TIARABARREL/B" ; + name+= NPL::itoa( m_EventData->GetBackEDetectorNbr(i) ) ; + name+= "_BACK_E"; + return CalibrationManager::getInstance()->ApplyCalibration(name, m_EventData->GetBackEEnergy(i)); +} - //////////////////////////////////////////////////////////////////////////////// - // Registering the construct method to the factory // - //////////////////////////////////////////////////////////////////////////////// - extern "C"{ - class brlproxy{ - public: - brlproxy(){ - NPL::DetectorFactory::getInstance()->AddToken("TiaraInnerBarrel=","Tiara"); - NPL::DetectorFactory::getInstance()->AddDetector("TiaraInnerBarrel=",TTiaraBarrelPhysics::Construct); - } - }; +//////////////////////////////////////////////////////////////////////////// +void TTiaraBarrelPhysics::WriteSpectra(){ + m_Spectra->WriteSpectra(); +} + + +//////////////////////////////////////////////////////////////////////////////// +// Construct Method to be pass to the DetectorFactory // +//////////////////////////////////////////////////////////////////////////////// +NPL::VDetector* TTiaraBarrelPhysics::Construct(){ + return (NPL::VDetector*) new TTiaraBarrelPhysics(); +} + +//////////////////////////////////////////////////////////////////////////////// +// Registering the construct method to the factory // +//////////////////////////////////////////////////////////////////////////////// +extern "C"{ +class brlproxy{ + public: + brlproxy(){ + NPL::DetectorFactory::getInstance()->AddToken("Tiara","Tiara"); + NPL::DetectorFactory::getInstance()->AddDetector("Tiara",TTiaraBarrelPhysics::Construct); + } +}; - brlproxy brlp; +brlproxy brlp; } diff --git a/NPLib/Detectors/Tiara/TTiaraBarrelPhysics.h b/NPLib/Detectors/Tiara/TTiaraBarrelPhysics.h index 099e316a4dbd2bd35de3512ef7153377eaef9bdd..9e0304ab9e33ce00d2df1abc000428f325777a31 100644 --- a/NPLib/Detectors/Tiara/TTiaraBarrelPhysics.h +++ b/NPLib/Detectors/Tiara/TTiaraBarrelPhysics.h @@ -30,7 +30,7 @@ #include "TTiaraBarrelSpectra.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" - +#include "NPInputParser.h" // ROOT #include "TVector2.h" #include "TVector3.h" @@ -80,7 +80,7 @@ class TTiaraBarrelPhysics : public TObject, public NPL::VDetector{ public: // Innherited from VDetector Class // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string) ; + void ReadConfiguration(NPL::InputParser) ; // Add Parameter to the CalibrationManger void AddParameterToCalibrationManager() ; diff --git a/NPLib/Detectors/Tiara/TTiaraHyballPhysics.cxx b/NPLib/Detectors/Tiara/TTiaraHyballPhysics.cxx index b8c8f5aaf972ee28d87e326435e4d6ad12255616..b505e895ec2dd484de3607e8a8f1e74040ada49c 100644 --- a/NPLib/Detectors/Tiara/TTiaraHyballPhysics.cxx +++ b/NPLib/Detectors/Tiara/TTiaraHyballPhysics.cxx @@ -47,7 +47,7 @@ using namespace NPUNITS; //#include "TRandom3.h" //#include "random" - TRandom *Rand = new TRandom3(); +TRandom *Rand = new TRandom3(); /////////////////////////////////////////////////////////////////////////// ClassImp(TTiaraHyballPhysics) @@ -196,11 +196,11 @@ void TTiaraHyballPhysics::PreTreat(){ /////////////////////////////////////////////////////////////////////////// int TTiaraHyballPhysics :: CheckEvent(){ // Check the size of the different elements -// if(m_PreTreatedData->GetSectorEMult() == m_PreTreatedData->GetRingEMult() ) - return 1 ; // Regular Event + // if(m_PreTreatedData->GetSectorEMult() == m_PreTreatedData->GetRingEMult() ) + return 1 ; // Regular Event - // else - return -1 ; // Rejected Event + // else + return -1 ; // Rejected Event } @@ -212,7 +212,7 @@ vector < TVector2 > TTiaraHyballPhysics :: Match_Ring_Sector(){ // Those event are not physical anyway and that improve speed. if( m_PreTreatedData->GetRingEMult() > m_MaximumStripMultiplicityAllowed || m_PreTreatedData->GetSectorEMult() > m_MaximumStripMultiplicityAllowed ) return ArrayOfGoodCouple; - + unsigned int sizeR = m_PreTreatedData->GetRingEMult(); unsigned int sizeS = m_PreTreatedData->GetSectorEMult(); @@ -220,10 +220,10 @@ vector < TVector2 > TTiaraHyballPhysics :: Match_Ring_Sector(){ for(unsigned int j = 0 ; j < sizeS ; j++){ // if same detector check energy if ( m_PreTreatedData->GetRingEDetectorNbr(i) == m_PreTreatedData->GetSectorEDetectorNbr(j) ){ - // Look if energy match + // Look if energy match if( abs( (m_PreTreatedData->GetRingEEnergy(i)-m_PreTreatedData->GetSectorEEnergy(j))/2. ) < m_StripEnergyMatchingNumberOfSigma*m_StripEnergyMatchingSigma ) { - ArrayOfGoodCouple . push_back ( TVector2(i,j) ) ; + ArrayOfGoodCouple . push_back ( TVector2(i,j) ) ; } } } @@ -413,113 +413,45 @@ void TTiaraHyballPhysics::Clear(){ //// Innherited from VDetector Class //// /////////////////////////////////////////////////////////////////////////// -void TTiaraHyballPhysics::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double R,Phi,Z; - R = 0 ; Phi = 0 ; Z = 0; - TVector3 Pos; - bool check_R = false ; - bool check_Phi = false ; - bool check_Z = false ; - - bool ReadingStatusWedge = false ; - bool ReadingStatus = false ; - - bool VerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); ; - - while (!ConfigFile.eof()){ - - getline(ConfigFile, LineBuffer); - // cout << LineBuffer << endl; - if (LineBuffer.compare(0, 5, "Tiara") == 0) - ReadingStatus = true; - - while (ReadingStatus && !ConfigFile.eof()) { - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // Hyball case - if (DataBuffer=="TiaraHyballWedge"){ - if(VerboseLevel) cout << "///" << endl ; - if(VerboseLevel) cout << "Wedge found: " << endl ; - ReadingStatusWedge = true ; - } - - // Reading Block - while(ReadingStatusWedge){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - //Position method - else if (DataBuffer == "Z=") { - check_Z = true; - ConfigFile >> DataBuffer ; - Z= atof(DataBuffer.c_str()); - if(VerboseLevel) cout << " Z= " << Z << "mm" << endl; - } - - else if (DataBuffer == "R=") { - check_R = true; - ConfigFile >> DataBuffer ; - R= atof(DataBuffer.c_str()); - if(VerboseLevel) cout << " R= " << R << "mm" << endl; - } - - else if (DataBuffer == "Phi=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi= atof(DataBuffer.c_str()); - if(VerboseLevel) cout << " Phi= " << Phi << "deg" << endl; - } +void TTiaraHyballPhysics::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("HyballWedge"); - else if (DataBuffer == "ThicknessDector=") { - /*ignore that*/ - } + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatusWedge = false; - cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << endl ; - exit(1); - } + vector<string> token = {"Z","R","Phi"}; - ///////////////////////////////////////////////// - // If All necessary information there, toggle out + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Hyball Wedge" << i+1 << endl; + double Z = blocks[i]->GetDouble("Z","mm"); + double R = blocks[i]->GetDouble("R","mm"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + AddWedgeDetector(R,Phi,Z); - if (check_R && check_Phi && check_Z){ + } - ReadingStatusWedge = false; - AddWedgeDetector(R,Phi,Z); - // Reinitialisation of Check Boolean - check_R = false ; - check_Phi = false ; - } - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } InitializeStandardParameter(); ReadAnalysisConfig(); } + /////////////////////////////////////////////////////////////////////////// void TTiaraHyballPhysics::InitSpectra(){ - m_Spectra = new TTiaraHyballSpectra(); + m_Spectra = new TTiaraHyballSpectra(); } /////////////////////////////////////////////////////////////////////////// void TTiaraHyballPhysics::FillSpectra(){ - m_Spectra -> FillRawSpectra(m_EventData); - m_Spectra -> FillPreTreatedSpectra(m_PreTreatedData); - m_Spectra -> FillPhysicsSpectra(m_EventPhysics); + m_Spectra -> FillRawSpectra(m_EventData); + m_Spectra -> FillPreTreatedSpectra(m_PreTreatedData); + m_Spectra -> FillPhysicsSpectra(m_EventPhysics); } /////////////////////////////////////////////////////////////////////////// void TTiaraHyballPhysics::CheckSpectra(){ @@ -543,7 +475,7 @@ map< string,TH1* > TTiaraHyballPhysics::GetSpectra() { map< string,TH1* > empty; return empty ; } - + } /////////////////////////////////////////////////////////////////////////// void TTiaraHyballPhysics::AddParameterToCalibrationManager(){ @@ -552,8 +484,8 @@ void TTiaraHyballPhysics::AddParameterToCalibrationManager(){ for(int i = 0 ; i < m_NumberOfDetector ; ++i){ for( int j = 0 ; j < 24 ; ++j){ Cal->AddParameter("TIARAHYBALL", "D"+NPL::itoa(i+1)+"_STRIP_RING"+NPL::itoa(j+1)+"_E","TIARAHYBALL_D"+NPL::itoa(i+1)+"_STRIP_RING"+NPL::itoa(j+1)+"_E") ; - Cal->AddParameter("TIARAHYBALL", "D"+NPL::itoa(i+1)+"_STRIP_RING"+NPL::itoa(j+1)+"_MATCHSTICK","TIARAHYBALL_D"+NPL::itoa(i+1)+"_STRIP_RING"+NPL::itoa(j+1)+"_MATCHSTICK") ; - + Cal->AddParameter("TIARAHYBALL", "D"+NPL::itoa(i+1)+"_STRIP_RING"+NPL::itoa(j+1)+"_MATCHSTICK","TIARAHYBALL_D"+NPL::itoa(i+1)+"_STRIP_RING"+NPL::itoa(j+1)+"_MATCHSTICK") ; + Cal->AddParameter("TIARAHYBALL", "D"+NPL::itoa(i+1)+"_STRIP_RING"+NPL::itoa(j+1)+"_T","TIARAHYBALL_D"+NPL::itoa(i+1)+"_STRIP_RING"+NPL::itoa(j+1)+"_T") ; } @@ -717,29 +649,29 @@ namespace TiaraHyball_LOCAL{ // Ring double fStrip_Ring_E(const TTiaraHyballData* m_EventData , const int i){ static string name; name = "TIARAHYBALL/D" ; -name+= NPL::itoa( m_EventData->GetRingEDetectorNbr(i) ) ; -name+= "_STRIP_RING" ; -name+= NPL::itoa( m_EventData->GetRingEStripNbr(i) ) ; -name+= "_E"; + name+= NPL::itoa( m_EventData->GetRingEDetectorNbr(i) ) ; + name+= "_STRIP_RING" ; + name+= NPL::itoa( m_EventData->GetRingEStripNbr(i) ) ; + name+= "_E"; return CalibrationManager::getInstance()->ApplyCalibration(name , fStrip_Ring_Matchstick(m_EventData,i) ); } double fStrip_Ring_Matchstick(const TTiaraHyballData* m_EventData , const int i){ static string name; name = "TIARAHYBALL/D" ; -name+= NPL::itoa( m_EventData->GetRingEDetectorNbr(i) ) ; -name+= "_STRIP_RING" ; -name+= NPL::itoa( m_EventData->GetRingEStripNbr(i) ) ; -name+= "_MATCHSTICK"; + name+= NPL::itoa( m_EventData->GetRingEDetectorNbr(i) ) ; + name+= "_STRIP_RING" ; + name+= NPL::itoa( m_EventData->GetRingEStripNbr(i) ) ; + name+= "_MATCHSTICK"; return CalibrationManager::getInstance()->ApplyCalibration(name , m_EventData->GetRingEEnergy(i) ); } double fStrip_Ring_T(const TTiaraHyballData* m_EventData , const int i){ static string name; name = "TIARAHYBALL/D" ; -name+= NPL::itoa( m_EventData->GetRingTDetectorNbr(i) ) ; -name+= "_STRIP_RING" ; -name+= NPL::itoa( m_EventData->GetRingTStripNbr(i) ) ; -name+="_T"; + name+= NPL::itoa( m_EventData->GetRingTDetectorNbr(i) ) ; + name+= "_STRIP_RING" ; + name+= NPL::itoa( m_EventData->GetRingTStripNbr(i) ) ; + name+="_T"; return CalibrationManager::getInstance()->ApplyCalibration(name , m_EventData->GetRingTTime(i) ); } @@ -747,30 +679,30 @@ name+="_T"; // Sector double fStrip_Sector_E(const TTiaraHyballData* m_EventData , const int i){ static string name; name = "TIARAHYBALL/D" ; -name+= NPL::itoa( m_EventData->GetSectorEDetectorNbr(i) ) ; -name+= "_STRIP_SECTOR" ; -name+= NPL::itoa( m_EventData->GetSectorEStripNbr(i) ) ; -name+="_E"; + name+= NPL::itoa( m_EventData->GetSectorEDetectorNbr(i) ) ; + name+= "_STRIP_SECTOR" ; + name+= NPL::itoa( m_EventData->GetSectorEStripNbr(i) ) ; + name+="_E"; return CalibrationManager::getInstance()->ApplyCalibration(name, fStrip_Sector_Matchstick(m_EventData,i) ); } double fStrip_Sector_Matchstick(const TTiaraHyballData* m_EventData , const int i){ static string name; name = "TIARAHYBALL/D" ; -name+= NPL::itoa( m_EventData->GetSectorEDetectorNbr(i) ) ; -name+= "_STRIP_SECTOR" ; -name+= NPL::itoa( m_EventData->GetSectorEStripNbr(i) ) ; -name+="_MATCHSTICK"; + name+= NPL::itoa( m_EventData->GetSectorEDetectorNbr(i) ) ; + name+= "_STRIP_SECTOR" ; + name+= NPL::itoa( m_EventData->GetSectorEStripNbr(i) ) ; + name+="_MATCHSTICK"; return CalibrationManager::getInstance()->ApplyCalibration(name, m_EventData->GetSectorEEnergy(i) ); } double fStrip_Sector_T(const TTiaraHyballData* m_EventData , const int i){ static string name; name = "TIARAHYBALL/D" ; -name+= NPL::itoa( m_EventData->GetSectorTDetectorNbr(i) ); -name+= "_STRIP_SECTOR" ; -name+= NPL::itoa( m_EventData->GetSectorTStripNbr(i) ); -name+="_T"; + name+= NPL::itoa( m_EventData->GetSectorTDetectorNbr(i) ); + name+= "_STRIP_SECTOR" ; + name+= NPL::itoa( m_EventData->GetSectorTStripNbr(i) ); + name+="_T"; return CalibrationManager::getInstance()->ApplyCalibration(name, m_EventData->GetRingTTime(i) ); } @@ -791,8 +723,8 @@ extern "C"{ class proxy_hyball{ public: proxy_hyball(){ - NPL::DetectorFactory::getInstance()->AddToken("Tiara","Tiara"); - NPL::DetectorFactory::getInstance()->AddDetector("TiaraHyballWedge",TTiaraHyballPhysics::Construct); + NPL::DetectorFactory::getInstance()->AddToken("HyballWedge","Tiara"); + NPL::DetectorFactory::getInstance()->AddDetector("HyballWedge",TTiaraHyballPhysics::Construct); } }; diff --git a/NPLib/Detectors/Tiara/TTiaraHyballPhysics.h b/NPLib/Detectors/Tiara/TTiaraHyballPhysics.h index 7a61725eb35830c3056ac61c53ca87ab37a50010..b1da351c394c31eafbc402a80a281d8f6d266c6c 100644 --- a/NPLib/Detectors/Tiara/TTiaraHyballPhysics.h +++ b/NPLib/Detectors/Tiara/TTiaraHyballPhysics.h @@ -30,6 +30,7 @@ #include "TTiaraHyballSpectra.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" +#include "NPInputParser.h" // ROOT #include "TVector2.h" @@ -77,7 +78,7 @@ class TTiaraHyballPhysics : public TObject, public NPL::VDetector{ public: // Innherited from VDetector Class // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string) ; + void ReadConfiguration(NPL::InputParser) ; // Add Parameter to the CalibrationManger void AddParameterToCalibrationManager() ; diff --git a/NPLib/Detectors/Tigress/TTigressPhysics.cxx b/NPLib/Detectors/Tigress/TTigressPhysics.cxx index 94d2bf76ea57c03024124a0ba116cae39b070a4f..c8f5f907fc2e26ef7d59bf65cba5da85fd957209 100644 --- a/NPLib/Detectors/Tigress/TTigressPhysics.cxx +++ b/NPLib/Detectors/Tigress/TTigressPhysics.cxx @@ -33,6 +33,7 @@ using namespace std; #include "RootOutput.h" #include "TAsciiFile.h" #include "NPSystemOfUnits.h" +#include "NPOptionManager.h" using namespace NPUNITS; // ROOT @@ -241,99 +242,27 @@ TVector3 TTigressPhysics::GetSegmentPosition(int& CloverNbr,int& CoreNbr, int& S ///////////////////////////////////////////////// -void TTigressPhysics::ReadConfiguration(string Path) { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - - if(!ConfigFile.is_open()) cout << "Config File not Found" << endl ; - - string LineBuffer; - string DataBuffer; - - bool check_CloverId= false; - bool check_R= false; - bool check_Theta= false; - bool check_Phi= false; - bool ReadingStatus = true; - - int CloverId=0; - double R=0; - double Theta=0; - double Phi=0; - - while (!ConfigFile.eof()) { - - getline(ConfigFile, LineBuffer); - // If line is a Start Up Tigress bloc, Reading toggle to true - if (LineBuffer.compare(0, 13, "TigressClover") == 0) { - cout << "///" << endl ; - cout << "Tigress Clover found: " << endl ; - ReadingStatus = true ; +void TTigressPhysics::ReadConfiguration(NPL::InputParser parser) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("TigressClover"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " clovers found " << endl; + + vector<string> token = {"CloverID","R","Theta","Phi"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + int id = blocks[i]->GetInt("CloverID"); + AddClover(id,R,Theta,Phi); } - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - // Reading Block - while(ReadingStatus) { - // Pickup Next Word - - ConfigFile >> DataBuffer ; - // Comment Line - - if (DataBuffer.compare(0, 1, "%") == 0) {ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // Finding another Clover toggle out (safety) - else if (DataBuffer.compare(0, 13, "TigressClover") == 0) { - cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Clover definition" << endl ; - ReadingStatus = false ; - } - - else if (DataBuffer=="CloverId=") { - check_CloverId = true; - ConfigFile >> DataBuffer ; - CloverId=atoi(DataBuffer.c_str()); - cout << "CloverId: " << CloverId << endl; - } - - else if (DataBuffer=="R=") { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()); - cout << "R: " << R << "mm" << endl; - } - - else if (DataBuffer=="Theta=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()); - cout << "Theta: " << Theta << "deg" << endl; - } - - else if (DataBuffer=="Phi=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()); - cout << "Phi: " << Phi << "deg" << endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else { - ReadingStatus = false; cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ;} - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ( check_Theta && check_Phi && check_R && check_CloverId) { - ReadingStatus = false; - check_CloverId= false; - check_R= false; - check_Theta= false; - check_Phi= false; - AddClover(CloverId,R,Theta*3.141592653589793/180.,Phi*3.141592653589793/180.); - } + else{ + cout << "Warning: check your input file formatting " << endl; } } } - /////////////////////////////////////////////////////////////////////////// void TTigressPhysics::InitializeRootInputRaw() { TChain* inputChain = RootInput::getInstance()->GetChain(); diff --git a/NPLib/Detectors/Tigress/TTigressPhysics.h b/NPLib/Detectors/Tigress/TTigressPhysics.h index b20c6cd24e2dee2460dc29b60c50c54481cbad37..51ea1ab3c48afd667997fdc278358c9d72d51534 100644 --- a/NPLib/Detectors/Tigress/TTigressPhysics.h +++ b/NPLib/Detectors/Tigress/TTigressPhysics.h @@ -29,7 +29,7 @@ using namespace std; #include "TTigressData.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" - +#include "NPInputParser.h" // ROOT #include "TObject.h" #include "TVector3.h" @@ -46,7 +46,7 @@ class TTigressPhysics : public TObject, public NPL::VDetector{ public: // inherited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add Parameter to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/Detectors/Trifoil/TTrifoilPhysics.cxx b/NPLib/Detectors/Trifoil/TTrifoilPhysics.cxx index a616a431aa1d7827e16984cb9038e116815e76d5..079dfb713a31ed79c2c5a4efed099e48754e33a4 100644 --- a/NPLib/Detectors/Trifoil/TTrifoilPhysics.cxx +++ b/NPLib/Detectors/Trifoil/TTrifoilPhysics.cxx @@ -32,6 +32,8 @@ #include "NPDetectorFactory.h" #include "RootOutput.h" #include "TAsciiFile.h" +#include "NPOptionManager.h" + // ROOT #include "TChain.h" #include "TSpectrum.h" @@ -77,9 +79,10 @@ void TTrifoilPhysics::Clear(){ //// Innherited from VDetector Class //// /////////////////////////////////////////////////////////////////////////// -void TTrifoilPhysics::ReadConfiguration(string Path) { - /*Trifoil has only one key word, so do nothing*/ - Path.clear(); +void TTrifoilPhysics::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Trifoil"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; } /////////////////////////////////////////////////////////////////////////// diff --git a/NPLib/Detectors/Trifoil/TTrifoilPhysics.h b/NPLib/Detectors/Trifoil/TTrifoilPhysics.h index 020c008b9fe178245f806bcd6e61735a6d41a10e..48dc16a8c237038c66b77f6f8d306a97520e0748 100644 --- a/NPLib/Detectors/Trifoil/TTrifoilPhysics.h +++ b/NPLib/Detectors/Trifoil/TTrifoilPhysics.h @@ -29,6 +29,7 @@ #include "TTrifoilData.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" +#include "NPInputParser.h" // ROOT #include "TVector2.h" #include "TVector3.h" @@ -55,7 +56,7 @@ class TTrifoilPhysics : public TObject, public NPL::VDetector public: // Innherited from VDetector Class // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string) ; + void ReadConfiguration(NPL::InputParser) ; // Add Parameter to the CalibrationManger void AddParameterToCalibrationManager() ; diff --git a/NPLib/Detectors/W1/TW1Physics.cxx b/NPLib/Detectors/W1/TW1Physics.cxx index 6be71b8498c0e33653cf82145f3554a2641d66f6..785be954d6e669e9b23c022d72680e7dd1e2adb3 100644 --- a/NPLib/Detectors/W1/TW1Physics.cxx +++ b/NPLib/Detectors/W1/TW1Physics.cxx @@ -36,6 +36,7 @@ using namespace std; #include "RootOutput.h" #include "RootInput.h" #include "NPDetectorFactory.h" +#include "NPOptionManager.h" // ROOT #include "TChain.h" @@ -101,178 +102,42 @@ void TW1Physics::Clear() /////////////////////////////////////////////////////////////////////////// -void TW1Physics::ReadConfiguration(string Path) -{ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer, DataBuffer; - - double TLX, BLX, BRX, TRX, TLY, BLY, BRY, TRY, TLZ, BLZ, BRZ, TRZ; - TVector3 A, B, C, D; - double Theta = 0, Phi = 0, R = 0, beta_u = 0, beta_v = 0, beta_w = 0; - bool check_A = false; - bool check_B = false; - bool check_C = false; - bool check_D = false; - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; - bool check_beta = false; - bool ReadingStatus = false; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If W1 detector found, toggle Reading Block Status - if (LineBuffer.compare(0, 2, "W1") == 0) { - cout << "Detector found: " << endl; - ReadingStatus = true; - } - - // else don't toggle to Reading Block Status - else ReadingStatus = false; - - // Reading Block - while (ReadingStatus) { - // Pickup Next Word - ConfigFile >> DataBuffer; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) {ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 2, "W1") == 0) { - cout << "WARNING: Another Telescope is find before standard sequence of Token, Error may occured in Telecope definition" << endl; - ReadingStatus = false; - } - - // Position method - else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { - check_A = true; - ConfigFile >> DataBuffer; - TLX = atof(DataBuffer.c_str()); - ConfigFile >> DataBuffer; - TLY = atof(DataBuffer.c_str()); - ConfigFile >> DataBuffer; - TLZ = atof(DataBuffer.c_str()); - - A = TVector3(TLX, TLY, TLZ); - cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; - } - - else if (DataBuffer.compare(0, 7, "X16_Y1=") == 0) { - check_B = true; - ConfigFile >> DataBuffer; - BLX = atof(DataBuffer.c_str()); - ConfigFile >> DataBuffer; - BLY = atof(DataBuffer.c_str()); - ConfigFile >> DataBuffer; - BLZ = atof(DataBuffer.c_str()); - - B = TVector3(BLX, BLY, BLZ); - cout << "X16 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; - } - - else if (DataBuffer.compare(0, 7, "X1_Y16=") == 0) { - check_C = true; - ConfigFile >> DataBuffer; - BRX = atof(DataBuffer.c_str()); - ConfigFile >> DataBuffer; - BRY = atof(DataBuffer.c_str()); - ConfigFile >> DataBuffer; - BRZ = atof(DataBuffer.c_str()); - - C = TVector3(BRX, BRY, BRZ); - cout << "X1 Y16 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; - } - - else if (DataBuffer.compare(0, 8, "X16_Y16=") == 0) { - check_D = true; - ConfigFile >> DataBuffer; - TRX = atof(DataBuffer.c_str()); - ConfigFile >> DataBuffer; - TRY = atof(DataBuffer.c_str()); - ConfigFile >> DataBuffer; - TRZ = atof(DataBuffer.c_str()); - - D = TVector3(TRX, TRY, TRZ); - cout << "X16 Y16 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; - } - - - //Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer; - Theta = atof(DataBuffer.c_str()); - cout << "Theta: " << Theta << endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer; - Phi = atof(DataBuffer.c_str()); - cout << "Phi: " << Phi << endl; - } +void TW1Physics::ReadConfiguration(NPL::InputParser parser) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("W1"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + // Cartesian Case + vector<string> cart = {"X1_Y1","X1_Y16","X16_Y1","X16_Y16"}; + // Spherical Case + vector<string> sphe= {"R","THETA","PHI","BETA"}; + + if(blocks[i]->HasTokenList(cart)){ + cout << endl << "//// W1 " << i+1 << endl; + TVector3 A = blocks[i]->GetTVector3("X1_Y1","mm"); + TVector3 B = blocks[i]->GetTVector3("X16_Y1","mm"); + TVector3 C = blocks[i]->GetTVector3("X1_Y16","mm"); + TVector3 D = blocks[i]->GetTVector3("X16_Y16","mm"); + AddDetector(A,B,C,D) ; + } - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer; - R = atof(DataBuffer.c_str()); - cout << "R: " << R << endl; - } + else if(blocks[i]->HasTokenList(sphe)){ + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi= blocks[i]->GetDouble("PHI","deg"); + double R = blocks[i]->GetDouble("R","mm"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + AddDetector(Theta,Phi,R,beta[0],beta[1],beta[2]); + } - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - check_beta = true; - ConfigFile >> DataBuffer; - beta_u = atof(DataBuffer.c_str()); - ConfigFile >> DataBuffer; - beta_v = atof(DataBuffer.c_str()); - ConfigFile >> DataBuffer; - beta_w = atof(DataBuffer.c_str()); - cout << "Beta: " << beta_u << " " << beta_v << " " << beta_w << endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else { - ReadingStatus = false; - cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl; - } + else{ + cout << "ERROR: Missing token for W1 blocks, check your input file" << endl; + exit(1); + } - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ((check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta)) { - ReadingStatus = false; - - // Add The previously define telescope - // With position method - if ((check_A && check_B && check_C && check_D) || !(check_Theta && check_Phi && check_R)) { - AddDetector(A, B, C, D); - } + } - // with angle method - else if ((check_Theta && check_Phi && check_R) || !(check_A && check_B && check_C && check_D)) { - AddDetector(Theta, Phi, R, beta_u, beta_v, beta_w); - } - - // Reinitialisation of Check Boolean - check_A = false; - check_B = false; - check_C = false; - check_D = false; - - check_Theta = false; - check_Phi = false; - check_R = false; - check_beta = false; - ReadingStatus = false; - } - } - } - - InitializeStandardParameters(); - ReadAnalysisConfig(); + InitializeStandardParameters(); + ReadAnalysisConfig(); } diff --git a/NPLib/Detectors/W1/TW1Physics.h b/NPLib/Detectors/W1/TW1Physics.h index 3c5475b53c672b902555aa1592642332e2f83aa6..dadfdb6754f42960a7d6e696daeaffa8dd5f02dc 100644 --- a/NPLib/Detectors/W1/TW1Physics.h +++ b/NPLib/Detectors/W1/TW1Physics.h @@ -38,6 +38,7 @@ using namespace std; #include "TW1Spectra.h" #include "NPVDetector.h" #include "NPCalibrationManager.h" +#include "NPInputParser.h" // forward declaration class TW1Spectra; @@ -97,7 +98,7 @@ class TW1Physics : public TObject, public NPL::VDetector public: // inherited from VDetector // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // Add parameters to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/Physics/NPBeam.cxx b/NPLib/Physics/NPBeam.cxx index aa730e824fe82eedfc0cc7d4e9e3143a289a59ee..608a9255c80da2ca09b538724a8d3d3949ac0fa0 100644 --- a/NPLib/Physics/NPBeam.cxx +++ b/NPLib/Physics/NPBeam.cxx @@ -67,13 +67,13 @@ Beam::Beam(){ fTargetAngle = 0 ; fTargetZ = 0 ; fVerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); - + // case of user given distribution // do that to avoid warning from multiple Hist with same name... int offset = 0; while(gDirectory->FindObjectAny(Form("EnergyHist_%i",offset))!=0) ++offset; - + fEnergyHist = new TH1F(Form("EnergyHist_%i",offset),"EnergyHist",1,0,1); fXThetaXHist = new TH2F(Form("XThetaXHis_%i",offset),"XThetaXHis",1,0,1,1,0,1); fYPhiYHist = new TH2F(Form("YPhiYHist_%i",offset),"YPhiYHist",1,0,1,1,0,1); @@ -99,13 +99,13 @@ Beam::Beam(string isotope){ fTargetAngle = 0 ; fTargetZ = 0 ; fVerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); - + // case of user given distribution // do that to avoid warning from multiple Hist with same name... int offset = 0; while(gDirectory->FindObjectAny(Form("EnergyHist_%i",offset))!=0) ++offset; - + fEnergyHist = new TH1F(Form("EnergyHist_%i",offset),"EnergyHist",1,0,1); fXThetaXHist = new TH2F(Form("XThetaXHis_%i",offset),"XThetaXHis",1,0,1,1,0,1); fYPhiYHist = new TH2F(Form("YPhiYHist_%i",offset),"YPhiYHist",1,0,1,1,0,1); @@ -118,224 +118,98 @@ Beam::~Beam(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Beam::ReadConfigurationFile(string Path){ - ////////General Reading needs//////// - string LineBuffer; - string DataBuffer; - ////////////////////////////////////////////////////////////////////////////////////////// - ifstream ReactionFile; - - bool ReadingStatus = false ; - bool check_BeamName = false ; - bool check_Energy = false ; - bool check_SigmaEnergy = false ; - bool check_MeanX = false ; - bool check_MeanY = false ; - bool check_SigmaX = false ; - bool check_SigmaY = false ; - bool check_MeanThetaX = false ; - bool check_MeanPhiY = false ; - bool check_SigmaThetaX = false ; - bool check_SigmaPhiY = false ; - - bool check_EnergyProfilePath = false ; - bool check_XThetaXPath = false ; - bool check_YPhiYPath = false ; - - bool check_AllEnergy = false; - bool check_AllEmittance = false; - - string GlobalPath = getenv("NPTOOL"); - string StandardPath = GlobalPath + "/Inputs/EventGenerator/" + Path; - ReactionFile.open(StandardPath.c_str()); - if (ReactionFile.is_open()) {cout << "Reading Reaction File " << Path << endl ;} - - // In case the file is not found in the standard path, the programm try to interpret the file name as an absolute or relative file path. - else{ - ReactionFile.open( Path.c_str() ); - if(ReactionFile.is_open()) { - - if(fVerboseLevel==1) - cout << "\033[1;35m/////////// Beam ///////////" << endl; - - if(fVerboseLevel==1) - cout << "Reading Reaction File " << Path << endl;} - - else {cout << "Reaction File " << Path << " not found" << endl;exit(1);} - } + NPL::InputParser parser(Path); + ReadConfigurationFile(parser); +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void Beam::ReadConfigurationFile(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Beam"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "\033[1;35m//// Beam found " << endl; + vector<string> token = {"Particle"}; + vector<string> energyA = {"Energy","SigmaEnergy"}; + vector<string> energyP = {"EnergyProfilePath"}; + vector<string> emmitA = {"SigmaThetaX","SigmaPhiY","SigmaX","SigmaY","MeanThetaX","MeanPhiY","MeanX","MeanY"}; + vector<string> emmitP = {"EnergyProfilePath","XThetaXProfilePath","YPhiYProfilePath"}; - while (!ReactionFile.eof()) { - //Pick-up next line - getline(ReactionFile, LineBuffer); - - if (LineBuffer.compare(0, 4, "Beam") == 0) { - if(fVerboseLevel==1) cout << "Beam Found" << endl ; - ReadingStatus = true ; - } - - while(ReadingStatus){ - - ReactionFile >> DataBuffer; - - //Search for comment Symbol % - if (DataBuffer.compare(0, 1, "%") == 0) { ReactionFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - else if (DataBuffer == "Particle=") { - check_BeamName = true ; - ReactionFile >> DataBuffer; - SetUp(DataBuffer); - if(fVerboseLevel==1) cout << "Beam Particle: " << GetName() << endl; - } - - else if (DataBuffer == "ExcitationEnergy=") { - ReactionFile >> DataBuffer; - fExcitationEnergy = atof(DataBuffer.c_str()) * MeV; - if(fVerboseLevel==1) cout << "Excitation Energy: " << fExcitationEnergy << " MeV" << endl; - } - - else if (DataBuffer == "Energy=") { - check_Energy = true ; - ReactionFile >> DataBuffer; - fEnergy = atof(DataBuffer.c_str()) * MeV; - if(fVerboseLevel==1) cout << "Beam Energy: " << fEnergy / MeV << " MeV" << endl; - } - - else if (DataBuffer == "SigmaEnergy=") { - check_SigmaEnergy = true ; - ReactionFile >> DataBuffer; - fSigmaEnergy= atof(DataBuffer.c_str()) * MeV; - if(fVerboseLevel==1) cout << "Beam Energy Sigma: " << fSigmaEnergy / MeV << " MeV" << endl; - } - - else if (DataBuffer=="MeanX=") { - check_MeanX = true ; - ReactionFile >> DataBuffer; - fMeanX = atof(DataBuffer.c_str()) * mm; - if(fVerboseLevel==1) cout << "Mean X: " << fMeanX / mm << " mm" << endl; - } - - else if (DataBuffer=="MeanY=") { - check_MeanY = true ; - ReactionFile >> DataBuffer; - fMeanY = atof(DataBuffer.c_str()) * mm; - if(fVerboseLevel==1) cout << "Mean Y: " << fMeanY / mm << " mm" << endl; - } - - else if (DataBuffer=="SigmaX=") { - check_SigmaX = true ; - ReactionFile >> DataBuffer; - fSigmaX = atof(DataBuffer.c_str()) * mm; - if(fVerboseLevel==1) cout << "Sigma X: " << fSigmaX / mm << " mm" << endl; - } - - else if (DataBuffer=="SigmaY=") { - check_SigmaY = true ; - ReactionFile >> DataBuffer; - fSigmaY = atof(DataBuffer.c_str()) * mm; - if(fVerboseLevel==1) cout << "Sigma Y: " << fSigmaY / mm << " mm" << endl; - } - - else if (DataBuffer == "MeanThetaX=" ) { - check_MeanThetaX = true ; - ReactionFile >> DataBuffer; - fMeanThetaX = atof(DataBuffer.c_str()) * deg; - if(fVerboseLevel==1) cout << "Mean Theta X: " << fMeanThetaX / deg << " deg" << endl; - } - - else if (DataBuffer == "MeanPhiY=") { - check_MeanPhiY = true ; - ReactionFile >> DataBuffer; - fMeanPhiY = atof(DataBuffer.c_str()) * deg; - if(fVerboseLevel==1) cout << "Mean Phi Y: " << fMeanPhiY / deg << " deg" << endl; - } - - else if (DataBuffer == "SigmaThetaX=" ) { - check_SigmaThetaX = true ; - ReactionFile >> DataBuffer; - fSigmaThetaX = atof(DataBuffer.c_str()) * deg; - if(fVerboseLevel==1) cout << "Sigma Theta X: " << fSigmaThetaX / deg << " deg" << endl; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + SetUp(blocks[i]->GetString("Particle")); + + if(blocks[i]->HasToken("ExcitationEnergy")) + fExcitationEnergy = blocks[i]->GetDouble("ExcitationEnergy","MeV"); + + // Energy analytic + if(blocks[i]->HasTokenList(energyA)){ + fEnergy = blocks[i]->GetDouble("Energy","MeV"); + fSigmaEnergy= blocks[i]->GetDouble("SigmaEnergy","MeV"); } - - else if (DataBuffer == "SigmaPhiY=") { - check_SigmaPhiY = true ; - ReactionFile >> DataBuffer; - fSigmaPhiY = atof(DataBuffer.c_str()) * deg; - if(fVerboseLevel==1) cout << "Sigma Phi Y: " << fSigmaPhiY / deg << " deg" << endl; + + // Energy profile + else if(blocks[i]->HasTokenList(energyP)){ + vector<string> FileName = blocks[i]->GetVectorString("EnergyProfilePath"); + SetEnergyHist( Read1DProfile(FileName[0], FileName[1])); } - - else if (DataBuffer == "EnergyProfilePath=") { - check_EnergyProfilePath = true ; - string FileName,HistName; - ReactionFile >> FileName >> HistName; - if(fVerboseLevel==1) cout << "Reading Energy profile file: " << FileName << endl; - SetEnergyHist( Read1DProfile(FileName, HistName )); + + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } - - else if (DataBuffer == "XThetaXProfilePath=") { - check_XThetaXPath = true ; - string FileName,HistName; - ReactionFile >> FileName >> HistName; - if(fVerboseLevel==1) cout << "Reading X-ThetaX profile file: " << FileName << endl; - SetXThetaXHist(Read2DProfile(FileName, HistName ) ); + + // Emmitance analytic + if(blocks[i]->HasTokenList(emmitA)){ + fSigmaThetaX = blocks[i]->GetDouble("SigmaThetaX","deg"); + fSigmaPhiY = blocks[i]->GetDouble("SigmaPhiY","deg"); + fSigmaX = blocks[i]->GetDouble("SigmaX","mm"); + fSigmaY = blocks[i]->GetDouble("SigmaY","mm"); + fMeanThetaX = blocks[i]->GetDouble("MeanThetaX","deg"); + fMeanPhiY = blocks[i]->GetDouble("MeanPhiY","deg"); + fMeanX = blocks[i]->GetDouble("MeanX","mm"); + fMeanY = blocks[i]->GetDouble("MeanY","mm"); } - - else if (DataBuffer == "YPhiYProfilePath=") { - check_YPhiYPath = true ; - string FileName,HistName; - ReactionFile >> FileName >> HistName; - if(fVerboseLevel==1) cout << "Reading Y-ThetaY profile file: " << FileName << endl; - SetYPhiYHist( Read2DProfile(FileName, HistName )); + // Emmitance profile + else if(blocks[i]->HasTokenList(emmitP)){ + vector<string> XThetaX= blocks[i]->GetVectorString("XThetaXProfilePath"); + SetEnergyHist( Read1DProfile(XThetaX[0], XThetaX[1])); + vector<string> YPhiY= blocks[i]->GetVectorString("YPhiYProfilePath"); + SetEnergyHist( Read1DProfile(YPhiY[0], YPhiY[1])); + } - - - /////////////////////////////////////////////////// - // If no Beam Token and no comment, toggle out + else{ - cout << "\033[1;31mERROR : Wrong Token Sequence: Getting out\033[0m" << endl ; + cout << "ERROR: check your input file formatting \033[0m" << endl; exit(1); } - - /////////////////////////////////////////////////// - if( ( check_MeanX && check_MeanY && check_SigmaX && check_SigmaY && check_SigmaThetaX && check_SigmaPhiY && check_MeanThetaX && check_MeanPhiY) || ( check_XThetaXPath && check_YPhiYPath ) ){ - check_AllEmittance = true ; - } - - if( ( check_Energy && check_SigmaEnergy ) || ( check_EnergyProfilePath ) ){ - check_AllEnergy = true ; - } - - // If all Token found toggle out - if( check_BeamName && check_AllEnergy && check_AllEmittance ) - ReadingStatus = false ; } - } - - if( !check_BeamName || !check_AllEnergy || !check_AllEnergy ){ - cout << "\033[1;31mERROR : Token Sequence Incomplete, Beam definition could not be Fonctionnal\033[0m" << endl ; - exit(1); - } - - cout << "\033[0m" ; + else{ + cout << "ERROR: check your input file formatting \033[0m" << endl; + exit(1); + } + } + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "\033[0m" ; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Beam::GenerateRandomEvent(double& E, double& X, double& Y, double& Z, double& ThetaX, double& PhiY ){ X = Y = 1000000*cm; - + if(fSigmaEnergy!=-1) E = gRandom->Gaus(fEnergy,fSigmaEnergy); else E = fEnergyHist->GetRandom(); - + if(fSigmaX!=-1){ - // Shoot within the target unless target size is null (no limit) + // Shoot within the target unless target size is null (no limit) while(sqrt(X*X+Y*Y)>fEffectiveTargetSize || fEffectiveTargetSize == 0){ NPL::RandomGaussian2D(fMeanX, fMeanThetaX, fSigmaX, fSigmaThetaX, X, ThetaX); NPL::RandomGaussian2D(fMeanY, fMeanPhiY, fSigmaY, fSigmaPhiY, Y, PhiY); } } - + else{ while(sqrt(X*X+Y*Y)>fEffectiveTargetSize || fEffectiveTargetSize == 0){ fXThetaXHist->GetRandom2(X,ThetaX); @@ -347,8 +221,8 @@ void Beam::GenerateRandomEvent(double& E, double& X, double& Y, double& Z, doubl //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Beam::Print() const { - - + + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/NPLib/Physics/NPBeam.h b/NPLib/Physics/NPBeam.h index 1b979954fd3b8db16bcc6227318a59897b1ee351..574937e1109eec1ac5980586a1033db183214b1b 100644 --- a/NPLib/Physics/NPBeam.h +++ b/NPLib/Physics/NPBeam.h @@ -36,7 +36,7 @@ using namespace std; // NPL header #include "NPNucleus.h" - +#include "NPInputParser.h" using namespace NPL; namespace NPL{ @@ -50,7 +50,8 @@ namespace NPL{ public: // Various Method void ReadConfigurationFile(string Path); - + void ReadConfigurationFile(NPL::InputParser); + private: int fVerboseLevel; diff --git a/NPLib/Physics/NPReaction.cxx b/NPLib/Physics/NPReaction.cxx index 889aec6c083b87c18f0d8c49515c4986ead6b0ed..ce5b6119a1e953704db6623cd0de5a1beac24ae1 100644 --- a/NPLib/Physics/NPReaction.cxx +++ b/NPLib/Physics/NPReaction.cxx @@ -58,34 +58,34 @@ using namespace NPUNITS; ClassImp(Reaction) -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -Reaction::Reaction(){ - //------------- Default Constructor ------------- - - // Need to be done before initializePrecomputeVariable - fKineLine3 = 0 ; - fKineLine4 = 0 ; - fLineBrho3 = 0 ; - fTheta3VsTheta4 = 0; - fAngleLine = 0; - - // - fBeamEnergy = 0; - fThetaCM = 0; - fExcitation3 = 0; - fExcitation4 = 0; - fQValue = 0; - fVerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); - initializePrecomputeVariable(); - - fCrossSectionHist = NULL; - fExcitationEnergyHist = NULL; - fDoubleDifferentialCrossSectionHist = NULL ; - - fshoot3=true; - fshoot4=true; - -} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + Reaction::Reaction(){ + //------------- Default Constructor ------------- + + // Need to be done before initializePrecomputeVariable + fKineLine3 = 0 ; + fKineLine4 = 0 ; + fLineBrho3 = 0 ; + fTheta3VsTheta4 = 0; + fAngleLine = 0; + + // + fBeamEnergy = 0; + fThetaCM = 0; + fExcitation3 = 0; + fExcitation4 = 0; + fQValue = 0; + fVerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); + initializePrecomputeVariable(); + + fCrossSectionHist = NULL; + fExcitationEnergyHist = NULL; + fDoubleDifferentialCrossSectionHist = NULL ; + + fshoot3=true; + fshoot4=true; + + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // This constructor aim to provide a fast way to instantiate a reaction without input file // The string should be of the form "A(b,c)D@E" with E the ernegy of the beam in MeV @@ -98,35 +98,35 @@ Reaction::Reaction(string reaction){ if(reaction.compare(i,1,"(")!=0) A.push_back(reaction[i]); else break; } - + i++; for(; i < reaction.length() ; i++){ if(reaction.compare(i,1,",")!=0) b.push_back(reaction[i]); else break; } - + i++; for(; i < reaction.length() ; i++){ if(reaction.compare(i,1,")")!=0) c.push_back(reaction[i]); else break; } - + i++; for(; i < reaction.length() ; i++){ if(reaction.compare(i,1,"@")!=0) D.push_back(reaction[i]); else break; } - + i++; for(; i < reaction.length() ; i++){ E.push_back(reaction[i]); } - + fKineLine3 = 0 ; fKineLine4 = 0 ; - fLineBrho3 = 0; - fTheta3VsTheta4 = 0; - fAngleLine = 0; + fLineBrho3 = 0; + fTheta3VsTheta4 = 0; + fAngleLine = 0; fNuclei1 = Beam(A); fNuclei2 = Nucleus(b); fNuclei3 = Nucleus(c); @@ -138,18 +138,18 @@ Reaction::Reaction(string reaction){ fQValue = 0; fVerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); initializePrecomputeVariable(); - + // do that to avoid warning from multiple Hist with same name... int offset = 0; int offset = 0; while(gDirectory->FindObjectAny(Form("EnergyHist_%i",offset))!=0) ++offset; - + fCrossSectionHist = new TH1F(Form("EnergyHist_%i",offset),"Reaction_CS",1,0,180); fDoubleDifferentialCrossSectionHist = NULL ; - + fshoot3=true; fshoot4=true; - + initializePrecomputeVariable(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -158,27 +158,27 @@ Reaction::~Reaction(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... bool Reaction::CheckKinematic(){ - double theta = fThetaCM; - if (m1 > m2) theta = M_PI - fThetaCM; - - fEnergyImpulsionCM_3 = TLorentzVector(pCM_3*sin(theta),0,pCM_3*cos(theta),ECM_3); - fEnergyImpulsionCM_4 = fTotalEnergyImpulsionCM - fEnergyImpulsionCM_3; - - fEnergyImpulsionLab_3 = fEnergyImpulsionCM_3; - fEnergyImpulsionLab_3.Boost(0,0,BetaCM); - fEnergyImpulsionLab_4 = fEnergyImpulsionCM_4; - fEnergyImpulsionLab_4.Boost(0,0,BetaCM); - - if ( fabs(fTotalEnergyImpulsionLab.E() - (fEnergyImpulsionLab_3.E()+fEnergyImpulsionLab_4.E()))> 1e-6){ - cout << "Problem with energy conservation" << endl; - return false; - } - - else{ - //cout << "Kinematic OK" << endl; - return true; - } - + double theta = fThetaCM; + if (m1 > m2) theta = M_PI - fThetaCM; + + fEnergyImpulsionCM_3 = TLorentzVector(pCM_3*sin(theta),0,pCM_3*cos(theta),ECM_3); + fEnergyImpulsionCM_4 = fTotalEnergyImpulsionCM - fEnergyImpulsionCM_3; + + fEnergyImpulsionLab_3 = fEnergyImpulsionCM_3; + fEnergyImpulsionLab_3.Boost(0,0,BetaCM); + fEnergyImpulsionLab_4 = fEnergyImpulsionCM_4; + fEnergyImpulsionLab_4.Boost(0,0,BetaCM); + + if ( fabs(fTotalEnergyImpulsionLab.E() - (fEnergyImpulsionLab_3.E()+fEnergyImpulsionLab_4.E()))> 1e-6){ + cout << "Problem with energy conservation" << endl; + return false; + } + + else{ + //cout << "Kinematic OK" << endl; + return true; + } + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... double Reaction::ShootRandomThetaCM(){ @@ -187,7 +187,7 @@ double Reaction::ShootRandomThetaCM(){ // Take a slice in energy TAxis* Y = fDoubleDifferentialCrossSectionHist->GetYaxis(); int binY; - + // Those test are there for the tail event of the energy distribution // In case the energy is outside the range of the 2D histo we take the // closest available CS @@ -202,7 +202,7 @@ double Reaction::ShootRandomThetaCM(){ TH1D* Proj = fDoubleDifferentialCrossSectionHist->ProjectionX("proj",binY,binY); SetThetaCM( theta=Proj->GetRandom()*deg ); - } + } else SetThetaCM( theta=fCrossSectionHist->GetRandom()*deg ); return theta; @@ -216,54 +216,54 @@ void Reaction::ShootRandomExcitationEnergy(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Reaction::KineRelativistic(double& ThetaLab3, double& KineticEnergyLab3, - double& ThetaLab4, double& KineticEnergyLab4){ - // 2-body relativistic kinematics: direct + inverse - // EnergieLab3,4 : lab energy in MeV of the 2 ejectiles - // ThetaLab3,4 : angles in rad - - // case of inverse kinematics - double theta = fThetaCM; - if (m1 > m2) theta = M_PI - fThetaCM; - - fEnergyImpulsionCM_3 = TLorentzVector(pCM_3*sin(theta),0,pCM_3*cos(theta),ECM_3); - fEnergyImpulsionCM_4 = fTotalEnergyImpulsionCM - fEnergyImpulsionCM_3; - - fEnergyImpulsionLab_3 = fEnergyImpulsionCM_3; - fEnergyImpulsionLab_3.Boost(0,0,BetaCM); - fEnergyImpulsionLab_4 = fEnergyImpulsionCM_4; - fEnergyImpulsionLab_4.Boost(0,0,BetaCM); - - // Angle in the lab frame - ThetaLab3 = fEnergyImpulsionLab_3.Angle(fEnergyImpulsionLab_1.Vect()); - if (ThetaLab3 < 0) ThetaLab3 += M_PI; - - ThetaLab4 = fEnergyImpulsionLab_4.Angle(fEnergyImpulsionLab_1.Vect()); - if (fabs(ThetaLab3) < 1e-6) ThetaLab3 = 0; - ThetaLab4 = fabs(ThetaLab4); - if (fabs(ThetaLab4) < 1e-6) ThetaLab4 = 0; - - // Kinetic Energy in the lab frame - KineticEnergyLab3 = fEnergyImpulsionLab_3.E() - m3; - KineticEnergyLab4 = fEnergyImpulsionLab_4.E() - m4; - - // test for total energy conversion - if (fabs(fTotalEnergyImpulsionLab.E() - (fEnergyImpulsionLab_3.E()+fEnergyImpulsionLab_4.E())) > 1e-6) - cout << "Problem for energy conservation" << endl; + double& ThetaLab4, double& KineticEnergyLab4){ + // 2-body relativistic kinematics: direct + inverse + // EnergieLab3,4 : lab energy in MeV of the 2 ejectiles + // ThetaLab3,4 : angles in rad + + // case of inverse kinematics + double theta = fThetaCM; + if (m1 > m2) theta = M_PI - fThetaCM; + + fEnergyImpulsionCM_3 = TLorentzVector(pCM_3*sin(theta),0,pCM_3*cos(theta),ECM_3); + fEnergyImpulsionCM_4 = fTotalEnergyImpulsionCM - fEnergyImpulsionCM_3; + + fEnergyImpulsionLab_3 = fEnergyImpulsionCM_3; + fEnergyImpulsionLab_3.Boost(0,0,BetaCM); + fEnergyImpulsionLab_4 = fEnergyImpulsionCM_4; + fEnergyImpulsionLab_4.Boost(0,0,BetaCM); + + // Angle in the lab frame + ThetaLab3 = fEnergyImpulsionLab_3.Angle(fEnergyImpulsionLab_1.Vect()); + if (ThetaLab3 < 0) ThetaLab3 += M_PI; + + ThetaLab4 = fEnergyImpulsionLab_4.Angle(fEnergyImpulsionLab_1.Vect()); + if (fabs(ThetaLab3) < 1e-6) ThetaLab3 = 0; + ThetaLab4 = fabs(ThetaLab4); + if (fabs(ThetaLab4) < 1e-6) ThetaLab4 = 0; + + // Kinetic Energy in the lab frame + KineticEnergyLab3 = fEnergyImpulsionLab_3.E() - m3; + KineticEnergyLab4 = fEnergyImpulsionLab_4.E() - m4; + + // test for total energy conversion + if (fabs(fTotalEnergyImpulsionLab.E() - (fEnergyImpulsionLab_3.E()+fEnergyImpulsionLab_4.E())) > 1e-6) + cout << "Problem for energy conservation" << endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... double Reaction::ReconstructRelativistic(double EnergyLab, double ThetaLab){ // EnergyLab in MeV // ThetaLab in rad - double E3 = m3 + EnergyLab; - double p_Lab_3 = sqrt(E3*E3 - m3*m3); - fEnergyImpulsionLab_3 = TLorentzVector(p_Lab_3*sin(ThetaLab),0,p_Lab_3*cos(ThetaLab),E3); + double E3 = m3 + EnergyLab; + double p_Lab_3 = sqrt(E3*E3 - m3*m3); + fEnergyImpulsionLab_3 = TLorentzVector(p_Lab_3*sin(ThetaLab),0,p_Lab_3*cos(ThetaLab),E3); fEnergyImpulsionLab_4 = fTotalEnergyImpulsionLab - fEnergyImpulsionLab_3; - double Eex = fEnergyImpulsionLab_4.Mag() - fNuclei4.Mass(); - - return Eex; + double Eex = fEnergyImpulsionLab_4.Mag() - fNuclei4.Mass(); + + return Eex; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -271,25 +271,25 @@ double Reaction::ReconstructRelativistic(double EnergyLab, double ThetaLab){ double Reaction::EnergyLabToThetaCM(double EnergyLab, double ThetaLab){ double E3 = m3 + EnergyLab; double p_Lab_3 = sqrt(E3*E3 - m3*m3); - + fEnergyImpulsionLab_3 = TLorentzVector(p_Lab_3*sin(ThetaLab),0,p_Lab_3*cos(ThetaLab),E3); fEnergyImpulsionCM_3 = fEnergyImpulsionLab_3; fEnergyImpulsionCM_3.Boost(0,0,-BetaCM); - + double ThetaCM = M_PI - fEnergyImpulsionCM_1.Angle(fEnergyImpulsionCM_3.Vect()); - + return(ThetaCM); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Reaction::Print() const{ // Print informations concerning the reaction - + cout << "Reaction : " << fNuclei2.GetName() << "(" << fNuclei1.GetName() - << "," << fNuclei3.GetName() << ")" << fNuclei4.GetName() << " @ " - << fBeamEnergy << " MeV" - << endl ; - + << "," << fNuclei3.GetName() << ")" << fNuclei4.GetName() << " @ " + << fBeamEnergy << " MeV" + << endl ; + cout << "Exc Nuclei 3 = " << fExcitation3 << " MeV" << endl; cout << "Exc Nuclei 4 = " << fExcitation4 << " MeV" << endl; cout << "Qgg = " << fQValue << " MeV" << endl; @@ -297,203 +297,122 @@ void Reaction::Print() const{ ////////////////////////////////////////////////////////////////////////////////////////////////////////// void Reaction::ReadConfigurationFile(string Path){ - ////////General Reading needs//////// - string LineBuffer; - string DataBuffer; - - ////////Reaction Setting needs/////// - string Beam, Target, Heavy, Light, CrossSectionPath ; - double CSHalfOpenAngleMin = 0, CSHalfOpenAngleMax = 0; - bool ReadingStatus = false ; - bool check_Beam = false ; - bool check_Target = false ; - bool check_Light = false ; - bool check_Heavy = false ; - bool check_ExcitationEnergy3 = false ; - bool check_ExcitationEnergy4 = false ; - bool check_ExcitationEnergyDistribution = false; - bool check_DoubleDifferentialCrossSectionPath = false; - bool check_CrossSectionPath = false ; - bool check_shoot3 = false ; - bool check_shoot4 = false; - - ////////////////////////////////////////////////////////////////////////////////////////// ifstream ReactionFile; string GlobalPath = getenv("NPTOOL"); string StandardPath = GlobalPath + "/Inputs/EventGenerator/" + Path; ReactionFile.open(Path.c_str()); - if (ReactionFile.is_open()) { - if(fVerboseLevel==1) cout << "\033[1;35m/////////// Two Body Reaction ///////////" << endl; - if(fVerboseLevel==1) cout << "Reading Reaction File " << Path << endl ; - } - - // In case the file is not found in the standard path, the programm try to interpret the file name as an absolute or relative file path. - else{ + if (!ReactionFile.is_open()) { ReactionFile.open(StandardPath.c_str()); if(ReactionFile.is_open()) { - if(fVerboseLevel==1) cout << "\033[1;35m/////////// Two Body Reaction ///////////" << endl; - if(fVerboseLevel==1) cout << "Reading Reaction File " << Path << endl; + Path = StandardPath; } - else {cout << "Reaction File " << Path << " not found" << endl;exit(1);} } - - while (!ReactionFile.eof()) { - //Pick-up next line - getline(ReactionFile, LineBuffer); - - if (LineBuffer.compare(0, 15, "TwoBodyReaction") == 0) { ReadingStatus = true ;} - - - while(ReadingStatus){ - - ReactionFile >> DataBuffer; - - //Search for comment Symbol % - if (LineBuffer.compare(0, 1, "%") == 0) {/* Do Nothing */;} - - else if (DataBuffer=="Beam=") { - check_Beam = true ; - ReactionFile >> DataBuffer; - // Pick up the beam energy from the Beam event generator - fNuclei1.SetVerboseLevel(0); - fNuclei1.ReadConfigurationFile(Path); - fBeamEnergy= fNuclei1.GetEnergy(); - if(fVerboseLevel==1) cout << "\033[1;35mBeam " << fNuclei1.GetName() << " @ " << fBeamEnergy << " MeV" << endl; - } - - else if (DataBuffer=="Target=") { - check_Target = true ; - ReactionFile >> DataBuffer; - fNuclei2 = Nucleus(DataBuffer); - if(fVerboseLevel==1) cout << "Target " << fNuclei2.GetName() << endl; - } - - else if (DataBuffer=="Light=" || DataBuffer=="Nuclei3=") { - check_Light = true ; - ReactionFile >> DataBuffer; - fNuclei3 = Nucleus(DataBuffer); - if(fVerboseLevel==1) cout << "Light " << fNuclei3.GetName() << endl; - } - - else if (DataBuffer== "Heavy="|| DataBuffer=="Nuclei4=") { - check_Heavy = true ; - ReactionFile >> DataBuffer; - fNuclei4 = Nucleus(DataBuffer); - if(fVerboseLevel==1) cout << "Heavy " << fNuclei4.GetName() << endl; - } - - else if (DataBuffer=="ExcitationEnergy3=" || DataBuffer=="ExcitationEnergyLight=") { - check_ExcitationEnergy3 = true ; - ReactionFile >> DataBuffer; - fExcitation3 = atof(DataBuffer.c_str()) * MeV; - if(fVerboseLevel==1) cout << "Excitation Energy Nuclei 3: " << fExcitation3 / MeV << " MeV" << endl; - } - - else if (DataBuffer=="ExcitationEnergy4=" || DataBuffer=="ExcitationEnergyHeavy=") { - check_ExcitationEnergy4 = true ; - ReactionFile >> DataBuffer; - fExcitation4 = atof(DataBuffer.c_str()) * MeV; - if(fVerboseLevel==1) cout << "Excitation Energy Nuclei 4: " << fExcitation4 / MeV << " MeV" << endl; - } - - else if (DataBuffer=="ExcitationEnergyDistribution="){ - check_ExcitationEnergyDistribution = true; - string FileName,HistName; - ReactionFile >> FileName >> HistName; - if(fVerboseLevel==1) cout << "Reading Excitation Energy Distribution file: " << FileName << endl; - fExcitationEnergyHist = Read1DProfile(FileName, HistName ); - fExcitation4 = 0 ; - } - - else if (DataBuffer== "CrossSectionPath=") { - check_CrossSectionPath = true ; - string FileName,HistName; - ReactionFile >> FileName >> HistName; - if(fVerboseLevel==1) cout << "Reading Cross Section file: " << FileName << endl; - TH1F* CStemp = Read1DProfile(FileName, HistName); - - // multiply CStemp by sin(theta) - TF1* fsin = new TF1("sin",Form("1/(sin(x*%f/180.))",M_PI),0,180); - CStemp->Divide(fsin,1); - SetCrossSectionHist(CStemp); - delete fsin; - } - - // Use for multi energy beam simulation - // This distribution is the differential Cross section for each Beam energy - // The Beam energy distribution itself should not be included originally - else if (DataBuffer== "DoubleDifferentialCrossSectionPath=") { - check_DoubleDifferentialCrossSectionPath = true ; - string FileName,HistName; - ReactionFile >> FileName >> HistName; - if(fVerboseLevel==1) cout << "Reading Double Differential Cross Section file: " << FileName << endl; - TH2F* CStemp = Read2DProfile(FileName, HistName); - - // multiply CStemp by sin(theta) - // X axis is theta CM - // Y axis is beam energy - // Division affect only X axis - TF1* fsin = new TF1("sin",Form("1/(sin(x*%f/180.))",M_PI),0,180); - CStemp->Divide(fsin,1); - - SetDoubleDifferentialCrossSectionHist(CStemp); - delete fsin; - } - - else if (DataBuffer.compare(0, 17, "HalfOpenAngleMin=") == 0) { - ReactionFile >> DataBuffer; - CSHalfOpenAngleMin = atof(DataBuffer.c_str()) * deg; - if(fVerboseLevel==1) cout << "HalfOpenAngleMin " << CSHalfOpenAngleMin / deg << " degree" << endl; - } - - else if (DataBuffer.compare(0, 17, "HalfOpenAngleMax=") == 0) { - ReactionFile >> DataBuffer; - CSHalfOpenAngleMax = atof(DataBuffer.c_str()) * deg; - if(fVerboseLevel==1) cout << "HalfOpenAngleMax " << CSHalfOpenAngleMax / deg << " degree" << endl; - } - - else if (DataBuffer== "Shoot3=" || DataBuffer== "ShootLight=") { - check_shoot3 = true ; - ReactionFile >> DataBuffer; - - if(atoi(DataBuffer.c_str()) == 0 ) - fshoot3 = false; - - if(fVerboseLevel==1 && fshoot3) cout << "Shoot 3 : Yes " << endl; - else if (fVerboseLevel==1 ) cout << "Shoot 3 : No " << endl; - } - - else if (DataBuffer== "Shoot4=" || DataBuffer== "ShootHeavy=") { - check_shoot4 = true ; - ReactionFile >> DataBuffer; - - if(atoi(DataBuffer.c_str()) == 0 ) - fshoot4 = false; - - if(fVerboseLevel==1 && fshoot4) cout << "Shoot 4 : Yes " << endl; - else if (fVerboseLevel==1 ) cout << "Shoot 4 : No " << endl; - } - - /////////////////////////////////////////////////// - // If no Transfert Token and no comment, toggle out - else - {/*Ignore Token used by G4*/} - - /////////////////////////////////////////////////// - // If all Token found toggle out - if (check_Beam && check_Target && check_Light && check_Heavy && check_ExcitationEnergy3 - && (check_ExcitationEnergy4 || check_ExcitationEnergyDistribution ) - && (check_CrossSectionPath || check_DoubleDifferentialCrossSectionPath) - && check_shoot4 && check_shoot3) - ReadingStatus = false; + NPL::InputParser parser(Path); + ReadConfigurationFile(parser); +} +////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Reaction::ReadConfigurationFile(NPL::InputParser parser){ + + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("TwoBodyReaction"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "\033[1;35m//// Two body reaction found " << endl; + + vector<string> token1 = {"Beam","Target","Light","Heavy"}; + vector<string> token2 = {"Beam","Target","Nuclei3","Nuclei4"}; + double CSHalfOpenAngleMin= 0*deg ; + double CSHalfOpenAngleMax= 180*deg; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token1)){ + int v = NPOptionManager::getInstance()->GetVerboseLevel(); + NPOptionManager::getInstance()->SetVerboseLevel(0); + fNuclei1.ReadConfigurationFile(parser); + NPOptionManager::getInstance()->SetVerboseLevel(v); + + fBeamEnergy= fNuclei1.GetEnergy(); + + fNuclei2 = Nucleus(blocks[i]->GetString("Target")); + fNuclei3 = Nucleus(blocks[i]->GetString("Light")); + fNuclei4 = Nucleus(blocks[i]->GetString("Heavy")); + } + else if(blocks[i]->HasTokenList(token2)){ + fNuclei1.SetVerboseLevel(0); + fNuclei1.ReadConfigurationFile(parser); + fBeamEnergy= fNuclei1.GetEnergy(); + + fNuclei2 = Nucleus(blocks[i]->GetString("Target")); + fNuclei3 = Nucleus(blocks[i]->GetString("Nuclei3")); + fNuclei4 = Nucleus(blocks[i]->GetString("Nuclei4")); + } + else{ + cout << "ERROR: check your input file formatting \033[0m" << endl; + exit(1); + } + + if(blocks[i]->HasToken("ExcitationEnergyLight")) + fExcitation3 = blocks[i]->GetDouble("ExcitationEnergyLight","MeV"); + else if(blocks[i]->HasToken("ExcitationEnergy3")) + fExcitation3 = blocks[i]->GetDouble("ExcitationEnergy3","MeV"); + + if(blocks[i]->HasToken("ExcitationEnergyHeavy")) + fExcitation4 = blocks[i]->GetDouble("ExcitationEnergyHeavy","MeV"); + else if(blocks[i]->HasToken("ExcitationEnergy4")) + fExcitation4 = blocks[i]->GetDouble("ExcitationEnergy4","MeV"); + + if(blocks[i]->HasToken("ExcitationEnergyDistribution")){ + vector<string> file = blocks[i]->GetVectorString("ExcitationEnergyDistribution"); + fExcitationEnergyHist = Read1DProfile(file[0],file[1]); + fExcitation4 = 0 ; + } + + if(blocks[i]->HasToken("CrossSectionPath")){ + vector<string> file = blocks[i]->GetVectorString("CrossSectionPath"); + TH1F* CStemp = Read1DProfile(file[0], file[1]); + + // multiply CStemp by sin(theta) + TF1* fsin = new TF1("sin",Form("1/(sin(x*%f/180.))",M_PI),0,180); + CStemp->Divide(fsin,1); + SetCrossSectionHist(CStemp); + delete fsin; + } + + if(blocks[i]->HasToken("DoubleDifferentialCrossSectionPath")){ + vector<string> file = blocks[i]->GetVectorString("DoubleDifferentialCrossSectionPath"); + TH2F* CStemp = Read2DProfile(file[0],file[1]); + + // multiply CStemp by sin(theta) + // X axis is theta CM + // Y axis is beam energy + // Division affect only X axis + TF1* fsin = new TF1("sin",Form("1/(sin(x*%f/180.))",M_PI),0,180); + CStemp->Divide(fsin,1); + + SetDoubleDifferentialCrossSectionHist(CStemp); + delete fsin; + } + + if(blocks[i]->HasToken("HalfOpenAngleMin")){ + CSHalfOpenAngleMin = blocks[i]->GetDouble("HalfOpenAngleMin","deg"); + } + if(blocks[i]->HasToken("HalfOpenAngleMax")){ + CSHalfOpenAngleMax = blocks[i]->GetDouble("HalfOpenAngleMax","deg"); + } + if(blocks[i]->HasToken("Shoot3")){ + fshoot3 = blocks[i]->GetInt("Shoot3"); + } + if(blocks[i]->HasToken("Shoot4")){ + fshoot4 = blocks[i]->GetInt("Shoot4"); + } + if(blocks[i]->HasToken("ShootHeavy")){ + fshoot4 = blocks[i]->GetInt("ShootHeavy"); + } + if(blocks[i]->HasToken("ShootLight")){ + fshoot3 = blocks[i]->GetInt("ShootLight"); } } -cout << "\033[0m" ; - // Modifiy the CS to shoot only within ]HalfOpenAngleMin,HalfOpenAngleMax[ SetCSAngle(CSHalfOpenAngleMin,CSHalfOpenAngleMax); - ReactionFile.close(); initializePrecomputeVariable(); + cout << "\033[0m" ; } //////////////////////////////////////////////////////////////////////////////////////////// @@ -510,208 +429,208 @@ void Reaction::initializePrecomputeVariable(){ s = m1*m1 + m2*m2 + 2*m2*(fBeamEnergy + m1); fTotalEnergyImpulsionCM = TLorentzVector(0,0,0,sqrt(s)); - - ECM_1 = (s + m1*m1 - m2*m2)/(2*sqrt(s)); - ECM_2 = (s + m2*m2 - m1*m1)/(2*sqrt(s)); - ECM_3 = (s + m3*m3 - m4*m4)/(2*sqrt(s)); - ECM_4 = (s + m4*m4 - m3*m3)/(2*sqrt(s)); - - pCM_1 = sqrt(ECM_1*ECM_1 - m1*m1); - pCM_2 = sqrt(ECM_2*ECM_2 - m2*m2); - pCM_3 = sqrt(ECM_3*ECM_3 - m3*m3); - pCM_4 = sqrt(ECM_4*ECM_4 - m4*m4); - + + ECM_1 = (s + m1*m1 - m2*m2)/(2*sqrt(s)); + ECM_2 = (s + m2*m2 - m1*m1)/(2*sqrt(s)); + ECM_3 = (s + m3*m3 - m4*m4)/(2*sqrt(s)); + ECM_4 = (s + m4*m4 - m3*m3)/(2*sqrt(s)); + + pCM_1 = sqrt(ECM_1*ECM_1 - m1*m1); + pCM_2 = sqrt(ECM_2*ECM_2 - m2*m2); + pCM_3 = sqrt(ECM_3*ECM_3 - m3*m3); + pCM_4 = sqrt(ECM_4*ECM_4 - m4*m4); + fImpulsionLab_1 = TVector3(0,0,sqrt(fBeamEnergy*fBeamEnergy + 2*fBeamEnergy*m1)); fImpulsionLab_2 = TVector3(0,0,0); - + fEnergyImpulsionLab_1 = TLorentzVector(fImpulsionLab_1,m1+fBeamEnergy); fEnergyImpulsionLab_2 = TLorentzVector(fImpulsionLab_2,m2); - + fTotalEnergyImpulsionLab = fEnergyImpulsionLab_1 + fEnergyImpulsionLab_2; - + BetaCM = fTotalEnergyImpulsionLab.Beta(); - + fEnergyImpulsionCM_1 = fEnergyImpulsionLab_1; fEnergyImpulsionCM_1.Boost(0,0,-BetaCM); - + fEnergyImpulsionCM_2 = fEnergyImpulsionLab_2; fEnergyImpulsionCM_2.Boost(0,0,-BetaCM); } //////////////////////////////////////////////////////////////////////////////////////////// void Reaction::SetNuclei3(double EnergyLab, double ThetaLab){ - double p3 = sqrt(pow(EnergyLab,2) + 2*m3*EnergyLab); - - fEnergyImpulsionLab_3 = TLorentzVector(p3*sin(ThetaLab),0,p3*cos(ThetaLab),EnergyLab+m3); - fEnergyImpulsionLab_4 = fTotalEnergyImpulsionLab - fEnergyImpulsionLab_3; - - fNuclei3.SetEnergyImpulsion(fEnergyImpulsionLab_3); - fNuclei4.SetEnergyImpulsion(fEnergyImpulsionLab_4); - - fThetaCM = EnergyLabToThetaCM(EnergyLab, ThetaLab); - fExcitation4 = ReconstructRelativistic(EnergyLab, ThetaLab); + double p3 = sqrt(pow(EnergyLab,2) + 2*m3*EnergyLab); + + fEnergyImpulsionLab_3 = TLorentzVector(p3*sin(ThetaLab),0,p3*cos(ThetaLab),EnergyLab+m3); + fEnergyImpulsionLab_4 = fTotalEnergyImpulsionLab - fEnergyImpulsionLab_3; + + fNuclei3.SetEnergyImpulsion(fEnergyImpulsionLab_3); + fNuclei4.SetEnergyImpulsion(fEnergyImpulsionLab_4); + + fThetaCM = EnergyLabToThetaCM(EnergyLab, ThetaLab); + fExcitation4 = ReconstructRelativistic(EnergyLab, ThetaLab); } //////////////////////////////////////////////////////////////////////////////////////////// TGraph* Reaction::GetKinematicLine3(double AngleStep_CM){ - - vector<double> vx; - vector<double> vy; - double theta3,E3,theta4,E4; - - for (double angle=0 ; angle < 360 ; angle+=AngleStep_CM){ - SetThetaCM(angle*deg); - KineRelativistic(theta3, E3, theta4, E4); - fNuclei3.SetKineticEnergy(E3); - + + vector<double> vx; + vector<double> vy; + double theta3,E3,theta4,E4; + + for (double angle=0 ; angle < 360 ; angle+=AngleStep_CM){ + SetThetaCM(angle*deg); + KineRelativistic(theta3, E3, theta4, E4); + fNuclei3.SetKineticEnergy(E3); + if(E3>0){ - vx.push_back(theta3/deg); - vy.push_back(E3); + vx.push_back(theta3/deg); + vy.push_back(E3); } - } - fKineLine3 = new TGraph(vx.size(),&vx[0],&vy[0]); - - return(fKineLine3); + } + fKineLine3 = new TGraph(vx.size(),&vx[0],&vy[0]); + + return(fKineLine3); } //////////////////////////////////////////////////////////////////////////////////////////// TGraph* Reaction::GetKinematicLine4(double AngleStep_CM){ - vector<double> vx; - vector<double> vy; - double theta3,E3,theta4,E4; - - for (double angle=0 ; angle < 360 ; angle+=AngleStep_CM){ + vector<double> vx; + vector<double> vy; + double theta3,E3,theta4,E4; + + for (double angle=0 ; angle < 360 ; angle+=AngleStep_CM){ SetThetaCM(angle*deg); - KineRelativistic(theta3, E3, theta4, E4); - fNuclei4.SetKineticEnergy(E4); - if(E4>0){ - vx.push_back(theta4/deg); - vy.push_back(E4); + KineRelativistic(theta3, E3, theta4, E4); + fNuclei4.SetKineticEnergy(E4); + if(E4>0){ + vx.push_back(theta4/deg); + vy.push_back(E4); } - } - fKineLine4= new TGraph(vx.size(),&vx[0],&vy[0]); - - return(fKineLine4); + } + fKineLine4= new TGraph(vx.size(),&vx[0],&vy[0]); + + return(fKineLine4); } //////////////////////////////////////////////////////////////////////////////////////////// TGraph* Reaction::GetTheta3VsTheta4(double AngleStep_CM) { - vector<double> vx; - vector<double> vy; - double theta3,E3,theta4,E4; - - for (double angle=0 ; angle < 360 ; angle+=AngleStep_CM){ - SetThetaCM(angle*deg); - KineRelativistic(theta3, E3, theta4, E4); - - vx.push_back(theta3/deg); - vy.push_back(theta4/deg); - } - fTheta3VsTheta4= new TGraph(vx.size(),&vx[0],&vy[0]); - return(fTheta3VsTheta4); + vector<double> vx; + vector<double> vy; + double theta3,E3,theta4,E4; + + for (double angle=0 ; angle < 360 ; angle+=AngleStep_CM){ + SetThetaCM(angle*deg); + KineRelativistic(theta3, E3, theta4, E4); + + vx.push_back(theta3/deg); + vy.push_back(theta4/deg); + } + fTheta3VsTheta4= new TGraph(vx.size(),&vx[0],&vy[0]); + return(fTheta3VsTheta4); } //////////////////////////////////////////////////////////////////////////////////////////// TGraph* Reaction::GetBrhoLine3(double AngleStep_CM){ - vector<double> vx; - vector<double> vy; - double theta3,E3,theta4,E4; - double Brho; - - for (double angle=0 ; angle < 360 ; angle+=AngleStep_CM){ - SetThetaCM(angle*deg); - KineRelativistic(theta3, E3, theta4, E4); - fNuclei3.SetKineticEnergy(E3); - Brho = fNuclei3.GetBrho(); - - vx.push_back(theta3/deg); - vy.push_back(Brho); - } - fLineBrho3= new TGraph(vx.size(),&vx[0],&vy[0]); - return(fLineBrho3); + vector<double> vx; + vector<double> vy; + double theta3,E3,theta4,E4; + double Brho; + + for (double angle=0 ; angle < 360 ; angle+=AngleStep_CM){ + SetThetaCM(angle*deg); + KineRelativistic(theta3, E3, theta4, E4); + fNuclei3.SetKineticEnergy(E3); + Brho = fNuclei3.GetBrho(); + + vx.push_back(theta3/deg); + vy.push_back(Brho); + } + fLineBrho3= new TGraph(vx.size(),&vx[0],&vy[0]); + return(fLineBrho3); } //////////////////////////////////////////////////////////////////////////////////////////// TGraph* Reaction::GetThetaLabVersusThetaCM(double AngleStep_CM){ - vector<double> vx; - vector<double> vy; - double theta3,E3,theta4,E4; - - for (double angle=0 ; angle < 360 ; angle+=AngleStep_CM){ - SetThetaCM(angle*deg); - KineRelativistic(theta3, E3, theta4, E4); + vector<double> vx; + vector<double> vy; + double theta3,E3,theta4,E4; - vx.push_back(fThetaCM/deg); - vy.push_back(theta3/deg); + for (double angle=0 ; angle < 360 ; angle+=AngleStep_CM){ + SetThetaCM(angle*deg); + KineRelativistic(theta3, E3, theta4, E4); + + vx.push_back(fThetaCM/deg); + vy.push_back(theta3/deg); } - - fAngleLine= new TGraph(vx.size(),&vx[0],&vy[0]); - return(fAngleLine); + + fAngleLine= new TGraph(vx.size(),&vx[0],&vy[0]); + return(fAngleLine); } //////////////////////////////////////////////////////////////////////////////////////////// TGraph* Reaction::GetELabVersusThetaCM(double AngleStep_CM){ - vector<double> vx; - vector<double> vy; - double theta3,E3,theta4,E4; - - for (double angle=0 ; angle < 360 ; angle+=AngleStep_CM){ - SetThetaCM(angle*deg); - KineRelativistic(theta3, E3, theta4, E4); - + vector<double> vx; + vector<double> vy; + double theta3,E3,theta4,E4; + + for (double angle=0 ; angle < 360 ; angle+=AngleStep_CM){ + SetThetaCM(angle*deg); + KineRelativistic(theta3, E3, theta4, E4); + vx.push_back(E3); - vy.push_back(fThetaCM/deg); + vy.push_back(fThetaCM/deg); } - - fAngleLine= new TGraph(vx.size(),&vx[0],&vy[0]); - return(fAngleLine); + + fAngleLine= new TGraph(vx.size(),&vx[0],&vy[0]); + return(fAngleLine); } //////////////////////////////////////////////////////////////////////////////////////////// Double_t Reaction::GetTotalCrossSection() const { - Double_t stot = fCrossSectionHist->Integral("width"); // take bin width into account (in deg!) - stot *= M_PI/180; // correct so that bin width is in rad - stot *= 2*M_PI; // integration over phi + Double_t stot = fCrossSectionHist->Integral("width"); // take bin width into account (in deg!) + stot *= M_PI/180; // correct so that bin width is in rad + stot *= 2*M_PI; // integration over phi - return stot; + return stot; } //////////////////////////////////////////////////////////////////////////////////////////// void Reaction::PrintKinematic(){ - int size = 360; - double theta3,E3,theta4,E4,Brho3,Brho4; - - cout << endl; - cout << "*********************** Print Kinematic ***********************" << endl; - cout << "ThetaCM" << " " << "ThetaLab" << " " << "EnergyLab3" << " " << "Brho3" << " " << "EnergyLab4" << " " << "Brho4" << endl; - for (int i = 0; i < size; ++i){ - SetThetaCM(((double)i)/2*deg); - KineRelativistic(theta3, E3, theta4, E4); - - fNuclei3.SetKineticEnergy(E3); - Brho3 = fNuclei3.GetBrho(); - - fNuclei4.SetKineticEnergy(E4); - Brho4 = fNuclei4.GetBrho(); - - cout << (double)i/2 << " " << theta3/deg << " " << E3 << " " << Brho3 << " " << E4 << " " << Brho4 << endl; + int size = 360; + double theta3,E3,theta4,E4,Brho3,Brho4; + + cout << endl; + cout << "*********************** Print Kinematic ***********************" << endl; + cout << "ThetaCM" << " " << "ThetaLab" << " " << "EnergyLab3" << " " << "Brho3" << " " << "EnergyLab4" << " " << "Brho4" << endl; + for (int i = 0; i < size; ++i){ + SetThetaCM(((double)i)/2*deg); + KineRelativistic(theta3, E3, theta4, E4); + + fNuclei3.SetKineticEnergy(E3); + Brho3 = fNuclei3.GetBrho(); + + fNuclei4.SetKineticEnergy(E4); + Brho4 = fNuclei4.GetBrho(); + + cout << (double)i/2 << " " << theta3/deg << " " << E3 << " " << Brho3 << " " << E4 << " " << Brho4 << endl; } } //////////////////////////////////////////////////////////////////////////////////////////// void Reaction::SetCSAngle(double CSHalfOpenAngleMin,double CSHalfOpenAngleMax){ - - for (int i = 0 ; i< fCrossSectionHist->GetNbinsX(); i++) - if( fCrossSectionHist->GetBinCenter(i) > CSHalfOpenAngleMax && fCrossSectionHist->GetBinCenter(i) < CSHalfOpenAngleMin) - fCrossSectionHist->SetBinContent(i,0); - + if(fCrossSectionHist){ + for (int i = 0 ; i< fCrossSectionHist->GetNbinsX(); i++) + if( fCrossSectionHist->GetBinCenter(i) > CSHalfOpenAngleMax && fCrossSectionHist->GetBinCenter(i) < CSHalfOpenAngleMin) + fCrossSectionHist->SetBinContent(i,0); + } } diff --git a/NPLib/Physics/NPReaction.h b/NPLib/Physics/NPReaction.h index 5328feae79f1fa09e5f179cce295cfdb35d2cac9..4c2dbfa88df9fa0c96b659ef3e913787f0904a6c 100644 --- a/NPLib/Physics/NPReaction.h +++ b/NPLib/Physics/NPReaction.h @@ -34,6 +34,7 @@ // NPL #include "NPNucleus.h" #include "NPBeam.h" +#include "NPInputParser.h" using namespace NPL; // ROOT header @@ -59,6 +60,8 @@ namespace NPL{ public: // Various Method void ReadConfigurationFile(string Path); + void ReadConfigurationFile(NPL::InputParser); + private: int fVerboseLevel; diff --git a/NPLib/Utility/nptool-installer.cxx b/NPLib/Utility/nptool-installer.cxx index 226556aba1b97a4e97a6b1831dcd5417fbdf66b2..87013aa2f8842807a52da5f120d8d84f9f772f8a 100644 --- a/NPLib/Utility/nptool-installer.cxx +++ b/NPLib/Utility/nptool-installer.cxx @@ -31,9 +31,9 @@ int main(int argc , char** argv){ // Generate the Class list with Token for autoloading of the Detector classes DIR *dir; struct dirent *ent; - string path = getenv("NPTOOL"); + std::string path = getenv("NPTOOL"); path += "/NPLib/lib"; - string lib; + std::string lib; if ((dir = opendir (path.c_str())) != NULL) { while ((ent = readdir (dir)) != NULL) { lib= ent->d_name ; @@ -52,23 +52,23 @@ int main(int argc , char** argv){ if ((dir = opendir (path.c_str())) != NULL){ while ((ent = readdir (dir)) != NULL) { if(ent->d_type == DT_DIR){ - string folderName = ent->d_name ; + std::string folderName = ent->d_name ; if(strncmp(folderName.c_str(),".",1)!=0 && folderName!="scripts" && folderName!="lib" && folderName!="include" && folderName!="Utility" && folderName!="bin" && folderName!="CMakeFiles"){ if(detlist.length()==0 || detlist.find(folderName)!=std::string::npos){ - string command = "ls "+ folderName+"/*.pcm > /dev/null 2>/dev/null"; + std::string command = "ls "+ folderName+"/*.pcm > /dev/null 2>/dev/null"; return_value=system(command.c_str()); if(!return_value){ - string cmd1 = "cp " + folderName+"/*.pcm lib/ > /dev/null 2>/dev/null"; + std::string cmd1 = "cp " + folderName+"/*.pcm lib/ > /dev/null 2>/dev/null"; return_value=system(cmd1.c_str()); } command = "ls "+ folderName+"/*.rootmap > /dev/null 2>/dev/null"; return_value=system(command.c_str()); if(!return_value){ - string cmd2 = "cp " + folderName+"/*.rootmap lib/ > /dev/null 2>/dev/null" ; + std::string cmd2 = "cp " + folderName+"/*.rootmap lib/ > /dev/null 2>/dev/null" ; return_value=system(cmd2.c_str()); } } @@ -82,19 +82,19 @@ int main(int argc , char** argv){ if ((dir = opendir (path.c_str())) != NULL){ while ((ent = readdir (dir)) != NULL) { if(ent->d_type == DT_DIR){ - string folderName = ent->d_name ; + std::string folderName = ent->d_name ; if(strncmp(folderName.c_str(),".",1)!=0){ if(detlist.length()==0 || detlist.find(folderName)!=std::string::npos){ - string command = "ls "+ folderName+"/*.pcm > /dev/null 2>/dev/null"; + std::string command = "ls "+ folderName+"/*.pcm > /dev/null 2>/dev/null"; return_value=system(command.c_str()); if(!return_value){ - string cmd1 = "cp " + folderName+"/*.pcm lib/ > /dev/null 2>/dev/null"; + std::string cmd1 = "cp " + folderName+"/*.pcm lib/ > /dev/null 2>/dev/null"; return_value=system(cmd1.c_str()); } command = "ls Detectors/"+ folderName+"/*.rootmap > /dev/null 2>/dev/null"; return_value=system(command.c_str()); if(!return_value){ - string cmd2 = "cp Detectors/" + folderName+"/*.rootmap lib/ > /dev/null 2>/dev/null" ; + std::string cmd2 = "cp Detectors/" + folderName+"/*.rootmap lib/ > /dev/null 2>/dev/null" ; return_value=system(cmd2.c_str()); } } @@ -110,23 +110,23 @@ int main(int argc , char** argv){ if ((dir = opendir (path.c_str())) != NULL){ while ((ent = readdir (dir)) != NULL) { if(ent->d_type == DT_DIR){ - string folderName = ent->d_name ; + std::string folderName = ent->d_name ; if(strncmp(folderName.c_str(),".",1)!=0 && folderName!="scripts" && folderName!="lib" && folderName!="include" && folderName!="Utility" && folderName!="bin" && folderName!="CMakeFiles"){ if(detlist.length()==0 || detlist.find(folderName)!=std::string::npos){ - string command = "ls Detectors/"+ folderName+"/*.pcm > /dev/null 2>/dev/null"; + std::string command = "ls Detectors/"+ folderName+"/*.pcm > /dev/null 2>/dev/null"; return_value=system(command.c_str()); if(!return_value){ - string cmd1 = "cp Detectors/" + folderName+"/*.pcm lib/ > /dev/null 2>/dev/null"; + std::string cmd1 = "cp Detectors/" + folderName+"/*.pcm lib/ > /dev/null 2>/dev/null"; return_value=system(cmd1.c_str()); } command = "ls "+ folderName+"/*.rootmap > /dev/null 2>/dev/null"; return_value=system(command.c_str()); if(!return_value){ - string cmd2 = "cp Detectors/" + folderName+"/*.rootmap lib/ > /dev/null 2>/dev/null" ; + std::string cmd2 = "cp Detectors/" + folderName+"/*.rootmap lib/ > /dev/null 2>/dev/null" ; return_value=system(cmd2.c_str()); } } @@ -139,7 +139,7 @@ int main(int argc , char** argv){ #ifdef __APPLE__ path = getenv("NPTOOL"); path += "/NPLib/*/*.rootmap"; - string command = "ls "+ path +" > /dev/null 2>/dev/null"; + std::string command = "ls "+ path +" > /dev/null 2>/dev/null"; return_value=system(command.c_str()); if(!return_value){ diff --git a/NPLib/ressources/DetectorSkeleton/NPLib/TDETECTORNAMEPhysics.cxx b/NPLib/ressources/DetectorSkeleton/NPLib/TDETECTORNAMEPhysics.cxx index 20fecd5b211c2cc620df29af253669183a9eedb7..88b42e7f649e6fd31eacaebd1ca3492d188c7dba 100644 --- a/NPLib/ressources/DetectorSkeleton/NPLib/TDETECTORNAMEPhysics.cxx +++ b/NPLib/ressources/DetectorSkeleton/NPLib/TDETECTORNAMEPhysics.cxx @@ -34,6 +34,7 @@ using namespace std; #include "RootInput.h" #include "RootOutput.h" #include "NPDetectorFactory.h" +#include "NPOptionManager.h" // ROOT #include "TChain.h" @@ -52,8 +53,23 @@ TDETECTORNAMEPhysics::TDETECTORNAMEPhysics() m_NumberOfDetectors(0) { } - +/////////////////////////////////////////////////////////////////////////// +/// A usefull method to bundle all operation to add a detector +void TDETECTORNAMEPhysics::AddDetector(TVector3 , string ){ + // In That simple case nothing is done + // Typically for more complex detector one would calculate the relevant + // positions (stripped silicon) or angles (gamma array) + m_NumberOfDetectors++; +} +/////////////////////////////////////////////////////////////////////////// +void TDETECTORNAMEPhysics::AddDetector(double R, double Theta, double Phi, string shape){ + // Compute the TVector3 corresponding + TVector3 Pos(R*sin(Theta)*cos(Phi),R*sin(Theta)*sin(Phi),R*cos(Theta)); + // Call the cartesian method + AddDetector(Pos,shape); +} + /////////////////////////////////////////////////////////////////////////// void TDETECTORNAMEPhysics::BuildSimplePhysicalEvent() { BuildPhysicalEvent(); @@ -186,125 +202,39 @@ void TDETECTORNAMEPhysics::Clear() { /////////////////////////////////////////////////////////////////////////// -void TDETECTORNAMEPhysics::ReadConfiguration(string Path) { - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool check_Shape = false ; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - bool ReadingStatus = false ; - - while (!ConfigFile.eof()){ - - getline(ConfigFile, LineBuffer); - - // If line is a Start Up DETECTORNAME bloc, Reading toggle to true - string name="DETECTORNAME"; - if (LineBuffer.compare(0, name.length(), name) == 0){ - cout << "///" << endl ; - cout << "DETECTORNAME found: " << endl ; - ReadingStatus = true ; +void TDETECTORNAMEPhysics::ReadConfiguration(NPL::InputParser parser) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("DETECTORNAME"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> cart = {"POS","Shape"}; + vector<string> sphe = {"R","Theta","Phi","Shape"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// DETECTORNAME " << i+1 << endl; + + TVector3 Pos = blocks[i]->GetTVector3("POS","mm"); + string Shape = blocks[i]->GetString("Shape"); + AddDetector(Pos,Shape); } - - // Reading Block - while(ReadingStatus) - { - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, name.length(), name) == 0) { - cout << "\033[1;311mWARNING: Another detector is find before standard sequence of Token, Error may occured in detector definition\033[0m" << endl ; - ReadingStatus = false ; - } - - //Angle method - else if (DataBuffer=="THETA=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - cout << "Theta: " << atof(DataBuffer.c_str()) << "deg" << endl; - } - - else if (DataBuffer=="PHI=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - cout << "Phi: " << atof( DataBuffer.c_str() ) << "deg" << endl; - } - - else if (DataBuffer=="R=") { - check_R = true; - ConfigFile >> DataBuffer ; - cout << "R: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - //Position method - else if (DataBuffer=="X=") { - check_X = true; - ConfigFile >> DataBuffer ; - cout << "X: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - else if (DataBuffer=="Y=") { - check_Y = true; - ConfigFile >> DataBuffer ; - cout << "Y: " << atof( DataBuffer.c_str() ) << "mm"<< endl; - } - - else if (DataBuffer=="Z=") { - check_Z = true; - ConfigFile >> DataBuffer ; - cout << "Z: " << atof( DataBuffer.c_str() ) << "mm" << endl; - } - - - //General - else if (DataBuffer=="Shape=") { - check_Shape = true; - ConfigFile >> DataBuffer ; - cout << "Shape: " << DataBuffer << endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; cout << "Wrong Token Sequence: Getting out " << DataBuffer << endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if ( ((check_Theta && check_Phi && check_R) ||( check_X && check_Y && check_Z) ) && check_Shape ){ - m_NumberOfDetectors++; - - // Reinitialisation of Check Boolean - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_Shape = false ; - check_X = false ; - check_Y = false ; - check_Z = false ; - ReadingStatus = false ; - cout << "///"<< endl ; - } + else if(blocks[i]->HasTokenList(sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// DETECTORNAME " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + string Shape = blocks[i]->GetString("Shape"); + AddDetector(R,Theta,Phi,Shape); + } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } } - - /////////////////////////////////////////////////////////////////////////// void TDETECTORNAMEPhysics::InitSpectra() { m_Spectra = new TDETECTORNAMESpectra(m_NumberOfDetectors); diff --git a/NPLib/ressources/DetectorSkeleton/NPLib/TDETECTORNAMEPhysics.h b/NPLib/ressources/DetectorSkeleton/NPLib/TDETECTORNAMEPhysics.h index 10f85515a4ff604be760f57fc531feb738a99ad4..2f4b0da3eb8ce040163d468d11c2302103c02536 100644 --- a/NPLib/ressources/DetectorSkeleton/NPLib/TDETECTORNAMEPhysics.h +++ b/NPLib/ressources/DetectorSkeleton/NPLib/TDETECTORNAMEPhysics.h @@ -32,13 +32,13 @@ using namespace std; #include "TObject.h" #include "TH1.h" #include "TCanvas.h" - +#include "TVector3.h" // NPTool headers #include "TDETECTORNAMEData.h" #include "TDETECTORNAMESpectra.h" #include "NPCalibrationManager.h" #include "NPVDetector.h" - +#include "NPInputParser.h" // forward declaration class TDETECTORNAMESpectra; @@ -67,12 +67,15 @@ class TDETECTORNAMEPhysics : public TObject, public NPL::VDetector { vector<double> Energy; vector<double> Time; - + /// A usefull method to bundle all operation to add a detector + void AddDetector(TVector3 POS, string shape); + void AddDetector(double R, double Theta, double Phi, string shape); + ////////////////////////////////////////////////////////////// // methods inherited from the VDetector ABC class public: // read stream from ConfigFile to pick-up detector parameters - void ReadConfiguration(string); + void ReadConfiguration(NPL::InputParser); // add parameters to the CalibrationManger void AddParameterToCalibrationManager(); diff --git a/NPLib/ressources/DetectorSkeleton/NPSimulation/DETECTORNAME.cc b/NPLib/ressources/DetectorSkeleton/NPSimulation/DETECTORNAME.cc index 902000462c31568e7442c58a2b035e8eb38df787..896640f89fbed2a75a6b2a1298320dd7bbb126fd 100644 --- a/NPLib/ressources/DetectorSkeleton/NPSimulation/DETECTORNAME.cc +++ b/NPLib/ressources/DetectorSkeleton/NPSimulation/DETECTORNAME.cc @@ -44,6 +44,7 @@ #include "RootOutput.h" #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" +#include "NPOptionManager.h" // CLHEP header #include "CLHEP/Random/RandGauss.h" @@ -81,9 +82,18 @@ DETECTORNAME::DETECTORNAME(){ DETECTORNAME::~DETECTORNAME(){ } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void DETECTORNAME::AddDetector(G4ThreeVector POS, string Shape){ + // Convert the POS value to R theta Phi as Spherical coordinate is easier in G4 + m_R.push_back(POS.mag()); + m_Theta.push_back(POS.theta()); + m_Phi.push_back(POS.phi()); + m_Shape.push_back(Shape); +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void DETECTORNAME::AddDETECTORNAME(double R, double Theta, double Phi, string Shape){ +void DETECTORNAME::AddDetector(double R, double Theta, double Phi, string Shape){ m_R.push_back(R); m_Theta.push_back(Theta); m_Phi.push_back(Phi); @@ -125,154 +135,40 @@ G4LogicalVolume* DETECTORNAME::BuildCylindricalDetector(){ // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void DETECTORNAME::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double Theta = 0 , Phi = 0 , R = 0 ; - double X = 0 , Y = 0 , Z = 0 ; - string Shape ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool check_Shape = false ; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - bool ReadingStatus = false ; - - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Start Up DETECTORNAME bloc, Reading toggle to true - string name = "DETECTORNAME"; - - if (LineBuffer.compare(0, name.length(), name) == 0) { - G4cout << "///" << G4endl ; - G4cout << "DETECTORNAME found: " << G4endl ; - ReadingStatus = true ; +void DETECTORNAME::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("DETECTORNAME"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> cart = {"POS","Shape"}; + vector<string> sphe = {"R","Theta","Phi","Shape"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// DETECTORNAME " << i+1 << endl; + + G4ThreeVector Pos = NPS::ConvertVector(blocks[i]->GetTVector3("POS","mm")); + string Shape = blocks[i]->GetString("Shape"); + AddDetector(Pos,Shape); } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, name.length(),name) == 0) { - G4cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << G4endl ; - ReadingStatus = false ; - } - - //Angle method - else if (DataBuffer == "THETA=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - - else if (DataBuffer == "PHI=" ) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - - else if (DataBuffer == "R=") { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R/mm << G4endl; - } - - //Position method - else if (DataBuffer == "X=") { - check_X = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - X = X * mm; - G4cout << "X: " << X / mm << G4endl; - } - - else if (DataBuffer == "Y=") { - check_Y = true; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - Y = Y * mm; - G4cout << "Y: " << Y / mm << G4endl; - } - - else if (DataBuffer == "Z=") { - check_Z = true; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - Z = Z * mm; - G4cout << "Z: " << Z / mm << G4endl; - } - - - //General - else if (DataBuffer == "Shape=") { - check_Shape = true; - ConfigFile >> DataBuffer ; - Shape = DataBuffer ; - G4cout << "Shape: " << Shape << G4endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; - G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (( check_Theta && check_Phi && check_R && check_Shape) - || - ( check_X && check_Y && check_Z && check_Shape)){ - - - // Convert Cartesian to Spherical (detector always face the target) - if (check_X){ - R = sqrt (X*X+Y*Y+Z*Z); - Theta = acos(Z / (R) ); - Phi = atan2(Y,X); - } - - AddDETECTORNAME(R,Theta,Phi,Shape); - - // Reinitialisation of Check Boolean - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_Shape = false ; - check_X = false ; - check_Y = false ; - check_Z = false ; - ReadingStatus = false ; - G4cout << "///"<< G4endl ; - } + else if(blocks[i]->HasTokenList(sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// DETECTORNAME " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + string Shape = blocks[i]->GetString("Shape"); + AddDetector(R,Theta,Phi,Shape); + } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } } + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Construct detector and inialise sensitive part. diff --git a/NPLib/ressources/DetectorSkeleton/NPSimulation/DETECTORNAME.hh b/NPLib/ressources/DetectorSkeleton/NPSimulation/DETECTORNAME.hh index 05782f74469a7fa04261414fd633f34a828f2937..657959c376c3e042dd5248c6bcc15b0cca22e15e 100644 --- a/NPLib/ressources/DetectorSkeleton/NPSimulation/DETECTORNAME.hh +++ b/NPLib/ressources/DetectorSkeleton/NPSimulation/DETECTORNAME.hh @@ -35,6 +35,7 @@ using namespace std; // NPTool header #include "NPSVDetector.hh" #include "TDETECTORNAMEData.h" +#include "NPInputParser.h" class DETECTORNAME : public NPS::VDetector{ //////////////////////////////////////////////////// @@ -48,11 +49,11 @@ class DETECTORNAME : public NPS::VDetector{ /////// Specific Function of this Class /////////// //////////////////////////////////////////////////// public: - // Cylindric plastic - void AddDETECTORNAME(double R, - double Theta, - double Phi, - string Shape); + // Cartesian + void AddDetector(G4ThreeVector POS, string Shape); + // Spherical + void AddDetector(double R,double Theta,double Phi,string Shape); + G4LogicalVolume* BuildSquareDetector(); G4LogicalVolume* BuildCylindricalDetector(); @@ -67,7 +68,7 @@ class DETECTORNAME : public NPS::VDetector{ public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPLib/ressources/DetectorSkeleton/Projects/DETECTORNAME.detector b/NPLib/ressources/DetectorSkeleton/Projects/DETECTORNAME.detector index 18b7a9ef6d41cf8ee67edb00f7fcaadd78582074..3e7490cbb90d32074b4364252cfd53632e6cdea0 100644 --- a/NPLib/ressources/DetectorSkeleton/Projects/DETECTORNAME.detector +++ b/NPLib/ressources/DetectorSkeleton/Projects/DETECTORNAME.detector @@ -1,31 +1,25 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 10 - RADIUS= 20 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 10 micrometer + RADIUS= 20 mm + MATERIAL= CD2 + ANGLE= 0 deg + X= 0 mm + Y= 0 mm + Z= 0 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -DETECTORNAME - X= 0 - Y= 0 - Z= 350 - Shape= Square +pipo + POS= 0 0 350 mm + Shape= Square %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -DETECTORNAME - X= 350 - Y= 350 - Z= 350 - Shape= Square +pipo + POS = 35 35 35 cm + Shape= Square %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -DETECTORNAME - R= 350 - THETA= 90 - PHI= 63 - Shape= Cylindrical +pipo + R= 350 mm + THETA= 90 deg + PHI= 63 deg + Shape= Cylindrical %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/NPLib/scripts/NPToolLogon.C b/NPLib/scripts/NPToolLogon.C index 4138d79b13e8a178a694e846b284e7acec0fef1e..8d6f4963f7a70b9770e5882e7a93f2ff44ad6fb3 100644 --- a/NPLib/scripts/NPToolLogon.C +++ b/NPLib/scripts/NPToolLogon.C @@ -118,9 +118,7 @@ void NPToolLogon(){ } } - // gROOT->ProcessLine(".L $NPTOOL/NPLib/include/RootInput.h+"); - // Since the libdir.GetListOfFiles() commands cds to the // libidr directory, one has to return to the initial // directory diff --git a/NPSimulation/CMakeLists.txt b/NPSimulation/CMakeLists.txt index b321e52e4d05bd2fd1f91c370d85253e5760b176..ea83530ac71e48cd17f0cdac0f18dced733a535e 100644 --- a/NPSimulation/CMakeLists.txt +++ b/NPSimulation/CMakeLists.txt @@ -7,8 +7,8 @@ cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}) project (NPSimulation) set (NPSIM_VERSION_MAJOR 2) -set (NPSIM_VERSION_MINOR 0) -set (NPSIM_VERSION_DETS 18) +set (NPSIM_VERSION_MINOR 1) +set (NPSIM_VERSION_DETS 29) set(CMAKE_BUILD_TYPE Release) diff --git a/NPSimulation/Core/Chamber.cc b/NPSimulation/Core/Chamber.cc index 3c9c94403ea248a067bca93e5f9bbde7bdea4584..438f62e541961017b8ad1b39e31d792b308ab902 100644 --- a/NPSimulation/Core/Chamber.cc +++ b/NPSimulation/Core/Chamber.cc @@ -15,7 +15,7 @@ * This class describe standard Chamber. Derived fromNPS::VDetector * * * *---------------------------------------------------------------------------* - * Comment: last update added GREAT chamber * + * Comment: last update added GREAT chamber * * * * * *****************************************************************************/ @@ -46,7 +46,7 @@ using namespace CLHEP ; // NPTool header #include"Chamber.hh" #include"MaterialManager.hh" - +#include "NPOptionManager.h" using namespace std; @@ -56,128 +56,128 @@ using namespace std; Chamber::Chamber(): nStripsX(60),nStripsY(40) { //m_ChamberType = true; - m_ChamberType = 0 ; - m_ChamberRmin = 0 ; - m_ChamberRmax = 0 ; - m_ChamberPhiMin = 0 ; - m_ChamberPhiMax = 0 ; - m_ChamberThetaMin = 0 ; - m_ChamberThetaMax = 0 ; - - // For GREAT: + m_ChamberType = 0 ; + m_ChamberRmin = 0 ; + m_ChamberRmax = 0 ; + m_ChamberPhiMin = 0 ; + m_ChamberPhiMax = 0 ; + m_ChamberThetaMin = 0 ; + m_ChamberThetaMax = 0 ; + + // For GREAT: DefineMaterials(); - //----------------------------- - //defaults for Planar - fPlanarGuard = 5.0*mm; - fPlanarGe_W = 120.0*mm; - fPlanarGe_H = 60.0*mm; - fPlanarGe_T = 15.0*mm; - - fEndCapThickness = 2.7*mm; //Notes state a 2.2 mm thick rib supporting a 0.5 mm Be window - fAlWindowThickness = 1.1*mm; - fBeWindowThickness = 0.5*mm; - - fPlanarGeGapFront = 14.0*mm; //Front face Al -> Front face Ge - fPlanarGeGapBack = 9.0*mm; //Back face Al -> Back face Ge - fPlanarGeGapFront = 16.0*mm; //Front face Al -> Front face Ge - fPlanarGeGapBack = 7.0*mm; //Back face Al -> Back face Ge - - fPlanarTotalL = 2.*fEndCapThickness + fPlanarGeGapFront + fPlanarGeGapBack + fPlanarGe_T; - - //--------------------------------------- - // I measured 39.5 mm for fPlanarTotalL - // => put end cap thickness 2.75 mm - // => add 1 mm to one of the gaps (most likely the retards put fPlanarGeGapFront = 15 mm !) - fPlanarTotalL = fEndCapThickness + fPlanarGeGapFront + fPlanarGeGapBack + fPlanarGe_T + fAlWindowThickness; - - fdeltaZ_Support = 0.0*mm; //looks like there is a little gap between the cooling block and the planar cut-out - fGap_PCB_2_Planar = 6.0*mm; //the gap between the downstrean part of the PCB and the upstream face of planar - fGap_PCB_2_Planar += fdeltaZ_Support; - fLengthOfPlanarCut = 55.0*mm; //the Z dimension of the cut out used to remove the planar - //-------------------------------------------------------------- - // Cooling block dimensions - fCoolingBlockL = 79.0*mm; - fCoolingBlockH = 152.0*mm; - fCoolingBlockW = 176.7*mm; - fCoolingBlockT = 6.0*mm; //excellent idea for low energy transparency ! - - // Size of cut-out for the tunnel (and DSSD) - fCoolingBlockCutOutH = 74.4*mm; - fCoolingBlockCutOutW = fCoolingBlockW - 2.*fCoolingBlockT; - fCoolingBlockDSSDCentre = fCoolingBlockH - fCoolingBlockT - fCoolingBlockCutOutH/2.; - fDSSD_BoardL = 2.0*mm; //thickness of Si implantation detector support board - - fCoolingBlockZ = fLengthOfPlanarCut + fDSSD_BoardL + fdeltaZ_Support; //distance between chamber inner wall and downstream side of detector support - - G4cout << "fCoolingBlockZ " << fCoolingBlockZ << G4endl; - - - //----------------------------- - //default DSSD - fDSSD_H = 40.0*mm; //active - fDSSD_W = 60.0*mm; //active - fDSSD_T = 0.3*mm; - fDSSD_Guard = 1.0*mm; - - - //----------------------------------------------------- - // Put these defaults here so I can easily compare them - //----------------------------------------------------- - //some default PhaseII detector parameters - fTotalGeL_PhaseII = 70.0 * mm; //was 70 - fCrystalR_PhaseII = 24.0 * mm; //was 25 - fEndCap2Ge_PhaseII = 20.0 * mm; //Distance from Al outer face to Ge - //added to fudge PTG's efficiency measurements for close-geometry STUK config. - fFudge = 8.0*mm; - fEndCap2Ge_PhaseII += fFudge; - - //modify it to make it 5 mm - //fEndCap2Ge_PhaseII -= 23*mm; - - fGapBetweenLeaves_PhaseII = 0.8*mm; - - fHoleR_PhaseII = 5.0 * mm; //was 5.0 - //fPassiveThick_PhaseII = 0.5 * mm; - fContactThick_PhaseII = 0.5 * mm; - - //make the PhaseII solids - CreateCloverIISolids(); - //----------------------------------------------------- - - - //----------------------------------------------------- - //some default GREAT Clover parameters - fTotalGeL_GREAT = 105.0 * mm; - fTaperGeL_GREAT = 30.0 * mm; - fCrystalR_GREAT = 35.0 * mm; - - fFrontFaceSquare_GREAT = 54.00 * mm; - fBackFaceSquare_GREAT = 61.50 * mm; - fEndCap2Ge_GREAT = 10.00 * mm; //Distance from Al outer face to Ge - - fGapBetweenLeaves_GREAT = 0.8*mm; - - fHoleR_GREAT = 5.0 * mm; //was 5.0 - //fPassiveThick_GREAT = 0.5 * mm; - fContactThick_GREAT = 0.5 * mm; - //gap between GREAT clover and chamber in "TOP" position - fGeTopGap = 1.5 * mm; - - //make the GREAT Clover solids - CreateGREATCloverSolids(); - - //----------------------------------------------------- - //Default position of Ges relative to DSSD - geTopPosition = 0. * mm; //-1.5 mm puts the downstream endcap of the GREAT detector level with chamber - geSidePosition = 0. * mm; - //----------------------------------------------------- - - - - //Centre of Si Implantation detector [UPSTREAM] - fDSSD_BoardZ = -fDSSD_BoardL/2.; - fDSSD_BoardZ = 0.0 * mm; - G4cout << "Default SiSuport Z " << fDSSD_BoardZ - fDSSD_BoardL/2. << G4endl; + //----------------------------- + //defaults for Planar + fPlanarGuard = 5.0*mm; + fPlanarGe_W = 120.0*mm; + fPlanarGe_H = 60.0*mm; + fPlanarGe_T = 15.0*mm; + + fEndCapThickness = 2.7*mm; //Notes state a 2.2 mm thick rib supporting a 0.5 mm Be window + fAlWindowThickness = 1.1*mm; + fBeWindowThickness = 0.5*mm; + + fPlanarGeGapFront = 14.0*mm; //Front face Al -> Front face Ge + fPlanarGeGapBack = 9.0*mm; //Back face Al -> Back face Ge + fPlanarGeGapFront = 16.0*mm; //Front face Al -> Front face Ge + fPlanarGeGapBack = 7.0*mm; //Back face Al -> Back face Ge + + fPlanarTotalL = 2.*fEndCapThickness + fPlanarGeGapFront + fPlanarGeGapBack + fPlanarGe_T; + + //--------------------------------------- + // I measured 39.5 mm for fPlanarTotalL + // => put end cap thickness 2.75 mm + // => add 1 mm to one of the gaps (most likely the retards put fPlanarGeGapFront = 15 mm !) + fPlanarTotalL = fEndCapThickness + fPlanarGeGapFront + fPlanarGeGapBack + fPlanarGe_T + fAlWindowThickness; + + fdeltaZ_Support = 0.0*mm; //looks like there is a little gap between the cooling block and the planar cut-out + fGap_PCB_2_Planar = 6.0*mm; //the gap between the downstrean part of the PCB and the upstream face of planar + fGap_PCB_2_Planar += fdeltaZ_Support; + fLengthOfPlanarCut = 55.0*mm; //the Z dimension of the cut out used to remove the planar + //-------------------------------------------------------------- + // Cooling block dimensions + fCoolingBlockL = 79.0*mm; + fCoolingBlockH = 152.0*mm; + fCoolingBlockW = 176.7*mm; + fCoolingBlockT = 6.0*mm; //excellent idea for low energy transparency ! + + // Size of cut-out for the tunnel (and DSSD) + fCoolingBlockCutOutH = 74.4*mm; + fCoolingBlockCutOutW = fCoolingBlockW - 2.*fCoolingBlockT; + fCoolingBlockDSSDCentre = fCoolingBlockH - fCoolingBlockT - fCoolingBlockCutOutH/2.; + fDSSD_BoardL = 2.0*mm; //thickness of Si implantation detector support board + + fCoolingBlockZ = fLengthOfPlanarCut + fDSSD_BoardL + fdeltaZ_Support; //distance between chamber inner wall and downstream side of detector support + + G4cout << "fCoolingBlockZ " << fCoolingBlockZ << G4endl; + + + //----------------------------- + //default DSSD + fDSSD_H = 40.0*mm; //active + fDSSD_W = 60.0*mm; //active + fDSSD_T = 0.3*mm; + fDSSD_Guard = 1.0*mm; + + + //----------------------------------------------------- + // Put these defaults here so I can easily compare them + //----------------------------------------------------- + //some default PhaseII detector parameters + fTotalGeL_PhaseII = 70.0 * mm; //was 70 + fCrystalR_PhaseII = 24.0 * mm; //was 25 + fEndCap2Ge_PhaseII = 20.0 * mm; //Distance from Al outer face to Ge + //added to fudge PTG's efficiency measurements for close-geometry STUK config. + fFudge = 8.0*mm; + fEndCap2Ge_PhaseII += fFudge; + + //modify it to make it 5 mm + //fEndCap2Ge_PhaseII -= 23*mm; + + fGapBetweenLeaves_PhaseII = 0.8*mm; + + fHoleR_PhaseII = 5.0 * mm; //was 5.0 + //fPassiveThick_PhaseII = 0.5 * mm; + fContactThick_PhaseII = 0.5 * mm; + + //make the PhaseII solids + CreateCloverIISolids(); + //----------------------------------------------------- + + + //----------------------------------------------------- + //some default GREAT Clover parameters + fTotalGeL_GREAT = 105.0 * mm; + fTaperGeL_GREAT = 30.0 * mm; + fCrystalR_GREAT = 35.0 * mm; + + fFrontFaceSquare_GREAT = 54.00 * mm; + fBackFaceSquare_GREAT = 61.50 * mm; + fEndCap2Ge_GREAT = 10.00 * mm; //Distance from Al outer face to Ge + + fGapBetweenLeaves_GREAT = 0.8*mm; + + fHoleR_GREAT = 5.0 * mm; //was 5.0 + //fPassiveThick_GREAT = 0.5 * mm; + fContactThick_GREAT = 0.5 * mm; + //gap between GREAT clover and chamber in "TOP" position + fGeTopGap = 1.5 * mm; + + //make the GREAT Clover solids + CreateGREATCloverSolids(); + + //----------------------------------------------------- + //Default position of Ges relative to DSSD + geTopPosition = 0. * mm; //-1.5 mm puts the downstream endcap of the GREAT detector level with chamber + geSidePosition = 0. * mm; + //----------------------------------------------------- + + + + //Centre of Si Implantation detector [UPSTREAM] + fDSSD_BoardZ = -fDSSD_BoardL/2.; + fDSSD_BoardZ = 0.0 * mm; + G4cout << "Default SiSuport Z " << fDSSD_BoardZ - fDSSD_BoardL/2. << G4endl; @@ -185,24 +185,24 @@ Chamber::Chamber(): nStripsX(60),nStripsY(40) G4Material* Chamber::GetMaterialFromLibrary(G4String MaterialName, G4double Temperature, G4double Pressure) { - // avoid compilation warnings - Temperature *= 1; - Pressure *= 1; + // avoid compilation warnings + Temperature *= 1; + Pressure *= 1; - if (MaterialName == "Alu") { + if (MaterialName == "Alu") { return MaterialManager::getInstance()->GetMaterialFromLibrary("Al"); - } - if (MaterialName == "Cu") { + } + if (MaterialName == "Cu") { return MaterialManager::getInstance()->GetMaterialFromLibrary("Cu"); - } - if (MaterialName == "C" || MaterialName == "12C") { // keeping legacy name + } + if (MaterialName == "C" || MaterialName == "12C") { // keeping legacy name return MaterialManager::getInstance()->GetMaterialFromLibrary("C"); - } + } - else { - G4cout << "No Matching Material in the Chamber Library Default is Vacuum" << G4endl; - return MaterialManager::getInstance()->GetMaterialFromLibrary("Vacuum"); - } + else { + G4cout << "No Matching Material in the Chamber Library Default is Vacuum" << G4endl; + return MaterialManager::getInstance()->GetMaterialFromLibrary("Vacuum"); + } } @@ -216,7 +216,7 @@ void Chamber::DefineMaterials() G4String name, symbol; G4int ncomponents, natoms; G4double fractionmass; - + //--------------------------------- //some elements a = 1.0078*g/mole; @@ -230,40 +230,40 @@ void Chamber::DefineMaterials() a = 16.00*g/mole; G4Element* elO = new G4Element(name="Oxygen", symbol="O", z=8., a); - + a = 24.305*g/mole; G4Element* elMg = new G4Element(name="Magnesium", symbol="Mg", z=12., a); - + a = 26.98*g/mole; G4Element* elAl = new G4Element(name="Aluminium", symbol="Al", z=13., a); - + a = 35.45*g/mole; G4Element* elCl = new G4Element(name="Chlorine", symbol="Cl", z=17., a); - + a = 51.9961*g/mole; G4Element* elCr = new G4Element(name="Chromium", symbol="Cr", z=24., a); a = 54.938*g/mole; G4Element* elMn = new G4Element(name="Manganse", symbol="Mn", z=25., a); - + a = 55.845*g/mole; G4Element* elFe = new G4Element(name="Iron", symbol="Fe", z=26., a); - + a = 58.6934*g/mole; G4Element* elNi = new G4Element(name="Nickel", symbol="Ni", z=28., a); a = 63.54*g/mole; G4Element* elCu = new G4Element(name="Copper", symbol="Cu", z=29., a); - + a = 65.39*g/mole; G4Element* elZn = new G4Element(name="Zinc", symbol="Zn", z=30., a); a = 72.61*g/mole; G4Element* elGe = new G4Element(name="Germanium", symbol="Ge", z=32., a); - + a =208.98*g/mole; G4Element* elBi = new G4Element(name="Bismuth", symbol="Bi", z=83., a); - + //elements for physics.... a =251.00*g/mole; G4Element* elEs = new G4Element(name="Einsteinium",symbol="Es", z=99., a); @@ -272,7 +272,7 @@ void Chamber::DefineMaterials() a =251.00*g/mole; G4Element* elFm = new G4Element(name="Fermium", symbol="Fm", z=100., a); fermium = elFm; - + //--------------------------------- //Define required materials a=6.941*g/mole; density=0.534*g/cm3; @@ -280,35 +280,35 @@ void Chamber::DefineMaterials() a=9.0122*g/mole; density=1.85*g/cm3; G4Material* Be=new G4Material(name="Berilium", z=4., a, density); - + a=28.0855*g/mole; density=2.33*g/cm3; G4Material* Si=new G4Material(name="Silicon", z=14., a, density); - + a=72.61*g/mole; density=5.32*g/cm3; G4Material* Ge=new G4Material(name="Germanium", z=32., a, density); - + a=26.98*g/mole; density=2.7*g/cm3; - + new G4Material(name="Aluminium", z=13., a, density); - + a=63.54*g/mole; density=8.96*g/cm3; new G4Material(name="Copper", z=29., a, density); a=183.84*g/mole; density=19.3*g/cm3; new G4Material(name="Tungsten", z=74., a, density); - + //--------------------------------- // AIR density = 1.290*mg/cm3; G4Material* Air = new G4Material(name="Air", density, ncomponents=2); Air->AddElement(elN, fractionmass=70*perCent); Air->AddElement(elO, fractionmass=30*perCent); - + density = 1.e-5*g/cm3; //taken from ExN03 G4double pressure = 2.e-7*bar; G4double temperature = STP_Temperature; G4Material* Vacuum=new G4Material(name="Vacuum", density, ncomponents=1, - kStateGas, temperature, pressure); + kStateGas, temperature, pressure); Vacuum->AddMaterial(Air, fractionmass=1.); //--------------------------------- @@ -318,7 +318,7 @@ void Chamber::DefineMaterials() pressure = 1.5/760.0*atmosphere; temperature = 310*kelvin; G4Material* Pentane=new G4Material(name="Pentane", density, ncomponents=2, - kStateGas, temperature, pressure); + kStateGas, temperature, pressure); Pentane->AddElement(elH, natoms=12); Pentane->AddElement(elC, natoms=5); @@ -329,7 +329,7 @@ void Chamber::DefineMaterials() Steel->AddElement(elCr, natoms= 8); Steel->AddElement(elNi, natoms=18); Steel->AddElement(elFe, natoms=74); - + //------------------------------------------------------------------ //Brass (there are many compositions) density = 8.87*g/cm3; @@ -342,7 +342,7 @@ void Chamber::DefineMaterials() //DurAl [3-4% Cu, 0.5% Mg, 0.25-1%Mn, remainder Al] : use average val density = 2.8*g/cm3; G4Material* DurAl = new G4Material(name="DurAluminium", - density, ncomponents=4); + density, ncomponents=4); DurAl->AddElement(elCu, fractionmass= 3.5*perCent); DurAl->AddElement(elMg, fractionmass= 0.5*perCent); DurAl->AddElement(elMn, fractionmass= 0.6*perCent); @@ -408,201 +408,86 @@ void Chamber::DefineMaterials() // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Chamber::ReadConfiguration(string Path) -{ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer; - string DataBuffer; - - bool ReadingStatusChamber = false ; - bool ReadingStatusGREATChamber = false ; // For GREAT - // bool ReadingStatusCryoChamber = false ; - - bool check_Rmin = false ; - bool check_Rmax = false ; - bool check_PhiMin = false ; - bool check_PhiMax = false ; - bool check_ThetaMin = false ; - bool check_ThetaMax = false ; - bool check_Material = false ; - - // For GREAT - bool check_Hmin = false ; - bool check_Hmax = false ; - bool check_Wmin = false ; - bool check_Wmax = false ; - bool check_Dmin = false ; - bool check_Dmax = false ; - - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 8, "Chamber") == 0) { - G4cout << "Chamber Found" << G4endl; - m_ChamberType = 0; // true ; - ReadingStatusChamber = true ; - } - /* - else if (LineBuffer.compare(0, 10, "CryoChamber") == 0) { - G4cout << "Cryogenic Chamber Found" << G4endl; - m_ChamberType = false ; - ReadingStatusCryoChamber = true ; - } - */ - else if (LineBuffer.compare(0, 12, "GREATChamber") == 0) { - cout << "GREAT Chamber Found" << endl; - m_ChamberType = 2 ; - ReadingStatusGREATChamber = true ; - } - else if (LineBuffer.compare(0, 10, "GREAT-Karl") == 0) { - cout << "GREAT Chamber as defined by Karl Found" << endl; - m_ChamberType = 3 ; - ReadingStatusGREATChamber = true ; - } +void Chamber::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithTokenAndValue("Chamber","Great-Karl"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> token = {"Heightmin","Heightmax","Widthmin","Widthmax","Depthmin","Depthmax","Material"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Great chamber as defined by Karl " << i+1 << endl; + m_ChamberType = 3 ; + m_ChamberHmin = blocks[i]->GetDouble("Heightmin","mm"); + m_ChamberHmax = blocks[i]->GetDouble("Heightmax","mm"); + m_ChamberWmin = blocks[i]->GetDouble("Widthmin","mm"); + m_ChamberWmax = blocks[i]->GetDouble("Widthmax","mm"); + m_ChamberDmin = blocks[i]->GetDouble("Depthmin","mm"); + m_ChamberDmax = blocks[i]->GetDouble("Depthmax","mm"); + m_ChamberMaterial=GetMaterialFromLibrary(blocks[i]->GetString("Material")); + } - while (ReadingStatusChamber) { - ConfigFile >> DataBuffer; - - //Search for comment Symbol % - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - else if (DataBuffer.compare(0, 5, "Rmin=") == 0) { - check_Rmin = true ; - ConfigFile >> DataBuffer; - m_ChamberRmin = atof(DataBuffer.c_str()) * mm; - G4cout << "Chamber inner radius: " << m_ChamberRmin << G4endl ; - } - - else if (DataBuffer.compare(0, 5, "Rmax=") == 0) { - check_Rmax = true ; - ConfigFile >> DataBuffer; - m_ChamberRmax = atof(DataBuffer.c_str()) * mm; - G4cout << "Chamber outer radius: " << m_ChamberRmax << G4endl ; - } - - else if (DataBuffer.compare(0, 8, "PhiMin=") == 0) { - check_PhiMin = true ; - ConfigFile >> DataBuffer; - m_ChamberPhiMin = atof(DataBuffer.c_str()) * rad; - G4cout << "Chamber PhiMin: " << m_ChamberPhiMin << G4endl ; - } - else if (DataBuffer.compare(0, 8, "PhiMax=") == 0) { - check_PhiMax = true ; - ConfigFile >> DataBuffer; - m_ChamberPhiMax = atof(DataBuffer.c_str()) * rad; - G4cout << "Chamber PhiMax: " << m_ChamberPhiMax << G4endl ; - } - else if (DataBuffer.compare(0, 9, "ThetaMin=") == 0) { - check_ThetaMin = true ; - ConfigFile >> DataBuffer; - m_ChamberThetaMin = atof(DataBuffer.c_str()) * rad; - G4cout << "Chamber ThetaMin: " << m_ChamberThetaMin << G4endl ; - } - else if (DataBuffer.compare(0, 9, "ThetaMax=") == 0) { - check_ThetaMax = true ; - ConfigFile >> DataBuffer; - m_ChamberThetaMax = atof(DataBuffer.c_str()) * rad; - G4cout << "Chamber ThetaMax: " << m_ChamberThetaMax << G4endl ; - } - - else if (DataBuffer.compare(0, 9, "MATERIAL=") == 0) { - check_Material = true ; - ConfigFile >> DataBuffer; - m_ChamberMaterial = GetMaterialFromLibrary(DataBuffer); - G4cout << "Chamber Material: " << m_ChamberMaterial << G4endl ; - } - - /////////////////////////////////////////////////// - // If no Beam Token and no comment, toggle out - else - {ReadingStatusChamber = false; G4cout << "WARNING : Wrong Token Sequence: Getting out " << G4endl ;} - - /////////////////////////////////////////////////// - // If all Token found toggle out - if( check_Rmin && check_Rmax && check_Material && check_PhiMin && check_PhiMax && check_ThetaMin && check_ThetaMax ) - ReadingStatusChamber = false ; - - } - - - //// For GREAT Chamber - while (ReadingStatusGREATChamber) { - ConfigFile >> DataBuffer; - - //Search for comment Symbol % - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - else if (DataBuffer.compare(0, 10, "Heightmin=") == 0) { - check_Hmin = true ; - ConfigFile >> DataBuffer; - m_ChamberHmin = atof(DataBuffer.c_str()) * mm; - cout << "Chamber inner radius: " << m_ChamberHmin << endl ; - } - - else if (DataBuffer.compare(0, 10, "Heightmax=") == 0) { - check_Hmax = true ; - ConfigFile >> DataBuffer; - m_ChamberHmax = atof(DataBuffer.c_str()) * mm; - cout << "Chamber outer radius: " << m_ChamberHmax << endl ; - } - else if (DataBuffer.compare(0, 9, "Widthmin=") == 0) { - check_Wmin = true ; - ConfigFile >> DataBuffer; - m_ChamberWmin = atof(DataBuffer.c_str()) * mm; - cout << "Chamber inner radius: " << m_ChamberWmin << endl ; - } - - else if (DataBuffer.compare(0, 9, "Widthmax=") == 0) { - check_Wmax = true ; - ConfigFile >> DataBuffer; - m_ChamberWmax = atof(DataBuffer.c_str()) * mm; - cout << "Chamber outer radius: " << m_ChamberWmax << endl ; - } - else if (DataBuffer.compare(0, 9, "Depthmin=") == 0) { - check_Dmin = true ; - ConfigFile >> DataBuffer; - m_ChamberDmin = atof(DataBuffer.c_str()) * mm; - cout << "Chamber inner radius: " << m_ChamberDmin << endl ; - } - - else if (DataBuffer.compare(0, 9, "Depthmax=") == 0) { - check_Dmax = true ; - ConfigFile >> DataBuffer; - m_ChamberDmax = atof(DataBuffer.c_str()) * mm; - cout << "Chamber outer radius: " << m_ChamberDmax << endl ; - } - - - else if (DataBuffer.compare(0, 9, "MATERIAL=") == 0) { - check_Material = true ; - ConfigFile >> DataBuffer; - m_ChamberMaterial = GetMaterialFromLibrary(DataBuffer); - cout << "Chamber Material: " << m_ChamberMaterial << endl ; - } - - /////////////////////////////////////////////////// - // If no Beam Token and no comment, toggle out - else - {ReadingStatusGREATChamber = false; G4cout << "WARNING : Wrong Token Sequence: Getting out " << G4endl ;} - - /////////////////////////////////////////////////// - // If all Token found toggle out - if( check_Hmin && check_Hmax && check_Material && check_Wmin && check_Wmax && check_Dmin && check_Dmax ) - ReadingStatusGREATChamber = false ; - - } - - - } + else{ + cout << "Warning: check your input file formatting " << endl; + } + } + blocks.clear(); + blocks = parser.GetAllBlocksWithTokenAndValue("Chamber","Great"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Great standard chamber " << i+1 << endl; + m_ChamberType = 2 ; + m_ChamberHmin = blocks[i]->GetDouble("Heightmin","mm"); + m_ChamberHmax = blocks[i]->GetDouble("Heightmax","mm"); + m_ChamberWmin = blocks[i]->GetDouble("Widthmin","mm"); + m_ChamberWmax = blocks[i]->GetDouble("Widthmax","mm"); + m_ChamberDmin = blocks[i]->GetDouble("Depthmin","mm"); + m_ChamberDmax = blocks[i]->GetDouble("Depthmax","mm"); + m_ChamberMaterial=GetMaterialFromLibrary(blocks[i]->GetString("Material")); + } -} + else{ + cout << "Warning: check your input file formatting " << endl; + } + } + blocks.clear(); + blocks = parser.GetAllBlocksWithTokenAndValue("Chamber",""); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + token = {"Heightmin","Heightmax","Widthmin","Widthmax","Depthmin","Depthmax","Material"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Generic Chamber " << i+1 << endl; + m_ChamberType = 0 ; + m_ChamberRmin = blocks[i]->GetDouble("Rmin","mm"); + m_ChamberRmax = blocks[i]->GetDouble("Rmax","mm"); + m_ChamberPhiMin = blocks[i]->GetDouble("PhiMin","deg"); + m_ChamberPhiMax = blocks[i]->GetDouble("PhiMax","deg"); + m_ChamberThetaMin = blocks[i]->GetDouble("ThetaMin","deg"); + m_ChamberThetaMax = blocks[i]->GetDouble("ThetaMax","deg"); + m_ChamberMaterial=GetMaterialFromLibrary(blocks[i]->GetString("Material")); + } + else{ + cout << "Warning: check your input file formatting " << endl; + } + } +} // Little trick to avoid warning in compilation: Use a PVPlacement "buffer". // If don't you will have a Warning unused variable 'myPVP' - G4VPhysicalVolume* PVPBuffer ; +G4VPhysicalVolume* PVPBuffer ; @@ -611,731 +496,731 @@ void Chamber::ReadConfiguration(string Path) // Called After DetecorConstruction::AddDetector Method void Chamber::ConstructDetector(G4LogicalVolume* world) { -// if (m_ChamberType) { // case of standard Chamber - if (m_ChamberType==0) { // case of standard Chamber + // if (m_ChamberType) { // case of standard Chamber + if (m_ChamberType==0) { // case of standard Chamber G4Sphere* solidChamber = new G4Sphere("solidChamber", m_ChamberRmin, m_ChamberRmax, m_ChamberPhiMin, m_ChamberPhiMax, m_ChamberThetaMin, m_ChamberThetaMax ); G4LogicalVolume* logicChamber = new G4LogicalVolume(solidChamber, m_ChamberMaterial, "logicChamber"); - // rotation of target - //G4RotationMatrix *rotation = new G4RotationMatrix(); - //rotation->rotateY(m_ChamberAngle); + // rotation of target + //G4RotationMatrix *rotation = new G4RotationMatrix(); + //rotation->rotateY(m_ChamberAngle); - new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), logicChamber, "Chamber", world, false, 0); + new G4PVPlacement(0, G4ThreeVector(0., 0., 0.), logicChamber, "Chamber", world, false, 0); - G4VisAttributes* ChamberVisAtt = new G4VisAttributes(G4Colour(0., 1., 1.)); - logicChamber->SetVisAttributes(ChamberVisAtt); + G4VisAttributes* ChamberVisAtt = new G4VisAttributes(G4Colour(0., 1., 1.)); + logicChamber->SetVisAttributes(ChamberVisAtt); // } - } +} + +else if(m_ChamberType==1){ // case of cryogenic target +} + +else if(m_ChamberType==2){ // case of GREAT chamber + + G4Box* solidExtChamber + = new G4Box("solidExtChamber", m_ChamberWmax/2, m_ChamberHmax/2, m_ChamberDmax/2 ); + G4Box* solidIntChamber + = new G4Box("solidIntChamber", m_ChamberWmin/2, m_ChamberHmin/2, m_ChamberDmin/2 ); + + G4SubtractionSolid* solidChamber=new G4SubtractionSolid("SolidChamber",solidExtChamber, solidIntChamber, 0, G4ThreeVector(0.,0.,-0.5*cm)); + + + G4LogicalVolume* logicChamber = new G4LogicalVolume(solidChamber, m_ChamberMaterial, "logicChamber"); + + // rotation of target + //G4RotationMatrix *rotation = new G4RotationMatrix(); + //rotation->rotateY(m_ChamberAngle); + + PVPBuffer = + new G4PVPlacement(0, G4ThreeVector(0., -2.92325*cm/2, 0.), logicChamber, "Chamber", world, false, 0); + + G4VisAttributes* ChamberVisAtt = new G4VisAttributes(G4Colour(0., 1., 1.)); + logicChamber->SetVisAttributes(ChamberVisAtt); + + + /* Eleanor's additions: *//* + + // for the DSSSD (considered as passive here !!): + + G4Material* m_DSSSDMaterial = new G4Material("Si", 14, 28.0855*g/mole, 2.33*g/cm3); + + G4Box* solidDSSSD + = new G4Box("solidDSSSD", 6.*cm/2, 4.*cm/2, 0.03*cm/2 ); // + + G4LogicalVolume* logicDSSSD = new G4LogicalVolume(solidDSSSD, m_DSSSDMaterial, "logicDSSSD"); + + PVPBuffer = + new G4PVPlacement(0, G4ThreeVector(-3.2*cm, 0., 0.), logicDSSSD, "DSSSD", world, false, 0); + //new G4PVPlacement(0, G4ThreeVector(-3.2*cm, 2.92325*cm/2, 0.), logicDSSSD, "DSSSD", logicChamber, false, 0); + PVPBuffer = + new G4PVPlacement(0, G4ThreeVector( 3.2*cm, 0., 0.), logicDSSSD, "DSSSD", world, false, 1); + //new G4PVPlacement(0, G4ThreeVector( 3.2*cm, 2.92325*cm/2, 0.), logicDSSSD, "DSSSD", logicChamber, false, 1); + + G4VisAttributes* DSSSDVisAtt = new G4VisAttributes(G4Colour(0., 0., 1.)); + logicDSSSD->SetVisAttributes(DSSSDVisAtt); + + + + // for the solid aluminium support : + + G4Box* solid_alu_support_ext + = new G4Box("solid_alu_support_ext", (18.32-0.65)*cm/2, (12.343-0.65)*cm/2, 8.5*cm/2 ); // + + G4Box* solid_alu_support_int + = new G4Box("solid_alu_support_int",16.27*cm/2, 10.295*cm/2, 8.6*cm/2 ); // + G4SubtractionSolid* solidsupport=new G4SubtractionSolid("Solidsupport",solid_alu_support_ext, solid_alu_support_int, 0, G4ThreeVector(0.,0.,0)); + G4LogicalVolume* logicALU = new G4LogicalVolume(solidsupport, m_ChamberMaterial, "logicALU"); + + PVPBuffer = + new G4PVPlacement(0, G4ThreeVector(0., -2.92325*cm/2,-4.265*cm), logicALU, "Aluminium", world, false, 0); + + G4VisAttributes* alusupportVisAtt = new G4VisAttributes(G4Colour(0.5, 0., 0.3)); + logicALU->SetVisAttributes(alusupportVisAtt); + + + G4Box* solid_alu_support_int1 + = new G4Box("solid_alu_support_int1",16.27*cm/2, 0.55*cm/2, 8.6*cm/2 ); // + + G4LogicalVolume* logicALUint1 = new G4LogicalVolume(solid_alu_support_int1, m_ChamberMaterial, "logicALUint1"); + + PVPBuffer = + new G4PVPlacement(0, G4ThreeVector(0, -2.5215*cm-2.92325*cm/2, -4.265*cm), logicALUint1, "Aluminium", world, false, 0); + + G4VisAttributes* solid_alu_support_int1VisAtt = new G4VisAttributes(G4Colour(0.9, 0., 0.)); + logicALUint1->SetVisAttributes(solid_alu_support_int1VisAtt); + + + G4Box* solid_alu_support_int2 + = new G4Box("solid_alu_support_int2",1.4*cm/2, 2.35*cm/2, 8.6*cm/2 ); // + + G4LogicalVolume* logicALUint2 = new G4LogicalVolume(solid_alu_support_int2, m_ChamberMaterial, "logicALUint2"); + + PVPBuffer = + new G4PVPlacement(0, G4ThreeVector(0, -3.9715*cm-2.92325*cm/2, -4.265*cm), logicALUint2, "Aluminium", world, false, 0); + + + G4VisAttributes* solid_alu_support_int2VisAtt = new G4VisAttributes(G4Colour(0.9, 0., 0.)); + logicALUint2->SetVisAttributes(solid_alu_support_int2VisAtt); + + + G4Box* solid_DSSSD_coating1 + = new G4Box("solid_DSSSD_coating1",16.27*cm/2, 0.1*cm/2, 8.6*cm/2 ); // + + G4LogicalVolume* logicSiliconCoating1 = new G4LogicalVolume(solid_DSSSD_coating1, m_DSSSDMaterial, "logicSiliconCoating1"); + PVPBuffer = + new G4PVPlacement(0, G4ThreeVector(0, -2.5215*cm-2.92325*cm/2+0.05*cm+0.55*cm/2, -4.265*cm), logicSiliconCoating1, "PinDiode1", world, false, 0); + + G4VisAttributes* solid_DSSSD_coating1VisAtt = new G4VisAttributes(G4Colour(0., 0.2, 0.8)); + logicSiliconCoating1->SetVisAttributes(solid_DSSSD_coating1VisAtt); + + + G4Box* solid_DSSSD_coating2 + = new G4Box("solid_DSSSD_coating2",16.27*cm/2, 0.1*cm/2, 8.6*cm/2 ); // + + G4LogicalVolume* logicSiliconCoating2 = new G4LogicalVolume(solid_DSSSD_coating2, m_DSSSDMaterial, "logicSiliconCoating2"); + PVPBuffer = + new G4PVPlacement(0, G4ThreeVector(0, 5.1055*cm-2.92325*cm/2-0.05*cm, -4.265*cm), logicSiliconCoating2, "PinDiode2", world, false, 0); + + G4VisAttributes* solid_DSSSD_coating2VisAtt = new G4VisAttributes(G4Colour(0., 0.2, 0.8)); + logicSiliconCoating2->SetVisAttributes(solid_DSSSD_coating2VisAtt); + + + G4Box* solid_DSSSD_coating3 + = new G4Box("solid_DSSSD_coating3",0.1*cm/2, 7.393*cm/2, 8.6*cm/2 ); // + + G4LogicalVolume* logicSiliconCoating3 = new G4LogicalVolume(solid_DSSSD_coating3, m_DSSSDMaterial, "logicSiliconCoating3"); + PVPBuffer = + new G4PVPlacement(0, G4ThreeVector(8.085*cm, 1.4375*cm-2.92325*cm/2, -4.265*cm), logicSiliconCoating3, "PinDiode3", world, false, 0); + PVPBuffer = + new G4PVPlacement(0, G4ThreeVector(-8.085*cm, 1.4375*cm-2.92325*cm/2, -4.265*cm), logicSiliconCoating3, "PinDiode4", world, false, 1); + + G4VisAttributes* solid_DSSSD_coating3VisAtt = new G4VisAttributes(G4Colour(0., 0.2, 0.8)); + logicSiliconCoating3->SetVisAttributes(solid_DSSSD_coating3VisAtt); + + + + // Preamps and connectors board + + // PCB + + + G4Element* Si = new G4Element("Silicon" , "Si" , 14 , 28.0855 * g / mole); + G4Element* C = new G4Element("Carbon" , "C" , 6 , 12.011 * g / mole); + G4Element* H = new G4Element("Hydrogen" , "H" , 1 , 1.0079 * g / mole); + G4Element* Br = new G4Element("Bromine" , "Br" , 35 , 79.904 * g / mole); + G4Element* O = new G4Element("Oxigen" , "O" , 8 , 16.00 * g / mole); + + G4double density = 1.7 * g / cm3; + G4int ncomponents; + G4Material* PCB = new G4Material("PCB", density, ncomponents = 5); + PCB->AddElement(Si, .181); + PCB->AddElement(O, .406); + PCB->AddElement(C, .278); + PCB->AddElement(H, .068); + PCB->AddElement(Br, .067); + + + + G4Box* pre_amp_board1 + = new G4Box("pre_amp_board1",6.756*cm/2, 1.675*cm/2, 7.976*cm/2 ); // + + G4LogicalVolume* logicpre_amp1 = new G4LogicalVolume(pre_amp_board1, PCB, "logicpre_amp1"); + PVPBuffer = + new G4PVPlacement(0, G4ThreeVector(4.0675*cm, 5.267875*cm, -4.265*cm), logicpre_amp1, "pre_amp_board1", world, false, 0); + PVPBuffer = + new G4PVPlacement(0, G4ThreeVector(-4.0675*cm, 5.267875*cm, -4.265*cm), logicpre_amp1, "pre_amp_board1", world, false, 1); + + + G4VisAttributes* pre_amp_board1VisAtt = new G4VisAttributes(G4Colour(0., 0.7, 0.)); + logicpre_amp1->SetVisAttributes(pre_amp_board1VisAtt); + + G4Box* pre_amp_board2 + = new G4Box("pre_amp_board2",1.675*cm/2, 6.756*cm/2, 7.976*cm/2 ); // - else if(m_ChamberType==1){ // case of cryogenic target - } + G4LogicalVolume* logicpre_amp2 = new G4LogicalVolume(pre_amp_board2, PCB, "logicpre_amp2"); + PVPBuffer = + new G4PVPlacement(0, G4ThreeVector(9.6625*cm, 2.413375*cm, -4.265*cm), logicpre_amp2, "pre_amp_board2", world, false, 0); + PVPBuffer = + new G4PVPlacement(0, G4ThreeVector(9.6625*cm, -5.336625*cm, -4.265*cm), logicpre_amp2, "pre_amp_board2", world, false, 1); - else if(m_ChamberType==2){ // case of GREAT chamber - G4Box* solidExtChamber - = new G4Box("solidExtChamber", m_ChamberWmax/2, m_ChamberHmax/2, m_ChamberDmax/2 ); - G4Box* solidIntChamber - = new G4Box("solidIntChamber", m_ChamberWmin/2, m_ChamberHmin/2, m_ChamberDmin/2 ); + G4VisAttributes* pre_amp_board2VisAtt = new G4VisAttributes(G4Colour(0., 0.7, 0.)); + logicpre_amp2->SetVisAttributes(pre_amp_board2VisAtt); - G4SubtractionSolid* solidChamber=new G4SubtractionSolid("SolidChamber",solidExtChamber, solidIntChamber, 0, G4ThreeVector(0.,0.,-0.5*cm)); + G4Box* pre_amp_board3 + = new G4Box("pre_amp_board3",1.675*cm/2, 6.756*cm/2, 7.976*cm/2 ); // - G4LogicalVolume* logicChamber = new G4LogicalVolume(solidChamber, m_ChamberMaterial, "logicChamber"); + G4LogicalVolume* logicpre_amp3 = new G4LogicalVolume(pre_amp_board3, PCB, "logicpre_amp3"); + PVPBuffer = + new G4PVPlacement(0, G4ThreeVector(-9.6725*cm, 2.413375*cm, -4.265*cm), logicpre_amp3, "pre_amp_board3", world, false, 0); + PVPBuffer = + new G4PVPlacement(0, G4ThreeVector(-9.6725*cm, -5.336625*cm, -4.265*cm), logicpre_amp3, "pre_amp_board3", world, false, 1); - // rotation of target - //G4RotationMatrix *rotation = new G4RotationMatrix(); - //rotation->rotateY(m_ChamberAngle); - PVPBuffer = - new G4PVPlacement(0, G4ThreeVector(0., -2.92325*cm/2, 0.), logicChamber, "Chamber", world, false, 0); + G4VisAttributes* pre_amp_board3VisAtt = new G4VisAttributes(G4Colour(0., 0.7, 0.)); + logicpre_amp3->SetVisAttributes(pre_amp_board3VisAtt); - G4VisAttributes* ChamberVisAtt = new G4VisAttributes(G4Colour(0., 1., 1.)); - logicChamber->SetVisAttributes(ChamberVisAtt); + */ /* end of Eleanor's additions */ - /* Eleanor's additions: *//* - // for the DSSSD (considered as passive here !!): - G4Material* m_DSSSDMaterial = new G4Material("Si", 14, 28.0855*g/mole, 2.33*g/cm3); - - G4Box* solidDSSSD - = new G4Box("solidDSSSD", 6.*cm/2, 4.*cm/2, 0.03*cm/2 ); // - G4LogicalVolume* logicDSSSD = new G4LogicalVolume(solidDSSSD, m_DSSSDMaterial, "logicDSSSD"); +} + + +else if(m_ChamberType==3){ // case of GREAT chamber as defined by Karl + + fChamberH = m_ChamberHmax; + fChamberW = m_ChamberWmax; + //fChamberL = m_ChamberDmax; + fChamberThickness= m_ChamberHmax-m_ChamberHmin; + + fVacuumH = fChamberH - fChamberThickness; + + G4cout << "fChamberH=" << fChamberH << G4endl; + G4cout << "fChamberW=" << fChamberW << G4endl; + G4cout << "fChamberThickness=" << fChamberThickness << G4endl; + + //----------------------------- + // more dimesions for chamber + fChamberL = fCoolingBlockL + fLengthOfPlanarCut + fDSSD_BoardL + fdeltaZ_Support + 2.*fChamberThickness + 10.0*mm; + + + //--------------------------------------------------------------------------------- + // This shift in the position of the chamber is to put the DSSD centred at y = 0 + fShiftChamberY = fCoolingBlockH - fCoolingBlockT - fCoolingBlockCutOutH/2.; //height of centre wrt cooling block base + fShiftChamberY -= fChamberH/2.; + + //Define the downstream face of the DSSD to be at 0 (ie the centre of the DSSD PCB board) + fShiftChamberZ = fCoolingBlockZ + fChamberThickness - fDSSD_BoardL/2.; //a discrepency of 1 mm somewhere + + //the centre of the DSSD wrt the vacuum chamber + fCentreOfDSSD_Y = -fVacuumH/2. + fCoolingBlockH - fCoolingBlockT - fCoolingBlockCutOutH/2.; //+ fChamberThickness + cout << G4endl << " DSSD_Y at 0 mm , but wrt vacuum DSSD_Y @ " << fCentreOfDSSD_Y << G4endl; + + + + + + //-------------------------------------------- + //[partial] Vacuum Chamber (Walls+Vacuum) and end BackPlate + //Set the Upstream side of the Chamber @ Z=0mm + + + //G4Box* solidChamber = new G4Box("chamber",fChamberW/2., fChamberH/2., fChamberL/2.); + // replaced by achamber with a substraction of the Planar area: + G4Box* solidChamberEnv = new G4Box("chamberEnv",fChamberW/2., fChamberH/2., fChamberL/2.); + G4double PlanarCap_W = fPlanarGe_W + 2.*fPlanarGuard + 80.*mm; //A GUESS + G4double PlanarCap_H = 150.*mm; + PlanarCap_H = fPlanarGe_H + 70*mm; + G4double PlanarCap_T = fPlanarTotalL; + G4cout << G4endl << "Planar end-cap thickness " << PlanarCap_T << " cf 41. mm" << G4endl; + fShiftPlanar = fChamberL/2. - fChamberThickness + PlanarCap_T/2. - fLengthOfPlanarCut + fGap_PCB_2_Planar; + G4double Planar_z = fShiftPlanar; + G4Box* solidPlanarCapEnv = new G4Box("planar-cap-Env", PlanarCap_W/2., PlanarCap_H/2., PlanarCap_T/2.); + G4SubtractionSolid* solidChamber = + new G4SubtractionSolid("chamber", solidChamberEnv, solidPlanarCapEnv, 0, G4ThreeVector(0.0*mm, fCentreOfDSSD_Y, Planar_z)); + + // end of replacement + + G4LogicalVolume* logicChamber = new G4LogicalVolume(solidChamber, //it's solid + m_ChamberMaterial,//it's material + //chamberMaterial,//it's material + //vacuumMaterial,//it's material + "Chamber", //it's name + 0, 0, 0); // field manager, sensitive det, user limits + + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.0*mm,-fShiftChamberY,-fChamberL/2.+fShiftChamberZ), + logicChamber, //its logical volume + "Chamber", //its name + world, //its mother + false, //no boolean operat + 0, //copy number + true); //overlap check + + //viewing the chamber + G4VisAttributes* visAttChamber = new G4VisAttributes(G4Colour(1.0,1.0,1.0) ); + visAttChamber->SetVisibility(true); + visAttChamber->SetForceWireframe(true); + logicChamber->SetVisAttributes(visAttChamber); + //logicChamber->SetVisAttributes(G4VisAttributes::Invisible); + + + + //Vacuum within above partial chamber + + G4double vacH = fChamberH - fChamberThickness; + G4double vacW = fChamberW - 2.*fChamberThickness; + G4double vacL = fChamberL - 2.*fChamberThickness; + + //G4Box* solidChamVac = new G4Box("chamVac",vacW/2., vacH/2., vacL/2.); + //Replaced by + G4Box* solidChamVacEnv = new G4Box("chamVacEnV",vacW/2., vacH/2., vacL/2.); + //G4Box* solidPlanarCapEnv = new G4Box("planar-cap-Env", PlanarCap_W/2., PlanarCap_H/2., PlanarCap_T/2.); + G4SubtractionSolid* solidChamVac = + new G4SubtractionSolid("chamVac", solidChamVacEnv, solidPlanarCapEnv, 0, G4ThreeVector(0.0*mm, fCentreOfDSSD_Y+fChamberThickness/2., Planar_z)); + + + G4LogicalVolume* logicChamVac = new G4LogicalVolume(solidChamVac, //it's solid + vacuumMaterial, //it's material + "chamVac", //it's name + 0, 0, 0); // field manager, sensitive det, user limits + + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.0*cm, -fChamberThickness/2., 0.0*cm), + logicChamVac, //its logical volume + "ChamVac", //its name + logicChamber, //its mother + false, //no boolean operat + 0, //copy number + true); //overlap check + + //logicChamVac->SetVisAttributes(G4VisAttributes::Invisible); + logicChamVac->SetVisAttributes(visAttChamber); + + + + /* Uncomment if you want the planar in the geometry and you are not using GRTPlan */ + /* + //---------------------------------------------------------------------- + // The Planar + //---------------------------------------------------------------------- + G4double PlanarCap_W = fPlanarGe_W + 2.*fPlanarGuard + 80.*mm; //A GUESS + G4double PlanarCap_H = 150.*mm; + PlanarCap_H = fPlanarGe_H + 70*mm; + G4double PlanarCap_T = fPlanarTotalL; + G4cout << G4endl << "Planar end-cap thickness " << PlanarCap_T << " cf 41. mm" << G4endl; + + // - editted 07/11/2011 + fShiftPlanar = fChamberL/2. - fChamberThickness + PlanarCap_T/2. - fLengthOfPlanarCut + fGap_PCB_2_Planar; + G4double Planar_z = fShiftPlanar; + fPlanar_PosZ = Planar_z; + + //starting endCap sold + G4Box* solidPlanarCap = new G4Box("planar-cap", PlanarCap_W/2., PlanarCap_H/2., PlanarCap_T/2.); + + //cut outs for Be window : planar end-cap is deliberately symmetric to make positioning more simple + //3 mm wide support rib that is 2.2 mm thick. Add the Be thickness => endCap thickness + G4Box* solidBeCutOut = new G4Box("be-cut-out", fPlanarGe_W/4.-1.5*mm, fPlanarGe_H/2., fEndCapThickness/2.);//is it total 120 mm or 120+gap ? + G4ThreeVector beCutOutTrans1(-fPlanarGe_W/4.-1.5*mm, 0.0*mm, -PlanarCap_T/2.+fEndCapThickness/2.); + G4ThreeVector beCutOutTrans2(+fPlanarGe_W/4.+1.5*mm, 0.0*mm, -PlanarCap_T/2.+fEndCapThickness/2.); + + + G4SubtractionSolid* solidPlanarCap_tmp1 = + new G4SubtractionSolid("planar-capo-1", solidPlanarCap, solidBeCutOut, 0, beCutOutTrans1); + + G4SubtractionSolid* solidPlanarCap_tmp2 = + new G4SubtractionSolid("planar-capo-2", solidPlanarCap_tmp1, solidBeCutOut, 0, beCutOutTrans2); + + + //cut outs for Al window at rear + G4Box* solidAlCutOut = new G4Box("Al-cut-out", fPlanarGe_W/2., fPlanarGe_H/2., fAlWindowThickness/2.); + G4ThreeVector alCutOutTrans(0.0*mm, 0.0*mm, PlanarCap_T/2.-fAlWindowThickness/2.); //ends up being 0.9 mm instead of 1.1 mm thick: CORRECT IT + + G4SubtractionSolid* solidPlanarCap_tmp3 = + new G4SubtractionSolid("planar-capo-3", solidPlanarCap_tmp2, solidAlCutOut, 0, alCutOutTrans); + + + G4LogicalVolume* logicPlanarCap = new G4LogicalVolume(solidPlanarCap_tmp3, // it's solid + //logicPlanarCap = new G4LogicalVolume(solidPlanarCap, // it's solid + endCapMaterial, // it's material + "planar-cap", // it's name + 0, 0, 0); // field manager, sensitive det, user limits + + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.0*mm, fCentreOfDSSD_Y, Planar_z), + logicPlanarCap, //its logical volume + "PlanarCap", //its name + logicChamVac, //its mother + false, //no boolean operat + 0, //copy number + true); //overlap check + + + + + G4VisAttributes* visAttPlanarCapo = new G4VisAttributes(G4Colour(1.0,0.8,1.0) ); + visAttPlanarCapo->SetVisibility(true); + //visAttPlanarCapo->SetVisibility(false); + visAttPlanarCapo->SetForceWireframe(true); + logicPlanarCap->SetVisAttributes(visAttPlanarCapo); + - PVPBuffer = - new G4PVPlacement(0, G4ThreeVector(-3.2*cm, 0., 0.), logicDSSSD, "DSSSD", world, false, 0); - //new G4PVPlacement(0, G4ThreeVector(-3.2*cm, 2.92325*cm/2, 0.), logicDSSSD, "DSSSD", logicChamber, false, 0); - PVPBuffer = - new G4PVPlacement(0, G4ThreeVector( 3.2*cm, 0., 0.), logicDSSSD, "DSSSD", world, false, 1); - //new G4PVPlacement(0, G4ThreeVector( 3.2*cm, 2.92325*cm/2, 0.), logicDSSSD, "DSSSD", logicChamber, false, 1); + //----------------------------------------------------------------------------------------------- + //add the Be window + G4double PlanarBeWindow_z = -PlanarCap_T/2. + fBeWindowThickness/2.; - G4VisAttributes* DSSSDVisAtt = new G4VisAttributes(G4Colour(0., 0., 1.)); - logicDSSSD->SetVisAttributes(DSSSDVisAtt); + G4Box* solidPlanarBeWindow = new G4Box("planar-be", fPlanarGe_W/2., fPlanarGe_H/2., fBeWindowThickness/2.); + G4LogicalVolume* logicPlanarBeWindow = new G4LogicalVolume(solidPlanarBeWindow,// it's solid + beMaterial, // it's material + "planar-be", // it's name + 0, 0, 0); // field manager, sensitive det, user limits + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.0*mm, 0.0*mm, PlanarBeWindow_z), + logicPlanarBeWindow, //its logical volume + "Planar-Be", //its name + logicPlanarCap, //its mother + false, //no boolean operat + 0, //copy number + true); //overlap check - // for the solid aluminium support : - - G4Box* solid_alu_support_ext - = new G4Box("solid_alu_support_ext", (18.32-0.65)*cm/2, (12.343-0.65)*cm/2, 8.5*cm/2 ); // - - G4Box* solid_alu_support_int - = new G4Box("solid_alu_support_int",16.27*cm/2, 10.295*cm/2, 8.6*cm/2 ); // - G4SubtractionSolid* solidsupport=new G4SubtractionSolid("Solidsupport",solid_alu_support_ext, solid_alu_support_int, 0, G4ThreeVector(0.,0.,0)); - G4LogicalVolume* logicALU = new G4LogicalVolume(solidsupport, m_ChamberMaterial, "logicALU"); + G4VisAttributes* visAttBeWindow = new G4VisAttributes(G4Colour(0.9,1.0,0.9) ); + visAttBeWindow->SetVisibility(true); + //visAttBeWindow->SetVisibility(false); + visAttBeWindow->SetForceWireframe(true); + logicPlanarBeWindow->SetVisAttributes(visAttBeWindow); + //----------------------------------------------------------------------------------------------- + //special cut out for Vacuum.... + //fAlWindowThickness + //fEndCapThickness + //PlanarCap_T - 2*fEndCapThickness - PVPBuffer = - new G4PVPlacement(0, G4ThreeVector(0., -2.92325*cm/2,-4.265*cm), logicALU, "Aluminium", world, false, 0); - G4VisAttributes* alusupportVisAtt = new G4VisAttributes(G4Colour(0.5, 0., 0.3)); - logicALU->SetVisAttributes(alusupportVisAtt); + //cut outs for windows and vacuum + G4Box* solidPlanarVac = new G4Box("planar-vac", PlanarCap_W/2.-fEndCapThickness, PlanarCap_H/2.-fEndCapThickness, PlanarCap_T/2.-fEndCapThickness); - G4Box* solid_alu_support_int1 - = new G4Box("solid_alu_support_int1",16.27*cm/2, 0.55*cm/2, 8.6*cm/2 ); // - - G4LogicalVolume* logicALUint1 = new G4LogicalVolume(solid_alu_support_int1, m_ChamberMaterial, "logicALUint1"); + G4LogicalVolume* logicPlanarVac = new G4LogicalVolume(solidPlanarVac,// it's solid + vacuumMaterial, // it's material + "planar-vac", // it's name + 0, 0, 0); // field manager, sensitive det, user limits - PVPBuffer = - new G4PVPlacement(0, G4ThreeVector(0, -2.5215*cm-2.92325*cm/2, -4.265*cm), logicALUint1, "Aluminium", world, false, 0); - - G4VisAttributes* solid_alu_support_int1VisAtt = new G4VisAttributes(G4Colour(0.9, 0., 0.)); - logicALUint1->SetVisAttributes(solid_alu_support_int1VisAtt); + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.0*mm, 0.0*mm, 0.0*mm), + logicPlanarVac, //its logical volume + "Planar-Vac", //its name + logicPlanarCap, //its mother + false, //no boolean operat + 0, //copy number + true); //overlap check + G4cout << "Got Here" << G4endl; - G4Box* solid_alu_support_int2 - = new G4Box("solid_alu_support_int2",1.4*cm/2, 2.35*cm/2, 8.6*cm/2 ); // + //visual attributes of the planar end-cap + //G4VisAttributes* visAttPlanarCapo = new G4VisAttributes(G4Colour(1.0,0.8,1.0) ); + //visAttPlanarCapo->SetVisibility(true); + //visAttPlanarCapo->SetVisibility(false); + //visAttPlanarCapo->SetForceWireframe(true); + //logicPlanarCap->SetVisAttributes(visAttPlanarCapo); + logicPlanarVac->SetVisAttributes(visAttPlanarCapo); - G4LogicalVolume* logicALUint2 = new G4LogicalVolume(solid_alu_support_int2, m_ChamberMaterial, "logicALUint2"); - PVPBuffer = - new G4PVPlacement(0, G4ThreeVector(0, -3.9715*cm-2.92325*cm/2, -4.265*cm), logicALUint2, "Aluminium", world, false, 0); - - G4VisAttributes* solid_alu_support_int2VisAtt = new G4VisAttributes(G4Colour(0.9, 0., 0.)); - logicALUint2->SetVisAttributes(solid_alu_support_int2VisAtt); + // the planar Ge + G4double PlanarGe_z = -PlanarCap_T/2. + fPlanarGe_T/2. + fPlanarGeGapFront; - G4Box* solid_DSSSD_coating1 - = new G4Box("solid_DSSSD_coating1",16.27*cm/2, 0.1*cm/2, 8.6*cm/2 ); // + //add in a slab of Ge to accomodate the guard-rail + //and into this slab add the pixels + G4Box* solidPlanarOuterGe = new G4Box("planar-outer-ge", fPlanarGe_W/2.+fPlanarGuard, fPlanarGe_H/2.+fPlanarGuard, fPlanarGe_T/2.); + G4LogicalVolume* logicPlanarOuterGe = new G4LogicalVolume(solidPlanarOuterGe, // it's solid + geMaterial, // it's material + "planar-outer-ge", // it's name + 0, 0, 0); // field manager, sensitive det, user limits - G4LogicalVolume* logicSiliconCoating1 = new G4LogicalVolume(solid_DSSSD_coating1, m_DSSSDMaterial, "logicSiliconCoating1"); - PVPBuffer = - new G4PVPlacement(0, G4ThreeVector(0, -2.5215*cm-2.92325*cm/2+0.05*cm+0.55*cm/2, -4.265*cm), logicSiliconCoating1, "PinDiode1", world, false, 0); + //G4PVPlacement* physiPlanarOuterGe = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.*mm, 0.0*mm, PlanarGe_z), + logicPlanarOuterGe, //its logical volume + "Planar-Outer-Ge", //its name + logicPlanarVac, //its mother + false, //no boolean operat + 0, true); //copy number - G4VisAttributes* solid_DSSSD_coating1VisAtt = new G4VisAttributes(G4Colour(0., 0.2, 0.8)); - logicSiliconCoating1->SetVisAttributes(solid_DSSSD_coating1VisAtt); + G4VisAttributes* visAttPlanarOuterGe = new G4VisAttributes(G4Colour(0.9,0.9,1.0) ); + visAttPlanarOuterGe->SetVisibility(true); + //visAttPlanarOuterGe->SetVisibility(false); + visAttPlanarOuterGe->SetForceWireframe(true); + logicPlanarOuterGe->SetVisAttributes(visAttPlanarOuterGe); - G4Box* solid_DSSSD_coating2 - = new G4Box("solid_DSSSD_coating2",16.27*cm/2, 0.1*cm/2, 8.6*cm/2 ); // - G4LogicalVolume* logicSiliconCoating2 = new G4LogicalVolume(solid_DSSSD_coating2, m_DSSSDMaterial, "logicSiliconCoating2"); - PVPBuffer = - new G4PVPlacement(0, G4ThreeVector(0, 5.1055*cm-2.92325*cm/2-0.05*cm, -4.265*cm), logicSiliconCoating2, "PinDiode2", world, false, 0); + //segment the detector + G4int nSegsH = 12; //(y) + G4int nSegsW = 24; //(x) + + //nSegsH = 1; + //nSegsW = 1; - G4VisAttributes* solid_DSSSD_coating2VisAtt = new G4VisAttributes(G4Colour(0., 0.2, 0.8)); - logicSiliconCoating2->SetVisAttributes(solid_DSSSD_coating2VisAtt); + //common planar "pixel" shape + G4double planarPixel_H = fPlanarGe_H/(G4double) nSegsH; + G4double planarPixel_W = fPlanarGe_W/(G4double) nSegsW; + + G4Box* solidPlanarGe = new G4Box("planar-ge", planarPixel_W/2., planarPixel_H/2., fPlanarGe_T/2.); + G4VisAttributes* visAttPlanarGe = new G4VisAttributes(G4Colour(1.0,1.0,1.0) ); + visAttPlanarGe->SetVisibility(true); + //visAttPlanarGe->SetVisibility(false); + visAttPlanarGe->SetForceWireframe(true); + logicPlanarOuterGe->SetVisAttributes(visAttPlanarGe); - G4Box* solid_DSSSD_coating3 - = new G4Box("solid_DSSSD_coating3",0.1*cm/2, 7.393*cm/2, 8.6*cm/2 ); // + //starting y-position for lowest row + G4double thisY = -fPlanarGe_H/2. + planarPixel_H/2.;// + fDSSD_PosY; + + for(G4int ny = 0; ny < nSegsH; ny++) { + //starting x-position + G4double thisX = -fPlanarGe_W/2. + planarPixel_W/2.; + //G4double posY = (2*ny-1)*planarPixel_H/2.; + + for(G4int nx = 0; nx < nSegsW; nx++) { + //G4double posX = -fPlanarGe_W/2. + planarPixel_W/2. + nx*planarPixel_W; + //G4int copyNo = ny*nSegsW+nx; + //G4cout << "Check Planar CopyNo " << copyNo << " @ " << posX << " " << posY << G4endl; + G4int copyNo = ny*100+nx; + G4cout << "Check Planar CopyNo " << copyNo << " @ " << thisX << " " << thisY << G4endl; + + //logicPlanarGe[copyNo] = new G4LogicalVolume(solidPlanarGe,// it's solid + logicPlanarGe[ny][nx] = new G4LogicalVolume(solidPlanarGe,// it's solid + geMaterial, // it's material + "planar-ge", // it's name + 0, 0, 0); // field manager, sensitive det, user limits + + + //physiPlanarGe[copyNo] = new G4PVPlacement(0, //rotation + //G4ThreeVector(posX, posY, 0.0*mm), + //physiPlanarGe[ny][nx] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(thisX, thisY, 0.0*mm), + //logicPlanarGe[copyNo], //its logical volume + logicPlanarGe[ny][nx], //its logical volume + "Planar-Ge", //its name + logicPlanarOuterGe, //its mother + false, //no boolean operat + copyNo); //copy number + + //set attributes + logicPlanarGe[ny][nx]->SetVisAttributes(visAttPlanarGe); + + //move along.... + thisX += planarPixel_W; + } + thisY += planarPixel_H; + } + + */ + + //---------------------------------------------------------- + // Cooling Frame: Tunnel and DSSD Detector Support + //---------------------------------------------------------- + G4VisAttributes* visAttCoolingBlock = new G4VisAttributes(G4Colour(0.8,0.8,0.8)); + visAttCoolingBlock->SetVisibility(true); + //visAttCoolingBlock->SetVisibility(false); + visAttCoolingBlock->SetForceWireframe(true); + + G4Box* OuterBox = new G4Box("OuterBox",fCoolingBlockW/2., fCoolingBlockH/2., fCoolingBlockL/2.); + + //place the support on the bottom of the chamber + G4double DSSD_SupPos_y = -fChamberH/2. + fCoolingBlockH/2. + fChamberThickness/2.; + + //position wrt BackPlate/VacChamber + G4double DSSD_SupPos_z = fChamberL/2. - fChamberThickness - fCoolingBlockL/2. - fCoolingBlockZ; + + //now cut a hole out for the DSSD's + G4double Hole4DSSD_W = fCoolingBlockCutOutW; + G4double Hole4DSSD_H = fCoolingBlockCutOutH; + + //from the above can determine the centre of the DSSD wrt centre of Cooling block + fCoolingBlockCutOut_PosY = fCoolingBlockH/2. - fCoolingBlockT - fCoolingBlockCutOutH/2.; //save this frequently used position + G4cout << "fCoolingBlockCutOut_PosY " << fCoolingBlockCutOut_PosY << " cf " << fCoolingBlockDSSDCentre << G4endl; + + G4Box* hole1 = new G4Box("Hole #1",Hole4DSSD_W/2., Hole4DSSD_H/2., fCoolingBlockL/2.); + + G4double dy = fCoolingBlockH/2. - fCoolingBlockT - Hole4DSSD_H/2.; + G4double dx = 0.0*mm; + G4double dz = 0.0*mm; + G4ThreeVector hole1trans(dx, dy, dz); - G4LogicalVolume* logicSiliconCoating3 = new G4LogicalVolume(solid_DSSSD_coating3, m_DSSSDMaterial, "logicSiliconCoating3"); - PVPBuffer = - new G4PVPlacement(0, G4ThreeVector(8.085*cm, 1.4375*cm-2.92325*cm/2, -4.265*cm), logicSiliconCoating3, "PinDiode3", world, false, 0); - PVPBuffer = - new G4PVPlacement(0, G4ThreeVector(-8.085*cm, 1.4375*cm-2.92325*cm/2, -4.265*cm), logicSiliconCoating3, "PinDiode4", world, false, 1); - - G4VisAttributes* solid_DSSSD_coating3VisAtt = new G4VisAttributes(G4Colour(0., 0.2, 0.8)); - logicSiliconCoating3->SetVisAttributes(solid_DSSSD_coating3VisAtt); + G4SubtractionSolid* solid_CB_Temp1 = + new G4SubtractionSolid("fCoolingBlockTemp1", OuterBox, hole1, 0, hole1trans); + //now cut a hole out for preamps + G4Box* holePreAmp = new G4Box("Hole PreAmp",34.5/2.*mm, 22./2.*mm, fCoolingBlockL/2.); + dx = -fCoolingBlockW/2.+fCoolingBlockT+34.5/2.*mm; + dy = fCoolingBlockH/2. - fCoolingBlockT - Hole4DSSD_H - fCoolingBlockT - 22./2.*mm; + G4ThreeVector holePreAmpTrans1(dx, dy, dz); + dx += (34.5*mm + fCoolingBlockT); + G4ThreeVector holePreAmpTrans2(dx, dy, dz); + dx += (34.5*mm + 14.7*mm); + G4ThreeVector holePreAmpTrans3(dx, dy, dz); + dx += (34.5*mm + fCoolingBlockT); + G4ThreeVector holePreAmpTrans4(dx, dy, dz); + G4SubtractionSolid* solid_CB_Temp2 = + new G4SubtractionSolid("fCoolingBlockTemp2", solid_CB_Temp1, holePreAmp, 0, holePreAmpTrans1); - // Preamps and connectors board + G4SubtractionSolid* solid_CB_Temp3 = + new G4SubtractionSolid("fCoolingBlockTemp3", solid_CB_Temp2, holePreAmp, 0, holePreAmpTrans2); - // PCB - + G4SubtractionSolid* solid_CB_Temp4 = + new G4SubtractionSolid("fCoolingBlockTemp4", solid_CB_Temp3, holePreAmp, 0, holePreAmpTrans3); - G4Element* Si = new G4Element("Silicon" , "Si" , 14 , 28.0855 * g / mole); - G4Element* C = new G4Element("Carbon" , "C" , 6 , 12.011 * g / mole); - G4Element* H = new G4Element("Hydrogen" , "H" , 1 , 1.0079 * g / mole); - G4Element* Br = new G4Element("Bromine" , "Br" , 35 , 79.904 * g / mole); - G4Element* O = new G4Element("Oxigen" , "O" , 8 , 16.00 * g / mole); + G4SubtractionSolid* solid_CB_Temp5 = + new G4SubtractionSolid("fCoolingBlockTemp5", solid_CB_Temp4, holePreAmp, 0, holePreAmpTrans4); - G4double density = 1.7 * g / cm3; - G4int ncomponents; - G4Material* PCB = new G4Material("PCB", density, ncomponents = 5); - PCB->AddElement(Si, .181); - PCB->AddElement(O, .406); - PCB->AddElement(C, .278); - PCB->AddElement(H, .068); - PCB->AddElement(Br, .067); + G4LogicalVolume* logicDSSD_Sup = new G4LogicalVolume(solid_CB_Temp5, + supportMaterial, "Cylinder-Box", 0, 0, 0); + //vacuumMaterial, "Cylinder-Box", 0, 0, 0); + logicDSSD_Sup->SetVisAttributes(visAttCoolingBlock); - G4Box* pre_amp_board1 - = new G4Box("pre_amp_board1",6.756*cm/2, 1.675*cm/2, 7.976*cm/2 ); // + PVPBuffer = new G4PVPlacement(0,//rotation + G4ThreeVector(0.0*cm, DSSD_SupPos_y, DSSD_SupPos_z), + logicDSSD_Sup, //its logical volume + "fCoolingBlock", //its name + logicChamVac, //its mother + false, //no boolean operat + 1, //copy number + true); //overlap check - G4LogicalVolume* logicpre_amp1 = new G4LogicalVolume(pre_amp_board1, PCB, "logicpre_amp1"); - PVPBuffer = - new G4PVPlacement(0, G4ThreeVector(4.0675*cm, 5.267875*cm, -4.265*cm), logicpre_amp1, "pre_amp_board1", world, false, 0); - PVPBuffer = - new G4PVPlacement(0, G4ThreeVector(-4.0675*cm, 5.267875*cm, -4.265*cm), logicpre_amp1, "pre_amp_board1", world, false, 1); - - G4VisAttributes* pre_amp_board1VisAtt = new G4VisAttributes(G4Colour(0., 0.7, 0.)); - logicpre_amp1->SetVisAttributes(pre_amp_board1VisAtt); - G4Box* pre_amp_board2 - = new G4Box("pre_amp_board2",1.675*cm/2, 6.756*cm/2, 7.976*cm/2 ); // - G4LogicalVolume* logicpre_amp2 = new G4LogicalVolume(pre_amp_board2, PCB, "logicpre_amp2"); - PVPBuffer = - new G4PVPlacement(0, G4ThreeVector(9.6625*cm, 2.413375*cm, -4.265*cm), logicpre_amp2, "pre_amp_board2", world, false, 0); - PVPBuffer = - new G4PVPlacement(0, G4ThreeVector(9.6625*cm, -5.336625*cm, -4.265*cm), logicpre_amp2, "pre_amp_board2", world, false, 1); - - G4VisAttributes* pre_amp_board2VisAtt = new G4VisAttributes(G4Colour(0., 0.7, 0.)); - logicpre_amp2->SetVisAttributes(pre_amp_board2VisAtt); + //------------------------------------------------------------------------------------------- + // DSSD detector Epoxy board....for some reason 2 cut outs are not working => make 2 PCB wafers + G4double DSSD_BrdW = 106.0 * mm * 2.; //Put the 2 boards in one plate + G4double DSSD_BrdH = 157.0 * mm; //SupportH; + G4double DSSD_BrdL = fDSSD_BoardL; //Thickness - - G4Box* pre_amp_board3 - = new G4Box("pre_amp_board3",1.675*cm/2, 6.756*cm/2, 7.976*cm/2 ); // + //recess to house DSSD's + G4double siImpBrdCutOutL = fDSSD_BoardL/2.; + // making 2 boards => + G4double DSSD_BrdL1 = DSSD_BrdL - siImpBrdCutOutL; + G4double DSSD_BrdL2 = siImpBrdCutOutL; - G4LogicalVolume* logicpre_amp3 = new G4LogicalVolume(pre_amp_board3, PCB, "logicpre_amp3"); - PVPBuffer = - new G4PVPlacement(0, G4ThreeVector(-9.6725*cm, 2.413375*cm, -4.265*cm), logicpre_amp3, "pre_amp_board3", world, false, 0); - PVPBuffer = - new G4PVPlacement(0, G4ThreeVector(-9.6725*cm, -5.336625*cm, -4.265*cm), logicpre_amp3, "pre_amp_board3", world, false, 1); - + G4double CutOut_dY = 44.0*mm; // distance from top of PCB to top of the first cut-out in the PCB + G4double CutOut1_H = 43.5*mm; // vertical dimension of the cut-out to half thickness + G4double CutOut2_H = 41.0*mm; // vertical dimension of total-thickness cut-ou ie a mounting lip of 1.25 mm - G4VisAttributes* pre_amp_board3VisAtt = new G4VisAttributes(G4Colour(0., 0.7, 0.)); - logicpre_amp3->SetVisAttributes(pre_amp_board3VisAtt); + G4double CutOut1_W = 63.5*mm; //fDSSD_H-2.0*boardLipDSSD; + G4double CutOut2_W = 61.0*mm; //fDSSD_H; - */ /* end of Eleanor's additions */ + G4double dssdLip = (CutOut1_W-CutOut2_W)/2.; + G4double central_bar = 1.25*mm; //each side + G4double DSSD_PCB_Pos_y = -fVacuumH/2. - DSSD_BrdH/2.; //puts top of circuit board at bottom of chamber + DSSD_PCB_Pos_y += (fCoolingBlockDSSDCentre + CutOut_dY + CutOut1_H/2.); + G4double gapBetweenDSSD = 3.0 * mm; //Gap between the two DSSD's + //gapBetweenDSSD = 0.01*mm; + //position wrt centre of vacuum in chamber + G4double DSSD_BrdPos_z = fChamberL/2 - fChamberThickness - fCoolingBlockZ + DSSD_BrdL1/2 + DSSD_BrdL2; - } + G4Box* solidDSSD_Board1_tmp1 = + new G4Box("siImpBrd1_tmp", DSSD_BrdW/2., DSSD_BrdH/2., DSSD_BrdL1/2.); + G4Box* cutOut1a = new G4Box("Box R #1a",CutOut1_W/2., CutOut1_H/2., DSSD_BrdL1/2.); + G4ThreeVector cutOut1aTrans(CutOut1_W/2., DSSD_BrdH/2.-CutOut1_H/2.-CutOut_dY, 0.0*mm); - else if(m_ChamberType==3){ // case of GREAT chamber as defined by Karl - - fChamberH = m_ChamberHmax; - fChamberW = m_ChamberWmax; - //fChamberL = m_ChamberDmax; - fChamberThickness= m_ChamberHmax-m_ChamberHmin; - - fVacuumH = fChamberH - fChamberThickness; + G4Box* cutOut1b = new G4Box("Box R #1b",CutOut1_W/2.,CutOut1_H/2.,DSSD_BrdL1/2.); + G4ThreeVector cutOut1bTrans(-CutOut1_W/2., DSSD_BrdH/2.-CutOut1_H/2.-CutOut_dY, 0.0*mm); - G4cout << "fChamberH=" << fChamberH << G4endl; - G4cout << "fChamberW=" << fChamberW << G4endl; - G4cout << "fChamberThickness=" << fChamberThickness << G4endl; - //----------------------------- - // more dimesions for chamber - fChamberL = fCoolingBlockL + fLengthOfPlanarCut + fDSSD_BoardL + fdeltaZ_Support + 2.*fChamberThickness + 10.0*mm; - - - //--------------------------------------------------------------------------------- - // This shift in the position of the chamber is to put the DSSD centred at y = 0 - fShiftChamberY = fCoolingBlockH - fCoolingBlockT - fCoolingBlockCutOutH/2.; //height of centre wrt cooling block base - fShiftChamberY -= fChamberH/2.; - - //Define the downstream face of the DSSD to be at 0 (ie the centre of the DSSD PCB board) - fShiftChamberZ = fCoolingBlockZ + fChamberThickness - fDSSD_BoardL/2.; //a discrepency of 1 mm somewhere - - //the centre of the DSSD wrt the vacuum chamber - fCentreOfDSSD_Y = -fVacuumH/2. + fCoolingBlockH - fCoolingBlockT - fCoolingBlockCutOutH/2.; //+ fChamberThickness - cout << G4endl << " DSSD_Y at 0 mm , but wrt vacuum DSSD_Y @ " << fCentreOfDSSD_Y << G4endl; - - - - - - //-------------------------------------------- - //[partial] Vacuum Chamber (Walls+Vacuum) and end BackPlate - //Set the Upstream side of the Chamber @ Z=0mm - - - //G4Box* solidChamber = new G4Box("chamber",fChamberW/2., fChamberH/2., fChamberL/2.); - // replaced by achamber with a substraction of the Planar area: - G4Box* solidChamberEnv = new G4Box("chamberEnv",fChamberW/2., fChamberH/2., fChamberL/2.); - G4double PlanarCap_W = fPlanarGe_W + 2.*fPlanarGuard + 80.*mm; //A GUESS - G4double PlanarCap_H = 150.*mm; - PlanarCap_H = fPlanarGe_H + 70*mm; - G4double PlanarCap_T = fPlanarTotalL; - G4cout << G4endl << "Planar end-cap thickness " << PlanarCap_T << " cf 41. mm" << G4endl; - fShiftPlanar = fChamberL/2. - fChamberThickness + PlanarCap_T/2. - fLengthOfPlanarCut + fGap_PCB_2_Planar; - G4double Planar_z = fShiftPlanar; - G4Box* solidPlanarCapEnv = new G4Box("planar-cap-Env", PlanarCap_W/2., PlanarCap_H/2., PlanarCap_T/2.); - G4SubtractionSolid* solidChamber = - new G4SubtractionSolid("chamber", solidChamberEnv, solidPlanarCapEnv, 0, G4ThreeVector(0.0*mm, fCentreOfDSSD_Y, Planar_z)); - - // end of replacement - - G4LogicalVolume* logicChamber = new G4LogicalVolume(solidChamber, //it's solid - m_ChamberMaterial,//it's material - //chamberMaterial,//it's material - //vacuumMaterial,//it's material - "Chamber", //it's name - 0, 0, 0); // field manager, sensitive det, user limits - - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.0*mm,-fShiftChamberY,-fChamberL/2.+fShiftChamberZ), - logicChamber, //its logical volume - "Chamber", //its name - world, //its mother - false, //no boolean operat - 0, //copy number - true); //overlap check - - //viewing the chamber - G4VisAttributes* visAttChamber = new G4VisAttributes(G4Colour(1.0,1.0,1.0) ); - visAttChamber->SetVisibility(true); - visAttChamber->SetForceWireframe(true); - logicChamber->SetVisAttributes(visAttChamber); - //logicChamber->SetVisAttributes(G4VisAttributes::Invisible); - - - - //Vacuum within above partial chamber - - G4double vacH = fChamberH - fChamberThickness; - G4double vacW = fChamberW - 2.*fChamberThickness; - G4double vacL = fChamberL - 2.*fChamberThickness; - - //G4Box* solidChamVac = new G4Box("chamVac",vacW/2., vacH/2., vacL/2.); - //Replaced by - G4Box* solidChamVacEnv = new G4Box("chamVacEnV",vacW/2., vacH/2., vacL/2.); - //G4Box* solidPlanarCapEnv = new G4Box("planar-cap-Env", PlanarCap_W/2., PlanarCap_H/2., PlanarCap_T/2.); - G4SubtractionSolid* solidChamVac = - new G4SubtractionSolid("chamVac", solidChamVacEnv, solidPlanarCapEnv, 0, G4ThreeVector(0.0*mm, fCentreOfDSSD_Y+fChamberThickness/2., Planar_z)); - - - G4LogicalVolume* logicChamVac = new G4LogicalVolume(solidChamVac, //it's solid - vacuumMaterial, //it's material - "chamVac", //it's name - 0, 0, 0); // field manager, sensitive det, user limits - - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.0*cm, -fChamberThickness/2., 0.0*cm), - logicChamVac, //its logical volume - "ChamVac", //its name - logicChamber, //its mother - false, //no boolean operat - 0, //copy number - true); //overlap check - - //logicChamVac->SetVisAttributes(G4VisAttributes::Invisible); - logicChamVac->SetVisAttributes(visAttChamber); - - - - /* Uncomment if you want the planar in the geometry and you are not using GRTPlan */ - /* - //---------------------------------------------------------------------- - // The Planar - //---------------------------------------------------------------------- - G4double PlanarCap_W = fPlanarGe_W + 2.*fPlanarGuard + 80.*mm; //A GUESS - G4double PlanarCap_H = 150.*mm; - PlanarCap_H = fPlanarGe_H + 70*mm; - G4double PlanarCap_T = fPlanarTotalL; - G4cout << G4endl << "Planar end-cap thickness " << PlanarCap_T << " cf 41. mm" << G4endl; - - // - editted 07/11/2011 - fShiftPlanar = fChamberL/2. - fChamberThickness + PlanarCap_T/2. - fLengthOfPlanarCut + fGap_PCB_2_Planar; - G4double Planar_z = fShiftPlanar; - fPlanar_PosZ = Planar_z; - - //starting endCap sold - G4Box* solidPlanarCap = new G4Box("planar-cap", PlanarCap_W/2., PlanarCap_H/2., PlanarCap_T/2.); - - //cut outs for Be window : planar end-cap is deliberately symmetric to make positioning more simple - //3 mm wide support rib that is 2.2 mm thick. Add the Be thickness => endCap thickness - G4Box* solidBeCutOut = new G4Box("be-cut-out", fPlanarGe_W/4.-1.5*mm, fPlanarGe_H/2., fEndCapThickness/2.);//is it total 120 mm or 120+gap ? - G4ThreeVector beCutOutTrans1(-fPlanarGe_W/4.-1.5*mm, 0.0*mm, -PlanarCap_T/2.+fEndCapThickness/2.); - G4ThreeVector beCutOutTrans2(+fPlanarGe_W/4.+1.5*mm, 0.0*mm, -PlanarCap_T/2.+fEndCapThickness/2.); - - - G4SubtractionSolid* solidPlanarCap_tmp1 = - new G4SubtractionSolid("planar-capo-1", solidPlanarCap, solidBeCutOut, 0, beCutOutTrans1); - - G4SubtractionSolid* solidPlanarCap_tmp2 = - new G4SubtractionSolid("planar-capo-2", solidPlanarCap_tmp1, solidBeCutOut, 0, beCutOutTrans2); - - - //cut outs for Al window at rear - G4Box* solidAlCutOut = new G4Box("Al-cut-out", fPlanarGe_W/2., fPlanarGe_H/2., fAlWindowThickness/2.); - G4ThreeVector alCutOutTrans(0.0*mm, 0.0*mm, PlanarCap_T/2.-fAlWindowThickness/2.); //ends up being 0.9 mm instead of 1.1 mm thick: CORRECT IT - - G4SubtractionSolid* solidPlanarCap_tmp3 = - new G4SubtractionSolid("planar-capo-3", solidPlanarCap_tmp2, solidAlCutOut, 0, alCutOutTrans); - - - G4LogicalVolume* logicPlanarCap = new G4LogicalVolume(solidPlanarCap_tmp3, // it's solid - //logicPlanarCap = new G4LogicalVolume(solidPlanarCap, // it's solid - endCapMaterial, // it's material - "planar-cap", // it's name - 0, 0, 0); // field manager, sensitive det, user limits - - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.0*mm, fCentreOfDSSD_Y, Planar_z), - logicPlanarCap, //its logical volume - "PlanarCap", //its name - logicChamVac, //its mother - false, //no boolean operat - 0, //copy number - true); //overlap check - - - - - G4VisAttributes* visAttPlanarCapo = new G4VisAttributes(G4Colour(1.0,0.8,1.0) ); - visAttPlanarCapo->SetVisibility(true); - //visAttPlanarCapo->SetVisibility(false); - visAttPlanarCapo->SetForceWireframe(true); - logicPlanarCap->SetVisAttributes(visAttPlanarCapo); - - - //----------------------------------------------------------------------------------------------- - //add the Be window - G4double PlanarBeWindow_z = -PlanarCap_T/2. + fBeWindowThickness/2.; - - G4Box* solidPlanarBeWindow = new G4Box("planar-be", fPlanarGe_W/2., fPlanarGe_H/2., fBeWindowThickness/2.); - - G4LogicalVolume* logicPlanarBeWindow = new G4LogicalVolume(solidPlanarBeWindow,// it's solid - beMaterial, // it's material - "planar-be", // it's name - 0, 0, 0); // field manager, sensitive det, user limits - - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.0*mm, 0.0*mm, PlanarBeWindow_z), - logicPlanarBeWindow, //its logical volume - "Planar-Be", //its name - logicPlanarCap, //its mother - false, //no boolean operat - 0, //copy number - true); //overlap check - - G4VisAttributes* visAttBeWindow = new G4VisAttributes(G4Colour(0.9,1.0,0.9) ); - visAttBeWindow->SetVisibility(true); - //visAttBeWindow->SetVisibility(false); - visAttBeWindow->SetForceWireframe(true); - logicPlanarBeWindow->SetVisAttributes(visAttBeWindow); - //----------------------------------------------------------------------------------------------- - //special cut out for Vacuum.... - //fAlWindowThickness - //fEndCapThickness - //PlanarCap_T - 2*fEndCapThickness - - - - //cut outs for windows and vacuum - G4Box* solidPlanarVac = new G4Box("planar-vac", PlanarCap_W/2.-fEndCapThickness, PlanarCap_H/2.-fEndCapThickness, PlanarCap_T/2.-fEndCapThickness); - - G4LogicalVolume* logicPlanarVac = new G4LogicalVolume(solidPlanarVac,// it's solid - vacuumMaterial, // it's material - "planar-vac", // it's name - 0, 0, 0); // field manager, sensitive det, user limits - - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.0*mm, 0.0*mm, 0.0*mm), - logicPlanarVac, //its logical volume - "Planar-Vac", //its name - logicPlanarCap, //its mother - false, //no boolean operat - 0, //copy number - true); //overlap check - - G4cout << "Got Here" << G4endl; - - //visual attributes of the planar end-cap - //G4VisAttributes* visAttPlanarCapo = new G4VisAttributes(G4Colour(1.0,0.8,1.0) ); - //visAttPlanarCapo->SetVisibility(true); - //visAttPlanarCapo->SetVisibility(false); - //visAttPlanarCapo->SetForceWireframe(true); - //logicPlanarCap->SetVisAttributes(visAttPlanarCapo); - logicPlanarVac->SetVisAttributes(visAttPlanarCapo); - - - - - // the planar Ge - G4double PlanarGe_z = -PlanarCap_T/2. + fPlanarGe_T/2. + fPlanarGeGapFront; - - //add in a slab of Ge to accomodate the guard-rail - //and into this slab add the pixels - G4Box* solidPlanarOuterGe = new G4Box("planar-outer-ge", fPlanarGe_W/2.+fPlanarGuard, fPlanarGe_H/2.+fPlanarGuard, fPlanarGe_T/2.); - G4LogicalVolume* logicPlanarOuterGe = new G4LogicalVolume(solidPlanarOuterGe, // it's solid - geMaterial, // it's material - "planar-outer-ge", // it's name - 0, 0, 0); // field manager, sensitive det, user limits - - //G4PVPlacement* physiPlanarOuterGe = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm, 0.0*mm, PlanarGe_z), - logicPlanarOuterGe, //its logical volume - "Planar-Outer-Ge", //its name - logicPlanarVac, //its mother - false, //no boolean operat - 0, true); //copy number - - G4VisAttributes* visAttPlanarOuterGe = new G4VisAttributes(G4Colour(0.9,0.9,1.0) ); - visAttPlanarOuterGe->SetVisibility(true); - //visAttPlanarOuterGe->SetVisibility(false); - visAttPlanarOuterGe->SetForceWireframe(true); - logicPlanarOuterGe->SetVisAttributes(visAttPlanarOuterGe); - - - - //segment the detector - G4int nSegsH = 12; //(y) - G4int nSegsW = 24; //(x) - - //nSegsH = 1; - //nSegsW = 1; - - //common planar "pixel" shape - G4double planarPixel_H = fPlanarGe_H/(G4double) nSegsH; - G4double planarPixel_W = fPlanarGe_W/(G4double) nSegsW; - - G4Box* solidPlanarGe = new G4Box("planar-ge", planarPixel_W/2., planarPixel_H/2., fPlanarGe_T/2.); - - G4VisAttributes* visAttPlanarGe = new G4VisAttributes(G4Colour(1.0,1.0,1.0) ); - visAttPlanarGe->SetVisibility(true); - //visAttPlanarGe->SetVisibility(false); - visAttPlanarGe->SetForceWireframe(true); - logicPlanarOuterGe->SetVisAttributes(visAttPlanarGe); - - //starting y-position for lowest row - G4double thisY = -fPlanarGe_H/2. + planarPixel_H/2.;// + fDSSD_PosY; - - for(G4int ny = 0; ny < nSegsH; ny++) { - //starting x-position - G4double thisX = -fPlanarGe_W/2. + planarPixel_W/2.; - //G4double posY = (2*ny-1)*planarPixel_H/2.; - - for(G4int nx = 0; nx < nSegsW; nx++) { - //G4double posX = -fPlanarGe_W/2. + planarPixel_W/2. + nx*planarPixel_W; - //G4int copyNo = ny*nSegsW+nx; - //G4cout << "Check Planar CopyNo " << copyNo << " @ " << posX << " " << posY << G4endl; - G4int copyNo = ny*100+nx; - G4cout << "Check Planar CopyNo " << copyNo << " @ " << thisX << " " << thisY << G4endl; - - //logicPlanarGe[copyNo] = new G4LogicalVolume(solidPlanarGe,// it's solid - logicPlanarGe[ny][nx] = new G4LogicalVolume(solidPlanarGe,// it's solid - geMaterial, // it's material - "planar-ge", // it's name - 0, 0, 0); // field manager, sensitive det, user limits - - - //physiPlanarGe[copyNo] = new G4PVPlacement(0, //rotation - //G4ThreeVector(posX, posY, 0.0*mm), - //physiPlanarGe[ny][nx] = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(thisX, thisY, 0.0*mm), - //logicPlanarGe[copyNo], //its logical volume - logicPlanarGe[ny][nx], //its logical volume - "Planar-Ge", //its name - logicPlanarOuterGe, //its mother - false, //no boolean operat - copyNo); //copy number - - //set attributes - logicPlanarGe[ny][nx]->SetVisAttributes(visAttPlanarGe); - - //move along.... - thisX += planarPixel_W; - } - thisY += planarPixel_H; - } - - */ - - //---------------------------------------------------------- - // Cooling Frame: Tunnel and DSSD Detector Support - //---------------------------------------------------------- - G4VisAttributes* visAttCoolingBlock = new G4VisAttributes(G4Colour(0.8,0.8,0.8)); - visAttCoolingBlock->SetVisibility(true); - //visAttCoolingBlock->SetVisibility(false); - visAttCoolingBlock->SetForceWireframe(true); - - G4Box* OuterBox = new G4Box("OuterBox",fCoolingBlockW/2., fCoolingBlockH/2., fCoolingBlockL/2.); - - //place the support on the bottom of the chamber - G4double DSSD_SupPos_y = -fChamberH/2. + fCoolingBlockH/2. + fChamberThickness/2.; - - //position wrt BackPlate/VacChamber - G4double DSSD_SupPos_z = fChamberL/2. - fChamberThickness - fCoolingBlockL/2. - fCoolingBlockZ; - - //now cut a hole out for the DSSD's - G4double Hole4DSSD_W = fCoolingBlockCutOutW; - G4double Hole4DSSD_H = fCoolingBlockCutOutH; - - //from the above can determine the centre of the DSSD wrt centre of Cooling block - fCoolingBlockCutOut_PosY = fCoolingBlockH/2. - fCoolingBlockT - fCoolingBlockCutOutH/2.; //save this frequently used position - G4cout << "fCoolingBlockCutOut_PosY " << fCoolingBlockCutOut_PosY << " cf " << fCoolingBlockDSSDCentre << G4endl; - - G4Box* hole1 = new G4Box("Hole #1",Hole4DSSD_W/2., Hole4DSSD_H/2., fCoolingBlockL/2.); - - G4double dy = fCoolingBlockH/2. - fCoolingBlockT - Hole4DSSD_H/2.; - G4double dx = 0.0*mm; - G4double dz = 0.0*mm; - G4ThreeVector hole1trans(dx, dy, dz); - - G4SubtractionSolid* solid_CB_Temp1 = - new G4SubtractionSolid("fCoolingBlockTemp1", OuterBox, hole1, 0, hole1trans); - - //now cut a hole out for preamps - G4Box* holePreAmp = new G4Box("Hole PreAmp",34.5/2.*mm, 22./2.*mm, fCoolingBlockL/2.); - dx = -fCoolingBlockW/2.+fCoolingBlockT+34.5/2.*mm; - dy = fCoolingBlockH/2. - fCoolingBlockT - Hole4DSSD_H - fCoolingBlockT - 22./2.*mm; - G4ThreeVector holePreAmpTrans1(dx, dy, dz); - dx += (34.5*mm + fCoolingBlockT); - G4ThreeVector holePreAmpTrans2(dx, dy, dz); - dx += (34.5*mm + 14.7*mm); - G4ThreeVector holePreAmpTrans3(dx, dy, dz); - dx += (34.5*mm + fCoolingBlockT); - G4ThreeVector holePreAmpTrans4(dx, dy, dz); - - G4SubtractionSolid* solid_CB_Temp2 = - new G4SubtractionSolid("fCoolingBlockTemp2", solid_CB_Temp1, holePreAmp, 0, holePreAmpTrans1); - - G4SubtractionSolid* solid_CB_Temp3 = - new G4SubtractionSolid("fCoolingBlockTemp3", solid_CB_Temp2, holePreAmp, 0, holePreAmpTrans2); - - G4SubtractionSolid* solid_CB_Temp4 = - new G4SubtractionSolid("fCoolingBlockTemp4", solid_CB_Temp3, holePreAmp, 0, holePreAmpTrans3); - - G4SubtractionSolid* solid_CB_Temp5 = - new G4SubtractionSolid("fCoolingBlockTemp5", solid_CB_Temp4, holePreAmp, 0, holePreAmpTrans4); - - G4LogicalVolume* logicDSSD_Sup = new G4LogicalVolume(solid_CB_Temp5, - supportMaterial, "Cylinder-Box", 0, 0, 0); - //vacuumMaterial, "Cylinder-Box", 0, 0, 0); - - logicDSSD_Sup->SetVisAttributes(visAttCoolingBlock); - - - PVPBuffer = new G4PVPlacement(0,//rotation - G4ThreeVector(0.0*cm, DSSD_SupPos_y, DSSD_SupPos_z), - logicDSSD_Sup, //its logical volume - "fCoolingBlock", //its name - logicChamVac, //its mother - false, //no boolean operat - 1, //copy number - true); //overlap check - - - - - - //------------------------------------------------------------------------------------------- - // DSSD detector Epoxy board....for some reason 2 cut outs are not working => make 2 PCB wafers - G4double DSSD_BrdW = 106.0 * mm * 2.; //Put the 2 boards in one plate - G4double DSSD_BrdH = 157.0 * mm; //SupportH; - G4double DSSD_BrdL = fDSSD_BoardL; //Thickness - - //recess to house DSSD's - G4double siImpBrdCutOutL = fDSSD_BoardL/2.; - // making 2 boards => - G4double DSSD_BrdL1 = DSSD_BrdL - siImpBrdCutOutL; - G4double DSSD_BrdL2 = siImpBrdCutOutL; - - G4double CutOut_dY = 44.0*mm; // distance from top of PCB to top of the first cut-out in the PCB - G4double CutOut1_H = 43.5*mm; // vertical dimension of the cut-out to half thickness - G4double CutOut2_H = 41.0*mm; // vertical dimension of total-thickness cut-ou ie a mounting lip of 1.25 mm - - G4double CutOut1_W = 63.5*mm; //fDSSD_H-2.0*boardLipDSSD; - G4double CutOut2_W = 61.0*mm; //fDSSD_H; - - G4double dssdLip = (CutOut1_W-CutOut2_W)/2.; - G4double central_bar = 1.25*mm; //each side - - G4double DSSD_PCB_Pos_y = -fVacuumH/2. - DSSD_BrdH/2.; //puts top of circuit board at bottom of chamber - DSSD_PCB_Pos_y += (fCoolingBlockDSSDCentre + CutOut_dY + CutOut1_H/2.); - - G4double gapBetweenDSSD = 3.0 * mm; //Gap between the two DSSD's - - //gapBetweenDSSD = 0.01*mm; - - //position wrt centre of vacuum in chamber - G4double DSSD_BrdPos_z = fChamberL/2 - fChamberThickness - fCoolingBlockZ + DSSD_BrdL1/2 + DSSD_BrdL2; - - G4Box* solidDSSD_Board1_tmp1 = - new G4Box("siImpBrd1_tmp", DSSD_BrdW/2., DSSD_BrdH/2., DSSD_BrdL1/2.); - - G4Box* cutOut1a = new G4Box("Box R #1a",CutOut1_W/2., CutOut1_H/2., DSSD_BrdL1/2.); - G4ThreeVector cutOut1aTrans(CutOut1_W/2., DSSD_BrdH/2.-CutOut1_H/2.-CutOut_dY, 0.0*mm); - - G4Box* cutOut1b = new G4Box("Box R #1b",CutOut1_W/2.,CutOut1_H/2.,DSSD_BrdL1/2.); - G4ThreeVector cutOut1bTrans(-CutOut1_W/2., DSSD_BrdH/2.-CutOut1_H/2.-CutOut_dY, 0.0*mm); - - - G4SubtractionSolid* solidDSSD_Board1_a = - new G4SubtractionSolid("siImpBrd1_a", solidDSSD_Board1_tmp1, cutOut1a, 0, cutOut1aTrans); - - G4SubtractionSolid* solidDSSD_Board1 = - new G4SubtractionSolid("siImpBrd1", solidDSSD_Board1_a, cutOut1b, 0, cutOut1bTrans); - - G4LogicalVolume* logicDSSD_Board1 = new G4LogicalVolume(solidDSSD_Board1,// it's solid : with cut-out - boardMaterial, // it's material - //vacuumMaterial, - "DSSD_Brd1", // it's name - 0, 0, 0); // field manager, sensitive det, user limits - - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.0*mm,DSSD_PCB_Pos_y,DSSD_BrdPos_z), - logicDSSD_Board1, //its logical volume - "DSSD_Brd1", //its name - logicChamVac, //its mother - false, //no boolean operat - 0, //copy number - true); //overlap check - - - DSSD_BrdPos_z -= DSSD_BrdL1/2; - DSSD_BrdPos_z -= DSSD_BrdL2/2; - - G4Box* solidDSSD_Board2_tmp1 = - new G4Box("siImpBrd2_tmp", DSSD_BrdW/2., DSSD_BrdH/2., DSSD_BrdL2/2.); - - G4Box* cutOut2a = new G4Box("Box R #2a",CutOut2_W/2.,CutOut2_H/2.,DSSD_BrdL2/2.); - G4ThreeVector cutOut2aTrans(CutOut2_W/2.+central_bar, DSSD_BrdH/2.-CutOut2_H/2.-CutOut_dY-dssdLip, 0.0*mm); - - G4Box* cutOut2b = new G4Box("Box R #2b",CutOut2_W/2.,CutOut2_H/2.,DSSD_BrdL2/2.); - G4ThreeVector cutOut2bTrans(-CutOut2_W/2.-central_bar, DSSD_BrdH/2.-CutOut2_H/2.-CutOut_dY-dssdLip, 0.0*mm); - - G4SubtractionSolid* solidDSSD_Board2_a = - new G4SubtractionSolid("siImpBrd2_a", solidDSSD_Board2_tmp1, cutOut2a, 0, cutOut2aTrans); - - G4SubtractionSolid* solidDSSD_Board2 = - new G4SubtractionSolid("siImpBrd2", solidDSSD_Board2_a, cutOut2b, 0, cutOut2bTrans); - - G4LogicalVolume* logicDSSD_Board2 = new G4LogicalVolume(solidDSSD_Board2,// it's solid : with cut-out - boardMaterial, // it's material - //vacuumMaterial, - "DSSD_Brd2", // it's name - 0, 0, 0); // field manager, sensitive det, user limits - - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.0*mm,DSSD_PCB_Pos_y,DSSD_BrdPos_z), - logicDSSD_Board2, //its logical volume - "DSSD_Brd2", //its name - logicChamVac, //its mother - false, //no boolean operat - 0, //copy number - true); //overlap check + G4SubtractionSolid* solidDSSD_Board1_a = + new G4SubtractionSolid("siImpBrd1_a", solidDSSD_Board1_tmp1, cutOut1a, 0, cutOut1aTrans); + + G4SubtractionSolid* solidDSSD_Board1 = + new G4SubtractionSolid("siImpBrd1", solidDSSD_Board1_a, cutOut1b, 0, cutOut1bTrans); + + G4LogicalVolume* logicDSSD_Board1 = new G4LogicalVolume(solidDSSD_Board1,// it's solid : with cut-out + boardMaterial, // it's material + //vacuumMaterial, + "DSSD_Brd1", // it's name + 0, 0, 0); // field manager, sensitive det, user limits + + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.0*mm,DSSD_PCB_Pos_y,DSSD_BrdPos_z), + logicDSSD_Board1, //its logical volume + "DSSD_Brd1", //its name + logicChamVac, //its mother + false, //no boolean operat + 0, //copy number + true); //overlap check + + + DSSD_BrdPos_z -= DSSD_BrdL1/2; + DSSD_BrdPos_z -= DSSD_BrdL2/2; + + G4Box* solidDSSD_Board2_tmp1 = + new G4Box("siImpBrd2_tmp", DSSD_BrdW/2., DSSD_BrdH/2., DSSD_BrdL2/2.); + + G4Box* cutOut2a = new G4Box("Box R #2a",CutOut2_W/2.,CutOut2_H/2.,DSSD_BrdL2/2.); + G4ThreeVector cutOut2aTrans(CutOut2_W/2.+central_bar, DSSD_BrdH/2.-CutOut2_H/2.-CutOut_dY-dssdLip, 0.0*mm); + + G4Box* cutOut2b = new G4Box("Box R #2b",CutOut2_W/2.,CutOut2_H/2.,DSSD_BrdL2/2.); + G4ThreeVector cutOut2bTrans(-CutOut2_W/2.-central_bar, DSSD_BrdH/2.-CutOut2_H/2.-CutOut_dY-dssdLip, 0.0*mm); + + G4SubtractionSolid* solidDSSD_Board2_a = + new G4SubtractionSolid("siImpBrd2_a", solidDSSD_Board2_tmp1, cutOut2a, 0, cutOut2aTrans); + + G4SubtractionSolid* solidDSSD_Board2 = + new G4SubtractionSolid("siImpBrd2", solidDSSD_Board2_a, cutOut2b, 0, cutOut2bTrans); + + G4LogicalVolume* logicDSSD_Board2 = new G4LogicalVolume(solidDSSD_Board2,// it's solid : with cut-out + boardMaterial, // it's material + //vacuumMaterial, + "DSSD_Brd2", // it's name + 0, 0, 0); // field manager, sensitive det, user limits + + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.0*mm,DSSD_PCB_Pos_y,DSSD_BrdPos_z), + logicDSSD_Board2, //its logical volume + "DSSD_Brd2", //its name + logicChamVac, //its mother + false, //no boolean operat + 0, //copy number + true); //overlap check @@ -1355,38 +1240,38 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) G4double totalDSSD_W = fDSSD_W+2.*fDSSD_Guard; G4Box* solidSi1 = new G4Box("Si1", totalDSSD_W/2., totalDSSD_H/2., fDSSD_T/2.); //Si: 62x42 G4LogicalVolume* logicSi1 = new G4LogicalVolume(solidSi1, // it's solid - eDetMat, // it's material //vacuumMaterial, - "dssd1", // it's name - 0, 0, 0); // field manager, sensitive det, user limits + eDetMat, // it's material //vacuumMaterial, + "dssd1", // it's name + 0, 0, 0); // field manager, sensitive det, user limits logicSi1->SetVisAttributes(visAttDSSD_1); PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(totalDSSD_W/2.+0.75*mm,fCentreOfDSSD_Y,DSSD_z), - //G4ThreeVector(0.0*mm,fCentreOfDSSD_Y,DSSD_z), - logicSi1, //its logical volume - "dssd1", //its name - logicChamVac, //its mother - false, //no boolean operat - 1); //, //copy number + G4ThreeVector(totalDSSD_W/2.+0.75*mm,fCentreOfDSSD_Y,DSSD_z), + //G4ThreeVector(0.0*mm,fCentreOfDSSD_Y,DSSD_z), + logicSi1, //its logical volume + "dssd1", //its name + logicChamVac, //its mother + false, //no boolean operat + 1); //, //copy number G4LogicalVolume* logicSi2 = new G4LogicalVolume(solidSi1, // it's solid - eDetMat, // it's material //vacuumMaterial, - "dssd2", // it's name - 0, 0, 0); // field manager, sensitive det, user limits + eDetMat, // it's material //vacuumMaterial, + "dssd2", // it's name + 0, 0, 0); // field manager, sensitive det, user limits logicSi2->SetVisAttributes(visAttDSSD_1); PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(-totalDSSD_W/2.-0.75*mm,fCentreOfDSSD_Y,DSSD_z), - //G4ThreeVector(0.0*mm,fCentreOfDSSD_Y,DSSD_z), - logicSi2, //its logical volume - "dssd2", //its name - logicChamVac, //its mother - false, //no boolean operat - 2); //, //copy number - - + G4ThreeVector(-totalDSSD_W/2.-0.75*mm,fCentreOfDSSD_Y,DSSD_z), + //G4ThreeVector(0.0*mm,fCentreOfDSSD_Y,DSSD_z), + logicSi2, //its logical volume + "dssd2", //its name + logicChamVac, //its mother + false, //no boolean operat + 2); //, //copy number + + // The ChamberVac is located wrt centre of Chamber => z0 = -fChamberL/2. fDSSD_PosZ = DSSD_z - fChamberL/2. - fDSSD_T/2.; G4cout << "Upstream DSSD face @ Z = " << fDSSD_PosZ << G4endl; @@ -1405,8 +1290,8 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) G4double fDSSD_Pixel_Ly = fDSSD_H/(1.0*nStripsY); G4Box* solidDSSD = new G4Box("dssd", fDSSD_Pixel_Lx/2., fDSSD_Pixel_Ly/2., fDSSD_T/2.); - - + + //starting y-position for lowest row G4double thisy = -nStripsY/2.*fDSSD_Pixel_Ly + fDSSD_Pixel_Ly/2. + fCoolingBlockCutOut_PosY; thisy = -nStripsY/2.*fDSSD_Pixel_Ly + fDSSD_Pixel_Ly/2. + fCentreOfDSSD_Y; @@ -1421,38 +1306,38 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) //DSSD_A logicDSSD_A[iy][ix] = new G4LogicalVolume(solidDSSD, // it's solid - eDetMat, // it's material - //vacuumMaterial, - "dssd-pixel",// it's name - 0, 0, 0); // field manager, sensitive det, user limits - + eDetMat, // it's material + //vacuumMaterial, + "dssd-pixel",// it's name + 0, 0, 0); // field manager, sensitive det, user limits + PVPBuffer = new G4PVPlacement(0, //rotation - //G4ThreeVector(thisx,thisy,DSSD_z), - G4ThreeVector(thisx2,thisy2,0.0*mm), - logicDSSD_A[iy][ix],//its logical volume - "DSSD_A", //its name - logicSi2, //its mother - false, //no boolean operat - iy*100+ix);//, //copy number + //G4ThreeVector(thisx,thisy,DSSD_z), + G4ThreeVector(thisx2,thisy2,0.0*mm), + logicDSSD_A[iy][ix],//its logical volume + "DSSD_A", //its name + logicSi2, //its mother + false, //no boolean operat + iy*100+ix);//, //copy number //DSSD_B logicDSSD_B[iy][ix] = new G4LogicalVolume(solidDSSD, // it's solid - eDetMat, // it's material - //vacuumMaterial, - "dssd-pixel",// it's name - 0, 0, 0); // field manager, sensitive det, user limits - + eDetMat, // it's material + //vacuumMaterial, + "dssd-pixel",// it's name + 0, 0, 0); // field manager, sensitive det, user limits + PVPBuffer = new G4PVPlacement(0, //rotation - //G4ThreeVector(thisx+fDSSD_W+gapBetweenDSSD,thisy,DSSD_z), - G4ThreeVector(thisx2,thisy2,0.0*mm), - logicDSSD_B[iy][ix],//its logical volume - "DSSD_B", //its name - logicSi1, //its mother - false, //no boolean operat - iy*100+ix);//, //copy number - - + //G4ThreeVector(thisx+fDSSD_W+gapBetweenDSSD,thisy,DSSD_z), + G4ThreeVector(thisx2,thisy2,0.0*mm), + logicDSSD_B[iy][ix],//its logical volume + "DSSD_B", //its name + logicSi1, //its mother + false, //no boolean operat + iy*100+ix);//, //copy number + + //visu logicDSSD_A[iy][ix]->SetVisAttributes(visAttDSSD); logicDSSD_B[iy][ix]->SetVisAttributes(visAttDSSD); @@ -1477,7 +1362,7 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) G4double PinToEdge = 3.0 * mm; //gap from the end G4double PinEpoxyT = 1.6 * mm; //thickness of pcb board //G4double PinSupportLip = PinT+PinEpoxyT; //thickness of pcb board - + //horizontal-side dimensions [approxiamted as a single board] G4double PinBoard_H_W = PinL*5.; G4double PinBoard_H_H = PinEpoxyT; @@ -1510,17 +1395,17 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) //Pin PCB/Epoxy boards G4Box* solidPinBoard_H = new G4Box("pin-pcb", PinBoard_H_W/2., PinBoard_H_H/2., PinBoard_H_L/2.); G4Box* solidPinBoard_V = new G4Box("pin-pcb", PinBoard_V_W/2., PinBoard_V_H/2., PinBoard_V_L/2.); - - + + G4LogicalVolume* logicPinBoard_H = new G4LogicalVolume(solidPinBoard_H, // it's solid - boardMaterial, // it's material - "pin-pcb", // it's name - 0,0,0); // field manager etc + boardMaterial, // it's material + "pin-pcb", // it's name + 0,0,0); // field manager etc G4LogicalVolume* logicPinBoard_V = new G4LogicalVolume(solidPinBoard_V, // it's solid - boardMaterial, // it's material - "pin-pcb", // it's name - 0,0,0); // field manager etc + boardMaterial, // it's material + "pin-pcb", // it's name + 0,0,0); // field manager etc logicPinBoard_H->SetVisAttributes(visAttPIN_Board); logicPinBoard_V->SetVisAttributes(visAttPIN_Board); @@ -1530,25 +1415,25 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) //G4PVPlacement* physiPinBoard_V[2]; for(G4int i = 0; i < 2; i++) { - + G4double dyPos = (2*i-1)*PinBoard_H_dy; - + PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(PinBoard_H_x, fCentreOfDSSD_Y + dyPos, PinBoard_z), - logicPinBoard_H, //its logical volume - "PinPCB_H", //its name - logicChamVac, //its mother - false, //no boolean operat - i+1); //copy number - + G4ThreeVector(PinBoard_H_x, fCentreOfDSSD_Y + dyPos, PinBoard_z), + logicPinBoard_H, //its logical volume + "PinPCB_H", //its name + logicChamVac, //its mother + false, //no boolean operat + i+1); //copy number + PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector( PinBoard_V_x*(2*i-1), PinBoard_V_y, PinBoard_z), - logicPinBoard_V, //its logical volume - "PinPCB_V", //its name - logicChamVac, //its mother - false, //no boolean operat - i+1); //copy number - + G4ThreeVector( PinBoard_V_x*(2*i-1), PinBoard_V_y, PinBoard_z), + logicPinBoard_V, //its logical volume + "PinPCB_V", //its name + logicChamVac, //its mother + false, //no boolean operat + i+1); //copy number + } @@ -1566,7 +1451,7 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) G4Box* solidPinSupportBoard_H_temp = new G4Box("pin-pcb-support", PinBoardSupport_H_W/2., PinBoardSupport_H_H/2., PinBoardSupport_H_L/2.); - + G4double cutOutPinBoard_H_x = 28.6*mm; G4Box* cutOutPinBoard_H = new G4Box("Box Pin Board #1",cutOutPinBoard_H_x/2.,PinBoardSupport_H_H/2.,70.*mm/2.); @@ -1575,7 +1460,7 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) G4ThreeVector cutOutPinBoard_H_m1(-PinL, 0.0*mm, 5.0*mm); G4ThreeVector cutOutPinBoard_H_p2( 2*PinL, 0.0*mm, 5.0*mm); G4ThreeVector cutOutPinBoard_H_m2(-2*PinL, 0.0*mm, 5.0*mm); - + G4SubtractionSolid* solidPinSupportBoard_H0 = new G4SubtractionSolid("pin-pcb-support_0", solidPinSupportBoard_H_temp, cutOutPinBoard_H, 0, cutOutPinBoard_H_centre); @@ -1594,46 +1479,46 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) G4LogicalVolume* logicPinSupportBoard_H = new G4LogicalVolume(solidPinSupportBoard_H, // it's solid - m_ChamberMaterial, // it's material - "pin-pcb-support", // it's name - 0,0,0); // field manager etc + m_ChamberMaterial, // it's material + "pin-pcb-support", // it's name + 0,0,0); // field manager etc logicPinSupportBoard_H->SetVisAttributes(visAttPIN_BoardSup); G4double PinBoardSupport_Z = DSSD_SupPos_z + fCoolingBlockL/2. - PinBoardSupport_H_L/2. - 1.0*mm; - + PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(PinBoard_H_x, fDSSD_PosY + fCoolingBlockCutOutH/2. - PinBoardSupport_H_H/2., PinBoardSupport_Z), - logicPinSupportBoard_H, //its logical volume - "PinPCB_Support", //its name - logicChamVac, //its mother - false, //no boolean operat - 1); //copy number + G4ThreeVector(PinBoard_H_x, fDSSD_PosY + fCoolingBlockCutOutH/2. - PinBoardSupport_H_H/2., PinBoardSupport_Z), + logicPinSupportBoard_H, //its logical volume + "PinPCB_Support", //its name + logicChamVac, //its mother + false, //no boolean operat + 1); //copy number PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(PinBoard_H_x, fDSSD_PosY - fCoolingBlockCutOutH/2. + PinBoardSupport_H_H/2., PinBoardSupport_Z), - logicPinSupportBoard_H, //its logical volume - "PinPCB_Support", //its name - logicChamVac, //its mother - false, //no boolean operat - 2); //copy number + G4ThreeVector(PinBoard_H_x, fDSSD_PosY - fCoolingBlockCutOutH/2. + PinBoardSupport_H_H/2., PinBoardSupport_Z), + logicPinSupportBoard_H, //its logical volume + "PinPCB_Support", //its name + logicChamVac, //its mother + false, //no boolean operat + 2); //copy number + - G4double PinBoardSupport_W_W = 3.75*mm; G4double PinBoardSupport_W_H = fCoolingBlockCutOutH - 2.*PinBoardSupport_H_H; G4double PinBoardSupport_W_L = 80.*mm; - + //Vertical Support Pin Epoxy G4Box* solidPinSupportBoard_V_temp = new G4Box("pin-pcb-support", PinBoardSupport_W_W/2., PinBoardSupport_W_H/2., PinBoardSupport_W_L/2.); - + G4Box* cutOutPinBoard_V = new G4Box("Box Pin Board #1",PinBoardSupport_W_W/2.,cutOutPinBoard_H_x/2.,70.*mm/2.); G4double cutOutSpine_x = (PinL + PinGap - cutOutPinBoard_H_x)/2.; G4ThreeVector cutOutPinBoard_V_p1( 0.0*mm, (cutOutSpine_x+cutOutPinBoard_H_x)/2., 5.0*mm); G4ThreeVector cutOutPinBoard_V_m1( 0.0*mm, -(cutOutSpine_x+cutOutPinBoard_H_x)/2., 5.0*mm); - + G4SubtractionSolid* solidPinSupportBoard_V0 = new G4SubtractionSolid("pin-pcb-support_0", solidPinSupportBoard_V_temp, cutOutPinBoard_V, 0, cutOutPinBoard_V_p1); @@ -1643,29 +1528,29 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) G4LogicalVolume* logicPinSupportBoard_V = new G4LogicalVolume(solidPinSupportBoard_V, // it's solid - m_ChamberMaterial, // it's material - "pin-pcb-support", // it's name - 0,0,0); // field manager etc - + m_ChamberMaterial, // it's material + "pin-pcb-support", // it's name + 0,0,0); // field manager etc + logicPinSupportBoard_V->SetVisAttributes(visAttPIN_BoardSup); PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector( fCoolingBlockCutOutW/2. - PinBoardSupport_W_W/2., fDSSD_PosY, PinBoardSupport_Z), - logicPinSupportBoard_V, //its logical volume - "PinPCBSupport", //its name - logicChamVac, //its mother - false, //no boolean operat - 1); //copy number + G4ThreeVector( fCoolingBlockCutOutW/2. - PinBoardSupport_W_W/2., fDSSD_PosY, PinBoardSupport_Z), + logicPinSupportBoard_V, //its logical volume + "PinPCBSupport", //its name + logicChamVac, //its mother + false, //no boolean operat + 1); //copy number PVPBuffer= new G4PVPlacement(0, //rotation - G4ThreeVector(-fCoolingBlockCutOutW/2. + PinBoardSupport_W_W/2., fDSSD_PosY, PinBoardSupport_Z), - logicPinSupportBoard_V, //its logical volume - "PinPCBSupport", //its name - logicChamVac, //its mother - false, //no boolean operat - 2); //copy number - - + G4ThreeVector(-fCoolingBlockCutOutW/2. + PinBoardSupport_W_W/2., fDSSD_PosY, PinBoardSupport_Z), + logicPinSupportBoard_V, //its logical volume + "PinPCBSupport", //its name + logicChamVac, //its mother + false, //no boolean operat + 2); //copy number + + //add the fucking ridiculous flange.... G4double PinFlange_Z = DSSD_SupPos_z + fCoolingBlockL/2. - 0.5*mm; G4Box* PinFlange_outer = new G4Box("Box Pin Flange #1",fCoolingBlockCutOutW/2.,fCoolingBlockCutOutH/2.,1.0*mm/2.); //probably even thicker just to make sure no low E gammas are seen ! @@ -1674,21 +1559,21 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) G4SubtractionSolid* solidPinFlange = new G4SubtractionSolid("pin-flange", PinFlange_outer, PinFlange_hole, 0, G4ThreeVector(0.*mm, 0.*mm, 0.*mm)); - + G4LogicalVolume* logicPinFlange = new G4LogicalVolume(solidPinFlange, // it's solid - m_ChamberMaterial, // it's material - "pin-flange", // it's name - 0,0,0); // field manager etc - + m_ChamberMaterial, // it's material + "pin-flange", // it's name + 0,0,0); // field manager etc + logicPinFlange->SetVisAttributes(visAttPIN_BoardSup); - + PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.0*mm, fDSSD_PosY, PinFlange_Z), - logicPinFlange, //its logical volume - "PinFlange", //its name - logicChamVac, //its mother - false, //no boolean operat - 1); //copy number + G4ThreeVector(0.0*mm, fDSSD_PosY, PinFlange_Z), + logicPinFlange, //its logical volume + "PinFlange", //its name + logicChamVac, //its mother + false, //no boolean operat + 1); //copy number //now the PINS..... G4VisAttributes* visAttPIN = new G4VisAttributes( G4Colour(0.9,0.9,0.3) ); @@ -1702,7 +1587,7 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) //total Si area G4Box* solidPINS_H = new G4Box("pins-passive", PinL/2., PinT/2., PinL/2); //horizontal new G4Box("pins-passive", PinT/2., PinL/2., PinL/2); //vertical - + //active Si G4Box* solidPINS_Active_H; solidPINS_Active_H = new G4Box("pins", PinL/2.-PinGuard, PinT/2., PinL/2-PinGuard); //horizontal @@ -1711,49 +1596,49 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) //horizontal rows could put an index[i] = copyNo to match position in real array !! for(G4int nH = 0; nH < 2; nH++) { //up/down G4double posY = fDSSD_PosY + (2*nH - 1)*(PinBoard_H_dy - PinBoard_H_H/2. - PinT/2.); - + for(G4int i = 1; i <= 5; i++) { //across in x G4double posX = -PinBoard_H_W/2. + PinL/2. + (i-1)*PinL; for(G4int r = 1; r <= 2; r++) { //2 rows (in z) - G4double posZ = Pin_z1 - (r%2)*(PinGap + PinL); - G4int copyNo = nH*10+2*(i-1)+r; - G4cout << "Checking PIN copyNo " << copyNo << G4endl; - - logicPINS[copyNo-1] = new G4LogicalVolume(solidPINS_H, // it's solid - eDetMat, // it's material - "pin-pass-h", // it's name - 0,0,0); // field manager etc - - logicPINS[copyNo-1]->SetVisAttributes(visAttPIN); - - - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(posX, posY, posZ), - logicPINS[copyNo-1], //its logical volume - "PinPass", //its name - logicChamVac, //its mother - false, //no boolean operat - copyNo, //copy number - true); //check for overlaps - - - logicPINS_Active[copyNo-1] = new G4LogicalVolume(solidPINS_Active_H, // it's solid - eDetMat, // it's material - "pin-h", // it's name - 0,0,0); // field manager etc - - logicPINS_Active[copyNo-1]->SetVisAttributes(visAttPIN); - - - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm,0.*mm), - logicPINS_Active[copyNo-1], //its logical volume - "Pin", //its name - logicPINS[copyNo-1], //its mother - false, //no boolean operat - copyNo); //copy number - + G4double posZ = Pin_z1 - (r%2)*(PinGap + PinL); + G4int copyNo = nH*10+2*(i-1)+r; + G4cout << "Checking PIN copyNo " << copyNo << G4endl; + + logicPINS[copyNo-1] = new G4LogicalVolume(solidPINS_H, // it's solid + eDetMat, // it's material + "pin-pass-h", // it's name + 0,0,0); // field manager etc + + logicPINS[copyNo-1]->SetVisAttributes(visAttPIN); + + + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(posX, posY, posZ), + logicPINS[copyNo-1], //its logical volume + "PinPass", //its name + logicChamVac, //its mother + false, //no boolean operat + copyNo, //copy number + true); //check for overlaps + + + logicPINS_Active[copyNo-1] = new G4LogicalVolume(solidPINS_Active_H, // it's solid + eDetMat, // it's material + "pin-h", // it's name + 0,0,0); // field manager etc + + logicPINS_Active[copyNo-1]->SetVisAttributes(visAttPIN); + + + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.*mm,0.*mm,0.*mm), + logicPINS_Active[copyNo-1], //its logical volume + "Pin", //its name + logicPINS[copyNo-1], //its mother + false, //no boolean operat + copyNo); //copy number + } } } @@ -1782,7 +1667,7 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) G4double connectorL = 14.0*mm; G4double connectorT = 5.0*mm; - + //delta-pos for each pre-amp const G4int nPA = 20; //per support board G4double PA_dPos = PA_SupportBoard_W / ((G4double) (nPA+1)); @@ -1814,27 +1699,27 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) G4LogicalVolume* logicPA_SupportBoard = new G4LogicalVolume(solidPA_SupportBoard, // it's solid - boardMaterial, // it's material - "dssd-pa-support-pcb", // it's name - 0,0,0); // field manager etc + boardMaterial, // it's material + "dssd-pa-support-pcb", // it's name + 0,0,0); // field manager etc G4LogicalVolume* logicDSSD_Connector = new G4LogicalVolume(solidDSSD_Connector, // it's solid - boardMaterial, // it's material - "dssd-connector", // it's name - 0,0,0); // field manager etc + boardMaterial, // it's material + "dssd-connector", // it's name + 0,0,0); // field manager etc G4LogicalVolume* logicPA_Board = new G4LogicalVolume(solidPA_Board, // it's solid - boardMaterial, // it's material - "dssd-pa-pcb", // it's name - 0,0,0); // field manager etc - + boardMaterial, // it's material + "dssd-pa-pcb", // it's name + 0,0,0); // field manager etc + G4LogicalVolume* logicPA_Capacitor = new G4LogicalVolume(solidPA_Capacitor, // it's solid - boardMaterial, // it's material - "dssd-pa-cap", // it's name - 0,0,0); // field manager etc + boardMaterial, // it's material + "dssd-pa-cap", // it's name + 0,0,0); // field manager etc logicPA_SupportBoard->SetVisAttributes(visAtt_PA_SupportBoard); logicDSSD_Connector->SetVisAttributes(visAtt_PA_SupportBoard); @@ -1858,63 +1743,63 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) G4RotationMatrix* rot_90_Z = new G4RotationMatrix; rot_90_Z->set(0,0,0); rot_90_Z->rotateZ(90.*degree); - + G4RotationMatrix* rot_90_Y = new G4RotationMatrix; rot_90_Y->set(0,0,0); rot_90_Y->rotateY(90.*degree); - + //vertical boards.... //G4PVPlacement* physiPA_Board[6][nPA]; //G4PVPlacement* physiPA_Capacitor[6][nPA]; for(G4int i = 0; i < 4; i++) { - + G4double xPos = fCoolingBlockW/2. + PA_SupportBoard_T/2. + 3.0*mm; G4double yPos = top_of_DSSD_Brd - PA_SupportBoard_W/2. - gapConnector_2_DSSD_Board_V + gapConnector_PA_Board; - + if(i >= 2) xPos *= -1.; if(i%2 != 0) yPos -= (PA_SupportBoard_W + 7.0*mm); PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(xPos, yPos, PA_SupportBoard_z), - logicPA_SupportBoard, //its logical volume - "dssd-pa-support-pcb", //its name - logicChamVac, //its mother - false, //no boolean operat - i+1); //copy number - - + G4ThreeVector(xPos, yPos, PA_SupportBoard_z), + logicPA_SupportBoard, //its logical volume + "dssd-pa-support-pcb", //its name + logicChamVac, //its mother + false, //no boolean operat + i+1); //copy number + + xPos = DSSD_BrdW/2. - 9.0*mm; yPos = top_of_DSSD_Brd - gapConnector_2_DSSD_Board_V - connectorW/2.; - + switch (i) { - case 0 : - break; - case 1 : yPos -= (7.0*mm + connectorW); - case 2 : yPos -= (15.0*mm + connectorW); - case 3 : yPos -= (7.0*mm + connectorW); - break; + case 0 : + break; + case 1 : yPos -= (7.0*mm + connectorW); + case 2 : yPos -= (15.0*mm + connectorW); + case 3 : yPos -= (7.0*mm + connectorW); + break; } - + PVPBuffer = new G4PVPlacement(rot_90_Z, //rotation - G4ThreeVector(xPos, yPos, PA_SupportBoard_z+PA_SupportBoard_L/2.-connectorL/2.), - logicDSSD_Connector, //its logical volume - "dssd-pa-support-pcb", //its name - logicChamVac, //its mother - false, //no boolean operat - i+1); //copy number + G4ThreeVector(xPos, yPos, PA_SupportBoard_z+PA_SupportBoard_L/2.-connectorL/2.), + logicDSSD_Connector, //its logical volume + "dssd-pa-support-pcb", //its name + logicChamVac, //its mother + false, //no boolean operat + i+1); //copy number PVPBuffer = new G4PVPlacement(rot_90_Z, //rotation - G4ThreeVector(-xPos, yPos, PA_SupportBoard_z+PA_SupportBoard_L/2.-connectorL/2.), - logicDSSD_Connector, //its logical volume - "dssd-pa-support-pcb", //its name - logicChamVac, //its mother - false, //no boolean operat - i+1+4); //copy number + G4ThreeVector(-xPos, yPos, PA_SupportBoard_z+PA_SupportBoard_L/2.-connectorL/2.), + logicDSSD_Connector, //its logical volume + "dssd-pa-support-pcb", //its name + logicChamVac, //its mother + false, //no boolean operat + i+1+4); //copy number //place the preamp boards and capacitors G4double PA_PosY = top_of_DSSD_Brd - gapConnector_2_DSSD_Board_V + gapConnector_PA_Board; @@ -1922,87 +1807,87 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) if(i >= 2) PA_PosX *= -1.; if(i%2 != 0) PA_PosY -= (PA_SupportBoard_W + 7.0*mm); - + for(G4int j = 0; j < nPA; j++) { G4double thisY = PA_PosY - PA_dPos*(j+1); PVPBuffer = - new G4PVPlacement(0, //rotation - G4ThreeVector(PA_PosX, thisY, PA_SupportBoard_z-10*mm), - logicPA_Board, //its logical volume - "dssd-pa-pcb", //its name - logicChamVac, //its mother - false, //no boolean operat - j+1); //copy number + new G4PVPlacement(0, //rotation + G4ThreeVector(PA_PosX, thisY, PA_SupportBoard_z-10*mm), + logicPA_Board, //its logical volume + "dssd-pa-pcb", //its name + logicChamVac, //its mother + false, //no boolean operat + j+1); //copy number PVPBuffer = - new G4PVPlacement(rmCap, //rotation - G4ThreeVector(PA_PosX, thisY, PA_SupportBoard_z+20.*mm), - logicPA_Capacitor, //its logical volume - "dssd-pa-cap", //its name - logicChamVac, //its mother - false, //no boolean operat - j+1); //copy number - + new G4PVPlacement(rmCap, //rotation + G4ThreeVector(PA_PosX, thisY, PA_SupportBoard_z+20.*mm), + logicPA_Capacitor, //its logical volume + "dssd-pa-cap", //its name + logicChamVac, //its mother + false, //no boolean operat + j+1); //copy number + } } - + //horizontal... for(G4int i = 4; i < 6; i++) { - + G4double xPos = PA_SupportBoard_W/2.+gapConnector_2_DSSD_Board_H-gapConnector_PA_Board; G4double yPos = top_of_DSSD_Brd-13.*mm-connectorT-PA_SupportBoard_T/2.+ 1.0*mm; - + if(i == 5) xPos *= -1.; PVPBuffer= new G4PVPlacement(rot_90_Z, //rotation - G4ThreeVector(xPos, yPos, PA_SupportBoard_z), - logicPA_SupportBoard, //its logical volume - "dssd-pa-support-pcb", //its name - logicChamVac, //its mother - false, //no boolean operat - i+1); //copy number + G4ThreeVector(xPos, yPos, PA_SupportBoard_z), + logicPA_SupportBoard, //its logical volume + "dssd-pa-support-pcb", //its name + logicChamVac, //its mother + false, //no boolean operat + i+1); //copy number for(G4int j = 0; j < 2; j++) { PVPBuffer = - new G4PVPlacement(0, //rotation - G4ThreeVector(xPos+((2*j-1)*(connectorW/2.+3.5*mm)), yPos+PA_SupportBoard_T/2.+connectorT/2., PA_SupportBoard_z+PA_SupportBoard_L/2.-connectorL/2.), - logicDSSD_Connector, //its logical volume - "dssd-pa-support-pcb", //its name - logicChamVac, //its mother - false, //no boolean operat - 1+4+2*i+j); //copy number + new G4PVPlacement(0, //rotation + G4ThreeVector(xPos+((2*j-1)*(connectorW/2.+3.5*mm)), yPos+PA_SupportBoard_T/2.+connectorT/2., PA_SupportBoard_z+PA_SupportBoard_L/2.-connectorL/2.), + logicDSSD_Connector, //its logical volume + "dssd-pa-support-pcb", //its name + logicChamVac, //its mother + false, //no boolean operat + 1+4+2*i+j); //copy number } - + //place the preamp boards and capacitors G4double PA_PosY = yPos + PA_Board_W/2. + PA_SupportBoard_T/2.; G4double PA_PosX = xPos + PA_SupportBoard_W/2.; - + //if(i >= 2) PA_PosX *= -1.; //if(i%2 != 0) PA_PosY -= (PA_SupportBoard_W + 7.0*mm); - + for(G4int j = 0; j < nPA; j++) { G4double thisX = PA_PosX - PA_dPos*(j+1); PVPBuffer = - new G4PVPlacement(rot_90_Z, //rotation - G4ThreeVector(thisX, PA_PosY, PA_SupportBoard_z-10*mm), - logicPA_Board, //its logical volume - "dssd-pa-pcb", //its name - logicChamVac, //its mother - false, //no boolean operat - j+1); //copy number - + new G4PVPlacement(rot_90_Z, //rotation + G4ThreeVector(thisX, PA_PosY, PA_SupportBoard_z-10*mm), + logicPA_Board, //its logical volume + "dssd-pa-pcb", //its name + logicChamVac, //its mother + false, //no boolean operat + j+1); //copy number + PVPBuffer = - new G4PVPlacement(rot_90_Y, //rotation - G4ThreeVector(thisX, PA_PosY, PA_SupportBoard_z+20.*mm), - logicPA_Capacitor, //its logical volume - "dssd-pa-cap", //its name - logicChamVac, //its mother - false, //no boolean operat - j+1); //copy number - + new G4PVPlacement(rot_90_Y, //rotation + G4ThreeVector(thisX, PA_PosY, PA_SupportBoard_z+20.*mm), + logicPA_Capacitor, //its logical volume + "dssd-pa-cap", //its name + logicChamVac, //its mother + false, //no boolean operat + j+1); //copy number + } } @@ -2021,10 +1906,10 @@ void Chamber::ConstructDetector(G4LogicalVolume* world) //Place_PhaseII_LookingUpstream(); //usual G4cout << ".....placed" << G4endl; - - } + +} @@ -2039,7 +1924,7 @@ void Chamber::InitializeRootOutput() // Called at in the EventAction::EndOfEventAvtion void Chamber::ReadSensitive(const G4Event*) {} - + //################################################################################################################################################# @@ -2075,17 +1960,17 @@ void Chamber::Place_PhaseIIs_Left_and_Right(G4LogicalVolume* world) vacuum_PosZ = fVacuumPosZ_PhaseII; geLeaf_PosZ = fGeLeafPosZ_PhaseII; - + G4RotationMatrix rm ; G4double theta = 90. * deg; G4double phi = 0. * deg; - - + + //for(G4int det = prevNumber; det < numberOfClovers; det++) { for(G4int det = 0; det < 2; det++) { logicEndCap_CloverLR[det] = new G4LogicalVolume(solidEndCap_PhaseII, endCapMaterial, "clover_EC", 0, 0, 0); logicVacuum_CloverLR[det] = new G4LogicalVolume(solidVacuum_PhaseII, vacuumMaterial, "clover_Vac", 0, 0, 0); - + for(G4int l = 0; l < 4; l++) { logicGeLeaf_CloverLR[det][l] = new G4LogicalVolume(solidGeLeaf_PhaseII, geMaterial, "clover_Leaf", 0, 0, 0); logicPassivated_CloverLR[det][l] = new G4LogicalVolume(solidPassivated_PhaseII, geMaterial, "passivatedGe", 0, 0, 0); //should be Ge @@ -2093,49 +1978,49 @@ void Chamber::Place_PhaseIIs_Left_and_Right(G4LogicalVolume* world) logicBoreHole_CloverLR[det][l] = new G4LogicalVolume(solidBoreHole_PhaseII, vacuumMaterial, "bore-hole", 0, 0, 0); } - + //rotation for each clover..... rm.set(0,0,0); phi = 180.0 * deg * det; rm.rotateY(theta); rm.rotateX(phi); rm.invert(); - + //traslate position: the centre of the DSSD has been placed @ Y = 0.0*mm G4ThreeVector translation(-endCap_PosX*sin(theta)*cos(phi), - endCap_PosX*sin(theta)*sin(phi) + 0.0*mm, //fDSSD_PosY, - geSidePosition); - + endCap_PosX*sin(theta)*sin(phi) + 0.0*mm, //fDSSD_PosY, + geSidePosition); + G4cout << "Clover " << det << " x " << -endCap_PosX*sin(theta)*cos(phi) << G4endl; //Physical placement of these solids...... PVPBuffer = new G4PVPlacement(G4Transform3D(rm, translation), - logicEndCap_CloverLR[det],//its logical volume - "Clover_EC", //its name - world, //its mother - true, //no boolean operat - det*4, //copy number - true); //overlap check - + logicEndCap_CloverLR[det],//its logical volume + "Clover_EC", //its name + world, //its mother + true, //no boolean operat + det*4, //copy number + true); //overlap check + PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm,vacuum_PosZ), - logicVacuum_CloverLR[det], //its logical volume - "Clover_Vac", //its name - logicEndCap_CloverLR[det], //its mother - true, //no boolean operat - det*4, //copy number - true); //overlap check + G4ThreeVector(0.*mm,0.*mm,vacuum_PosZ), + logicVacuum_CloverLR[det], //its logical volume + "Clover_Vac", //its name + logicEndCap_CloverLR[det], //its mother + true, //no boolean operat + det*4, //copy number + true); //overlap check } - + //Now for the placement of the leaves in each clover...... G4RotationMatrix* rmC; G4double leafX; G4double leafY; //G4double leafZ; - + //Keep track of which detectors are used //G4String detName[2] = {"CloverR","CloverL"}; //Looking upstream - + for(G4int l = 0; l < 4; l++) { //the rotation rmC = new G4RotationMatrix; @@ -2156,44 +2041,44 @@ void Chamber::Place_PhaseIIs_Left_and_Right(G4LogicalVolume* world) } //the z-translation //leafZ = geLeaf_PosZ; - - + + //for(G4int det = prevNumber; det < numberOfClovers; det++) { for(G4int det = 0; det < 2; det++) { //physiGeLeaf_CloverLR[det][l] = new G4PVPlacement(rmC, //rotation PVPBuffer = new G4PVPlacement(rmC, //rotation - G4ThreeVector(leafX,leafY,geLeaf_PosZ), - logicGeLeaf_CloverLR[det][l], //its logical volume - "Clover",//detName[det].data(), //its name - logicVacuum_CloverLR[det], //its mother - true, //no boolean operat - det*4+l, //copy number - true); //overlap check + G4ThreeVector(leafX,leafY,geLeaf_PosZ), + logicGeLeaf_CloverLR[det][l], //its logical volume + "Clover",//detName[det].data(), //its name + logicVacuum_CloverLR[det], //its mother + true, //no boolean operat + det*4+l, //copy number + true); //overlap check //physiPassivated_CloverLR[det][l] = new G4PVPlacement(0, //rotation PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(-fHole_dX_PhaseII, -fHole_dY_PhaseII, fContact_dZ_PhaseII), - logicPassivated_CloverLR[det][l], - "GePassivated", - logicGeLeaf_CloverLR[det][l], - false,det*4+l,true); - + G4ThreeVector(-fHole_dX_PhaseII, -fHole_dY_PhaseII, fContact_dZ_PhaseII), + logicPassivated_CloverLR[det][l], + "GePassivated", + logicGeLeaf_CloverLR[det][l], + false,det*4+l,true); + //physiContact_CloverLR[det][l] = new G4PVPlacement(0, //rotation PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_PhaseII), - logicContact_CloverLR[det][l], - "LiContact", - logicPassivated_CloverLR[det][l], - false,det*4+l,true); - - //physiBoreHole_CloverLR[det][l] = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_PhaseII), - logicBoreHole_CloverLR[det][l], - "BoreHole", - logicContact_CloverLR[det][l], - false,det*4+l,true); - + G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_PhaseII), + logicContact_CloverLR[det][l], + "LiContact", + logicPassivated_CloverLR[det][l], + false,det*4+l,true); + + //physiBoreHole_CloverLR[det][l] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_PhaseII), + logicBoreHole_CloverLR[det][l], + "BoreHole", + logicContact_CloverLR[det][l], + false,det*4+l,true); + } } @@ -2202,30 +2087,30 @@ void Chamber::Place_PhaseIIs_Left_and_Right(G4LogicalVolume* world) visAttAlCap->SetForceWireframe(true); visAttAlCap->SetVisibility(true); //visAttAlCap->SetVisibility(false); - + G4VisAttributes* visAttGeVac = new G4VisAttributes( G4Colour(0.9,1.0,0.9) ); visAttGeVac->SetForceWireframe(true); visAttGeVac->SetVisibility(true); //visAttGeVac->SetVisibility(false); - + G4VisAttributes* visAttActive = new G4VisAttributes( G4Colour(1.0,1.0,0.0) ); visAttActive->SetForceWireframe(true); visAttActive->SetVisibility(true); //visAttActive->SetVisibility(false); - + G4VisAttributes* visAttPassive = new G4VisAttributes(G4Colour(0.0,1.0,1.0) ); visAttPassive->SetForceWireframe(true); visAttPassive->SetVisibility(true); //visAttPassive->SetVisibility(false); - + G4VisAttributes* visAttLiContact = new G4VisAttributes(G4Colour(1.0,0.0,1.0) ); visAttLiContact->SetVisibility(true); //visAttLiContact->SetVisibility(false); - + G4VisAttributes* visAttHole = new G4VisAttributes( G4Colour(0.0,0.0,1.0) ); visAttHole->SetVisibility(true); //visAttHole->SetVisibility(false); - + for(G4int det = 0; det < 2; det++) { logicEndCap_CloverLR[det]->SetVisAttributes(visAttAlCap); logicVacuum_CloverLR[det]->SetVisAttributes(visAttGeVac); @@ -2236,1214 +2121,1218 @@ void Chamber::Place_PhaseIIs_Left_and_Right(G4LogicalVolume* world) logicBoreHole_CloverLR[det][l]->SetVisAttributes(visAttHole); } } -} + } -//------------------------------------------------------------------ -void Chamber::Place_PhaseII_On_the_Top(G4LogicalVolume* world) -{ - //================================================================================= - //Do not know why, but the positioning seems to be with respect to the Taper-part : - //setting the z-position as endCapTaperL/2 puts the front face at z = 0 mm - //================================================================================= - G4double endCap_PosX; - G4double vacuum_PosZ; - G4double geLeaf_PosZ; + //------------------------------------------------------------------ + void Chamber::Place_PhaseII_On_the_Top(G4LogicalVolume* world) + { + //================================================================================= + //Do not know why, but the positioning seems to be with respect to the Taper-part : + //setting the z-position as endCapTaperL/2 puts the front face at z = 0 mm + //================================================================================= + G4double endCap_PosX; + G4double vacuum_PosZ; + G4double geLeaf_PosZ; - //reset scale - endCap_PosX = fChamberH/2. + fEndCapTaperL_PhaseII/2. + fGeTopGap; - vacuum_PosZ = fVacuumPosZ_PhaseII; - geLeaf_PosZ = fGeLeafPosZ_PhaseII; - - - G4RotationMatrix rm ; - G4double theta = 90. * deg; - G4double phi = 0. * deg; - - - logicEndCap_CloverT = new G4LogicalVolume(solidEndCap_PhaseII, endCapMaterial, "clover_EC", 0, 0, 0); - logicVacuum_CloverT = new G4LogicalVolume(solidVacuum_PhaseII, vacuumMaterial, "clover_Vac", 0, 0, 0); - - for(G4int l = 0; l < 4; l++) { - logicGeLeaf_CloverT[l] = new G4LogicalVolume(solidGeLeaf_PhaseII, geMaterial, "clover_Leaf", 0, 0, 0); - logicPassivated_CloverT[l] = new G4LogicalVolume(solidPassivated_PhaseII, geMaterial, "passivatedGe", 0, 0, 0); //should be Ge - logicContact_CloverT[l] = new G4LogicalVolume(solidContact_PhaseII, contactMaterial, "inner_contact", 0, 0, 0); //should be Li - logicBoreHole_CloverT[l] = new G4LogicalVolume(solidBoreHole_PhaseII, vacuumMaterial, "bore-hole", 0, 0, 0); - } + //reset scale + endCap_PosX = fChamberH/2. + fEndCapTaperL_PhaseII/2. + fGeTopGap; + vacuum_PosZ = fVacuumPosZ_PhaseII; + geLeaf_PosZ = fGeLeafPosZ_PhaseII; - //rotate - rm.set(0,0,0); - phi = 90.0 * deg; - rm.rotateY(theta); - rm.rotateX(phi); - rm.invert(); - - //traslate position - G4ThreeVector translation(-endCap_PosX*sin(theta)*cos(phi), - endCap_PosX*sin(theta)*sin(phi), - geTopPosition); - - G4cout << "Top Clover " << " x " << -endCap_PosX*sin(theta)*cos(phi) << G4endl; - - //Physical placement of these solids...... - //physiEndCap_CloverT = new G4PVPlacement(G4Transform3D(rm, translation), - PVPBuffer = new G4PVPlacement(G4Transform3D(rm, translation), - logicEndCap_CloverT,//its logical volume - "Clover_EC", //its name - world, //its mother - true, //no boolean operat - 8, //copy number - true); //overlap check - - //physiVacuum_CloverT = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm,vacuum_PosZ), - logicVacuum_CloverT, //its logical volume - "Clover_Vac", //its name - logicEndCap_CloverT, //its mother - true, //no boolean operat - 8, //copy number - true); //overlap check - //Now for the placement of the leaves in each clover...... - G4RotationMatrix* rmC; - G4double leafX; - G4double leafY; - //G4double leafZ; - - for(G4int l = 0; l < 4; l++) { - //the rotation - rmC = new G4RotationMatrix; - rmC->set(0,0,0); - rmC->rotateZ(90.*degree*(4-l)); - rmC->invert(); - //the x-translation - if(l < 2) { - leafX = 22.15*mm; - } else { - leafX = -22.15*mm; - } - //the y-translation - if(l == 0 || l == 3 ) { - leafY = 22.15*mm; - } else { - leafY = -22.15*mm; + G4RotationMatrix rm ; + G4double theta = 90. * deg; + G4double phi = 0. * deg; + + + logicEndCap_CloverT = new G4LogicalVolume(solidEndCap_PhaseII, endCapMaterial, "clover_EC", 0, 0, 0); + logicVacuum_CloverT = new G4LogicalVolume(solidVacuum_PhaseII, vacuumMaterial, "clover_Vac", 0, 0, 0); + + for(G4int l = 0; l < 4; l++) { + logicGeLeaf_CloverT[l] = new G4LogicalVolume(solidGeLeaf_PhaseII, geMaterial, "clover_Leaf", 0, 0, 0); + logicPassivated_CloverT[l] = new G4LogicalVolume(solidPassivated_PhaseII, geMaterial, "passivatedGe", 0, 0, 0); //should be Ge + logicContact_CloverT[l] = new G4LogicalVolume(solidContact_PhaseII, contactMaterial, "inner_contact", 0, 0, 0); //should be Li + logicBoreHole_CloverT[l] = new G4LogicalVolume(solidBoreHole_PhaseII, vacuumMaterial, "bore-hole", 0, 0, 0); } - //the z-translation - //leafZ = geLeaf_PosZ; - - - //physiGeLeaf_CloverT[l] = new G4PVPlacement(rmC, //rotation - PVPBuffer = new G4PVPlacement(rmC, //rotation - G4ThreeVector(leafX,leafY,geLeaf_PosZ), - logicGeLeaf_CloverT[l], //its logical volume - "Clover", //its name - logicVacuum_CloverT, //its mother - true, //no boolean operat - 8+l, //copy number - true); //overlap check - - //physiPassivated_CloverT[l] = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(-fHole_dX_PhaseII, -fHole_dY_PhaseII, fContact_dZ_PhaseII), - logicPassivated_CloverT[l], - "GePassivated", - logicGeLeaf_CloverT[l], - false,8+l,true); - - //physiContact_CloverT[l] = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_PhaseII), - logicContact_CloverT[l], - "LiContact", - logicPassivated_CloverT[l], - false,8+l,true); - //physiBoreHole_CloverT[l] = new G4PVPlacement(0, //rotation + //rotate + rm.set(0,0,0); + phi = 90.0 * deg; + rm.rotateY(theta); + rm.rotateX(phi); + rm.invert(); + + //traslate position + G4ThreeVector translation(-endCap_PosX*sin(theta)*cos(phi), + endCap_PosX*sin(theta)*sin(phi), + geTopPosition); + + G4cout << "Top Clover " << " x " << -endCap_PosX*sin(theta)*cos(phi) << G4endl; + + //Physical placement of these solids...... + //physiEndCap_CloverT = new G4PVPlacement(G4Transform3D(rm, translation), + PVPBuffer = new G4PVPlacement(G4Transform3D(rm, translation), + logicEndCap_CloverT,//its logical volume + "Clover_EC", //its name + world, //its mother + true, //no boolean operat + 8, //copy number + true); //overlap check + + //physiVacuum_CloverT = new G4PVPlacement(0, //rotation PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_PhaseII), - logicBoreHole_CloverT[l], - "BoreHole", - logicContact_CloverT[l], - false,8+l,true); - - } + G4ThreeVector(0.*mm,0.*mm,vacuum_PosZ), + logicVacuum_CloverT, //its logical volume + "Clover_Vac", //its name + logicEndCap_CloverT, //its mother + true, //no boolean operat + 8, //copy number + true); //overlap check + + //Now for the placement of the leaves in each clover...... + G4RotationMatrix* rmC; + G4double leafX; + G4double leafY; + //G4double leafZ; - //define the visual attributes - G4VisAttributes* visAttAlCap = new G4VisAttributes( G4Colour(0.9,0.9,0.9) ); - visAttAlCap->SetVisibility(true); - visAttAlCap->SetForceWireframe(true); - - G4VisAttributes* visAttGeVac = new G4VisAttributes( G4Colour(0.9,1.0,0.9) ); - visAttGeVac->SetForceWireframe(true); - visAttGeVac->SetVisibility(true); - - G4VisAttributes* visAttActive = new G4VisAttributes( G4Colour(1.0,1.0,0.0) ); - visAttActive->SetForceWireframe(true); - visAttActive->SetVisibility(true); - - G4VisAttributes* visAttPassive = new G4VisAttributes(G4Colour(0.0,1.0,1.0) ); - visAttPassive->SetForceWireframe(true); - visAttPassive->SetVisibility(true); - - G4VisAttributes* visAttLiContact = new G4VisAttributes(G4Colour(1.0,0.0,1.0) ); - visAttLiContact->SetVisibility(true); - - G4VisAttributes* visAttHole = new G4VisAttributes( G4Colour(0.0,0.0,1.0) ); - visAttHole->SetVisibility(true); - - logicEndCap_CloverT->SetVisAttributes(visAttAlCap); - logicVacuum_CloverT->SetVisAttributes(visAttGeVac); - for(G4int l = 0; l < 4; l++) { - logicGeLeaf_CloverT[l]->SetVisAttributes(visAttActive); - logicPassivated_CloverT[l]->SetVisAttributes(visAttPassive); - logicContact_CloverT[l]->SetVisAttributes(visAttLiContact); - logicBoreHole_CloverT[l]->SetVisAttributes(visAttHole); - } -} + for(G4int l = 0; l < 4; l++) { + //the rotation + rmC = new G4RotationMatrix; + rmC->set(0,0,0); + rmC->rotateZ(90.*degree*(4-l)); + rmC->invert(); + //the x-translation + if(l < 2) { + leafX = 22.15*mm; + } else { + leafX = -22.15*mm; + } + //the y-translation + if(l == 0 || l == 3 ) { + leafY = 22.15*mm; + } else { + leafY = -22.15*mm; + } + //the z-translation + //leafZ = geLeaf_PosZ; -//------------------------------------------------------------------ -void Chamber::Place_GREAT_On_the_Top(G4LogicalVolume* world) -{ - //================================================================================= - // The positioning for boolean solids is odd : for this det it is with respect to the Taper-part : - //setting the z-position as endCapTaperL/2 puts the front face at z = 0 mm - //================================================================================= - G4double endCap_PosX = fChamberH/2. - fShiftChamberY + fEndCapTaperL_GREAT/2. + fGeTopGap; - G4double vacuum_PosZ = fVacuumPosZ_GREAT; - G4double geLeaf_PosZ = fGeLeafPosZ_GREAT; - - - G4RotationMatrix rm ; - G4double theta = 90. * deg; - G4double phi = 0. * deg; - - - logicEndCap_CloverT = new G4LogicalVolume(solidEndCap_GREAT, endCapMaterial, "clover_EC", 0, 0, 0); - logicVacuum_CloverT = new G4LogicalVolume(solidVacuum_GREAT, vacuumMaterial, "clover_Vac", 0, 0, 0); - - for(G4int l = 0; l < 4; l++) { - logicGeLeaf_CloverT[l] = new G4LogicalVolume(solidGeLeaf_GREAT, geMaterial, "clover_Leaf", 0, 0, 0); - logicPassivated_CloverT[l] = new G4LogicalVolume(solidPassivated_GREAT, geMaterial, "passivatedGe", 0, 0, 0); - logicContact_CloverT[l] = new G4LogicalVolume(solidContact_GREAT, contactMaterial, "inner_contact", 0, 0, 0); - logicBoreHole_CloverT[l] = new G4LogicalVolume(solidBoreHole_GREAT, vacuumMaterial, "bore_hole", 0, 0, 0); - } + //physiGeLeaf_CloverT[l] = new G4PVPlacement(rmC, //rotation + PVPBuffer = new G4PVPlacement(rmC, //rotation + G4ThreeVector(leafX,leafY,geLeaf_PosZ), + logicGeLeaf_CloverT[l], //its logical volume + "Clover", //its name + logicVacuum_CloverT, //its mother + true, //no boolean operat + 8+l, //copy number + true); //overlap check + + //physiPassivated_CloverT[l] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(-fHole_dX_PhaseII, -fHole_dY_PhaseII, fContact_dZ_PhaseII), + logicPassivated_CloverT[l], + "GePassivated", + logicGeLeaf_CloverT[l], + false,8+l,true); - //rotate - rm.set(0,0,0); - phi = 90.0 * deg; - rm.rotateY(theta); - rm.rotateX(phi); - rm.invert(); - - //traslate position - G4ThreeVector translation(-endCap_PosX*sin(theta)*cos(phi), - endCap_PosX*sin(theta)*sin(phi), - geTopPosition +fCorrection); - - G4cout << "Top Clover " << " x " << -endCap_PosX*sin(theta)*cos(phi) << G4endl; - - //Physical placement of these solids...... - //physiEndCap_CloverT = new G4PVPlacement(G4Transform3D(rm, translation), - PVPBuffer = new G4PVPlacement(G4Transform3D(rm, translation), - logicEndCap_CloverT,//its logical volume - "Clover_EC", //its name - world, //its mother - true, //no boolean operat - 8, //copy number - true); //overlap check - - //physiVacuum_CloverT = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm,vacuum_PosZ), - logicVacuum_CloverT, //its logical volume - "Clover_Vac", //its name - logicEndCap_CloverT, //its mother - true, //no boolean operat - 8, //copy number - true); //overlap check + //physiContact_CloverT[l] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_PhaseII), + logicContact_CloverT[l], + "LiContact", + logicPassivated_CloverT[l], + false,8+l,true); + + //physiBoreHole_CloverT[l] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_PhaseII), + logicBoreHole_CloverT[l], + "BoreHole", + logicContact_CloverT[l], + false,8+l,true); - //Now for the placement of the leaves in each clover...... - G4RotationMatrix* rmC; - G4double dPos = fGeLeaf_dX_GREAT + fGapBetweenLeaves_GREAT/2.; - G4double leafX; - G4double leafY; - G4double leafZ; - - for(G4int l = 0; l < 4; l++) { - //the rotation - rmC = new G4RotationMatrix; - rmC->set(0,0,0); - rmC->rotateZ(90.*degree*(4-l)); - rmC->invert(); - //the x-translation - if(l < 2) { - leafX = dPos; - } else { - leafX = -dPos; } - //the y-translation - if(l == 0 || l == 3 ) { - leafY = dPos; - } else { - leafY = -dPos; + + //define the visual attributes + G4VisAttributes* visAttAlCap = new G4VisAttributes( G4Colour(0.9,0.9,0.9) ); + visAttAlCap->SetVisibility(true); + visAttAlCap->SetForceWireframe(true); + + G4VisAttributes* visAttGeVac = new G4VisAttributes( G4Colour(0.9,1.0,0.9) ); + visAttGeVac->SetForceWireframe(true); + visAttGeVac->SetVisibility(true); + + G4VisAttributes* visAttActive = new G4VisAttributes( G4Colour(1.0,1.0,0.0) ); + visAttActive->SetForceWireframe(true); + visAttActive->SetVisibility(true); + + G4VisAttributes* visAttPassive = new G4VisAttributes(G4Colour(0.0,1.0,1.0) ); + visAttPassive->SetForceWireframe(true); + visAttPassive->SetVisibility(true); + + G4VisAttributes* visAttLiContact = new G4VisAttributes(G4Colour(1.0,0.0,1.0) ); + visAttLiContact->SetVisibility(true); + + G4VisAttributes* visAttHole = new G4VisAttributes( G4Colour(0.0,0.0,1.0) ); + visAttHole->SetVisibility(true); + + logicEndCap_CloverT->SetVisAttributes(visAttAlCap); + logicVacuum_CloverT->SetVisAttributes(visAttGeVac); + for(G4int l = 0; l < 4; l++) { + logicGeLeaf_CloverT[l]->SetVisAttributes(visAttActive); + logicPassivated_CloverT[l]->SetVisAttributes(visAttPassive); + logicContact_CloverT[l]->SetVisAttributes(visAttLiContact); + logicBoreHole_CloverT[l]->SetVisAttributes(visAttHole); } - //the z-translation - leafZ = geLeaf_PosZ; - - - //physiGeLeaf_CloverT[l] = new G4PVPlacement(rmC, //rotation - PVPBuffer = new G4PVPlacement(rmC, //rotation - G4ThreeVector(leafX, leafY, leafZ), - logicGeLeaf_CloverT[l], //its logical volume - "Clover", //its name - logicVacuum_CloverT, //its mother - true, //no boolean operat - 8+l, //copy number - true); //overlap check - - //physiPassivated_CloverT[l] = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(fHole_dX_GREAT, fHole_dY_GREAT, fContact_dZ_GREAT), - logicPassivated_CloverT[l], - "GePassivated", - logicGeLeaf_CloverT[l], - false,8+l,true); - - //physiContact_CloverT[l] = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_GREAT), - logicContact_CloverT[l], - "LiContact", - logicPassivated_CloverT[l], - false,8+l,true); - - //physiBoreHole_CloverT[l] = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm, 0.0*mm), - logicBoreHole_CloverT[l], - "BoreHole", - logicContact_CloverT[l], - false,8+l,true); - } - //define the visual attributes - G4VisAttributes* visAttAlCap = new G4VisAttributes( G4Colour(0.9,0.9,0.9) ); - visAttAlCap->SetVisibility(true); - //visAttAlCap->SetVisibility(false); - visAttAlCap->SetForceWireframe(true); - - G4VisAttributes* visAttGeVac = new G4VisAttributes( G4Colour(0.9,1.0,0.9) ); - visAttGeVac->SetVisibility(true); - //visAttGeVac->SetVisibility(false); - visAttGeVac->SetForceWireframe(true); - - G4VisAttributes* visAttActive = new G4VisAttributes( G4Colour(1.0,1.0,0.0) ); - visAttActive->SetVisibility(true); - //visAttActive->SetVisibility(false); - visAttActive->SetForceWireframe(true); - - G4VisAttributes* visAttPassive = new G4VisAttributes(G4Colour(0.0,1.0,1.0) ); - visAttPassive->SetVisibility(true); - //visAttPassive->SetVisibility(false); - visAttPassive->SetForceWireframe(true); - - G4VisAttributes* visAttLiContact = new G4VisAttributes(G4Colour(1.0,0.0,1.0) ); - visAttLiContact->SetVisibility(true); - //visAttLiContact->SetVisibility(false); - - G4VisAttributes* visAttHole = new G4VisAttributes( G4Colour(0.0,0.0,1.0) ); - visAttHole->SetVisibility(true); - //visAttHole->SetVisibility(false); - - logicEndCap_CloverT->SetVisAttributes(visAttAlCap); - logicVacuum_CloverT->SetVisAttributes(visAttGeVac); - for(G4int l = 0; l < 4; l++) { - logicGeLeaf_CloverT[l]->SetVisAttributes(visAttActive); - logicPassivated_CloverT[l]->SetVisAttributes(visAttPassive); - logicContact_CloverT[l]->SetVisAttributes(visAttLiContact); - logicBoreHole_CloverT[l]->SetVisAttributes(visAttHole); - } -} -//------------------------------------------------------------------ -// Clover numbering scheme : -// Left = 0 => Crystals 0, 1, 2, 3 -// Right = 4 => Crystals 4, 5, 6, 7 -// Top = 8 => Crystals 8, 9,10,11 -// Upstream = 12 => Crystals 12,13,14,15 -//------------------------------------------------------------------ -//------------------------------------------------------------------ -void Chamber::Place_GREAT_Left_and_Right(G4LogicalVolume* world) -{ - //================================================================================= - // The positioning for boolean solids is odd : for this det it is with respect to the Taper-part : - //setting the z-position as endCapTaperL/2 puts the front face at z = 0 mm - //================================================================================= - G4double endCap_PosX = fChamberW/2. + fEndCapTaperL_GREAT/2. + 3.0*mm; - G4double vacuum_PosZ = fVacuumPosZ_GREAT; - G4double geLeaf_PosZ = fGeLeafPosZ_GREAT; - - - G4RotationMatrix rm ; - G4double theta = 90. * deg; - G4double phi = 0. * deg; - - - //for(G4int det = prevNumber; det < numberOfClovers; det++) { - for(G4int det = 0; det < 2; det++) { - logicEndCap_CloverLR[det] = new G4LogicalVolume(solidEndCap_GREAT, endCapMaterial, "clover_EC", 0, 0, 0); - logicVacuum_CloverLR[det] = new G4LogicalVolume(solidVacuum_GREAT, vacuumMaterial, "clover_Vac", 0, 0, 0); - + //------------------------------------------------------------------ + void Chamber::Place_GREAT_On_the_Top(G4LogicalVolume* world) + { + //================================================================================= + // The positioning for boolean solids is odd : for this det it is with respect to the Taper-part : + //setting the z-position as endCapTaperL/2 puts the front face at z = 0 mm + //================================================================================= + G4double endCap_PosX = fChamberH/2. - fShiftChamberY + fEndCapTaperL_GREAT/2. + fGeTopGap; + G4double vacuum_PosZ = fVacuumPosZ_GREAT; + G4double geLeaf_PosZ = fGeLeafPosZ_GREAT; + + + G4RotationMatrix rm ; + G4double theta = 90. * deg; + G4double phi = 0. * deg; + + + logicEndCap_CloverT = new G4LogicalVolume(solidEndCap_GREAT, endCapMaterial, "clover_EC", 0, 0, 0); + logicVacuum_CloverT = new G4LogicalVolume(solidVacuum_GREAT, vacuumMaterial, "clover_Vac", 0, 0, 0); + for(G4int l = 0; l < 4; l++) { - logicGeLeaf_CloverLR[det][l] = new G4LogicalVolume(solidGeLeaf_GREAT, geMaterial, "clover_Leaf", 0, 0, 0); - logicPassivated_CloverLR[det][l] = new G4LogicalVolume(solidPassivated_GREAT, geMaterial, "passivatedGe", 0, 0, 0); //should be Ge - logicContact_CloverLR[det][l] = new G4LogicalVolume(solidContact_GREAT, contactMaterial, "inner_contact", 0, 0, 0); //should be Li - logicBoreHole_CloverLR[det][l] = new G4LogicalVolume(solidBoreHole_GREAT, vacuumMaterial, "bore-hole", 0, 0, 0); + logicGeLeaf_CloverT[l] = new G4LogicalVolume(solidGeLeaf_GREAT, geMaterial, "clover_Leaf", 0, 0, 0); + logicPassivated_CloverT[l] = new G4LogicalVolume(solidPassivated_GREAT, geMaterial, "passivatedGe", 0, 0, 0); + logicContact_CloverT[l] = new G4LogicalVolume(solidContact_GREAT, contactMaterial, "inner_contact", 0, 0, 0); + logicBoreHole_CloverT[l] = new G4LogicalVolume(solidBoreHole_GREAT, vacuumMaterial, "bore_hole", 0, 0, 0); } - - //rotation for each clover..... + //rotate rm.set(0,0,0); - phi = 180.0 * deg * det; + phi = 90.0 * deg; rm.rotateY(theta); rm.rotateX(phi); rm.invert(); - - //traslate position: the centre of the DSSD has been placed @ Y = 0.0*mm + + //traslate position G4ThreeVector translation(-endCap_PosX*sin(theta)*cos(phi), - endCap_PosX*sin(theta)*sin(phi) + 0.0*mm, //fDSSD_PosY, - 0.0*mm); - - G4cout << "Clover " << det << " x " << -endCap_PosX*sin(theta)*cos(phi) << G4endl; + endCap_PosX*sin(theta)*sin(phi), + geTopPosition +fCorrection); + + G4cout << "Top Clover " << " x " << -endCap_PosX*sin(theta)*cos(phi) << G4endl; //Physical placement of these solids...... - //physiEndCap_CloverLR[det] = new G4PVPlacement(G4Transform3D(rm, translation), + //physiEndCap_CloverT = new G4PVPlacement(G4Transform3D(rm, translation), PVPBuffer = new G4PVPlacement(G4Transform3D(rm, translation), - logicEndCap_CloverLR[det],//its logical volume - "Clover_EC", //its name - world, //its mother - true, //no boolean operat - det*4, //copy number - true); //overlap check - - //physiVacuum_CloverLR[det] = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm,vacuum_PosZ), - logicVacuum_CloverLR[det], //its logical volume - "Clover_Vac", //its name - logicEndCap_CloverLR[det], //its mother - true, //no boolean operat - det*4, //copy number - true); //overlap check - } - - //Now for the placement of the leaves in each clover...... - G4RotationMatrix* rmC; - G4double dPos = fGeLeaf_dX_GREAT + fGapBetweenLeaves_GREAT/2.; - G4double leafX; - G4double leafY; - //G4double leafZ; - - //Keep track of which detectors are used - //G4String detName[2] = {"CloverR","CloverL"}; //Looking upstream - - for(G4int l = 0; l < 4; l++) { - //the rotation - rmC = new G4RotationMatrix; - rmC->set(0,0,0); - rmC->rotateZ(90.*degree*(4-l)); - rmC->invert(); - //the x-translation - if(l < 2) { - leafX = dPos; - } else { - leafX = -dPos; + logicEndCap_CloverT,//its logical volume + "Clover_EC", //its name + world, //its mother + true, //no boolean operat + 8, //copy number + true); //overlap check + + //physiVacuum_CloverT = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.*mm,0.*mm,vacuum_PosZ), + logicVacuum_CloverT, //its logical volume + "Clover_Vac", //its name + logicEndCap_CloverT, //its mother + true, //no boolean operat + 8, //copy number + true); //overlap check + + //Now for the placement of the leaves in each clover...... + G4RotationMatrix* rmC; + G4double dPos = fGeLeaf_dX_GREAT + fGapBetweenLeaves_GREAT/2.; + G4double leafX; + G4double leafY; + G4double leafZ; + + for(G4int l = 0; l < 4; l++) { + //the rotation + rmC = new G4RotationMatrix; + rmC->set(0,0,0); + rmC->rotateZ(90.*degree*(4-l)); + rmC->invert(); + //the x-translation + if(l < 2) { + leafX = dPos; + } else { + leafX = -dPos; + } + //the y-translation + if(l == 0 || l == 3 ) { + leafY = dPos; + } else { + leafY = -dPos; + } + //the z-translation + leafZ = geLeaf_PosZ; + + + //physiGeLeaf_CloverT[l] = new G4PVPlacement(rmC, //rotation + PVPBuffer = new G4PVPlacement(rmC, //rotation + G4ThreeVector(leafX, leafY, leafZ), + logicGeLeaf_CloverT[l], //its logical volume + "Clover", //its name + logicVacuum_CloverT, //its mother + true, //no boolean operat + 8+l, //copy number + true); //overlap check + + //physiPassivated_CloverT[l] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(fHole_dX_GREAT, fHole_dY_GREAT, fContact_dZ_GREAT), + logicPassivated_CloverT[l], + "GePassivated", + logicGeLeaf_CloverT[l], + false,8+l,true); + + //physiContact_CloverT[l] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_GREAT), + logicContact_CloverT[l], + "LiContact", + logicPassivated_CloverT[l], + false,8+l,true); + + //physiBoreHole_CloverT[l] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.*mm,0.*mm, 0.0*mm), + logicBoreHole_CloverT[l], + "BoreHole", + logicContact_CloverT[l], + false,8+l,true); + } - //the y-translation - if(l == 0 || l == 3 ) { - leafY = dPos; - } else { - leafY = -dPos; + + //define the visual attributes + G4VisAttributes* visAttAlCap = new G4VisAttributes( G4Colour(0.9,0.9,0.9) ); + visAttAlCap->SetVisibility(true); + //visAttAlCap->SetVisibility(false); + visAttAlCap->SetForceWireframe(true); + + G4VisAttributes* visAttGeVac = new G4VisAttributes( G4Colour(0.9,1.0,0.9) ); + visAttGeVac->SetVisibility(true); + //visAttGeVac->SetVisibility(false); + visAttGeVac->SetForceWireframe(true); + + G4VisAttributes* visAttActive = new G4VisAttributes( G4Colour(1.0,1.0,0.0) ); + visAttActive->SetVisibility(true); + //visAttActive->SetVisibility(false); + visAttActive->SetForceWireframe(true); + + G4VisAttributes* visAttPassive = new G4VisAttributes(G4Colour(0.0,1.0,1.0) ); + visAttPassive->SetVisibility(true); + //visAttPassive->SetVisibility(false); + visAttPassive->SetForceWireframe(true); + + G4VisAttributes* visAttLiContact = new G4VisAttributes(G4Colour(1.0,0.0,1.0) ); + visAttLiContact->SetVisibility(true); + //visAttLiContact->SetVisibility(false); + + G4VisAttributes* visAttHole = new G4VisAttributes( G4Colour(0.0,0.0,1.0) ); + visAttHole->SetVisibility(true); + //visAttHole->SetVisibility(false); + + logicEndCap_CloverT->SetVisAttributes(visAttAlCap); + logicVacuum_CloverT->SetVisAttributes(visAttGeVac); + for(G4int l = 0; l < 4; l++) { + logicGeLeaf_CloverT[l]->SetVisAttributes(visAttActive); + logicPassivated_CloverT[l]->SetVisAttributes(visAttPassive); + logicContact_CloverT[l]->SetVisAttributes(visAttLiContact); + logicBoreHole_CloverT[l]->SetVisAttributes(visAttHole); } - //the z-translation - //leafZ = geLeaf_PosZ; - - + } + + //------------------------------------------------------------------ + // Clover numbering scheme : + // Left = 0 => Crystals 0, 1, 2, 3 + // Right = 4 => Crystals 4, 5, 6, 7 + // Top = 8 => Crystals 8, 9,10,11 + // Upstream = 12 => Crystals 12,13,14,15 + //------------------------------------------------------------------ + //------------------------------------------------------------------ + void Chamber::Place_GREAT_Left_and_Right(G4LogicalVolume* world) + { + //================================================================================= + // The positioning for boolean solids is odd : for this det it is with respect to the Taper-part : + //setting the z-position as endCapTaperL/2 puts the front face at z = 0 mm + //================================================================================= + G4double endCap_PosX = fChamberW/2. + fEndCapTaperL_GREAT/2. + 3.0*mm; + G4double vacuum_PosZ = fVacuumPosZ_GREAT; + G4double geLeaf_PosZ = fGeLeafPosZ_GREAT; + + + G4RotationMatrix rm ; + G4double theta = 90. * deg; + G4double phi = 0. * deg; + + //for(G4int det = prevNumber; det < numberOfClovers; det++) { for(G4int det = 0; det < 2; det++) { - //physiGeLeaf_CloverLR[det][l] = new G4PVPlacement(rmC, //rotation - PVPBuffer = new G4PVPlacement(rmC, //rotation - G4ThreeVector(leafX,leafY,geLeaf_PosZ), - logicGeLeaf_CloverLR[det][l], //its logical volume - "Clover",//detName[det].data(), //its name - logicVacuum_CloverLR[det], //its mother - true, //no boolean operat - det*4+l, //copy number - true); //overlap check + logicEndCap_CloverLR[det] = new G4LogicalVolume(solidEndCap_GREAT, endCapMaterial, "clover_EC", 0, 0, 0); + logicVacuum_CloverLR[det] = new G4LogicalVolume(solidVacuum_GREAT, vacuumMaterial, "clover_Vac", 0, 0, 0); + + for(G4int l = 0; l < 4; l++) { + logicGeLeaf_CloverLR[det][l] = new G4LogicalVolume(solidGeLeaf_GREAT, geMaterial, "clover_Leaf", 0, 0, 0); + logicPassivated_CloverLR[det][l] = new G4LogicalVolume(solidPassivated_GREAT, geMaterial, "passivatedGe", 0, 0, 0); //should be Ge + logicContact_CloverLR[det][l] = new G4LogicalVolume(solidContact_GREAT, contactMaterial, "inner_contact", 0, 0, 0); //should be Li + logicBoreHole_CloverLR[det][l] = new G4LogicalVolume(solidBoreHole_GREAT, vacuumMaterial, "bore-hole", 0, 0, 0); + } - //physiPassivated_CloverLR[det][l] = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(-fHole_dX_PhaseII, -fHole_dY_PhaseII, fContact_dZ_GREAT), - logicPassivated_CloverLR[det][l], - "GePassivated", - logicGeLeaf_CloverLR[det][l], - false,det*4+l,true); - - //physiContact_CloverLR[det][l] = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_GREAT), - logicContact_CloverLR[det][l], - "LiContact", - logicPassivated_CloverLR[det][l], - false,det*4+l,true); - - //physiBoreHole_CloverLR[det][l] = new G4PVPlacement(0, //rotation + + //rotation for each clover..... + rm.set(0,0,0); + phi = 180.0 * deg * det; + rm.rotateY(theta); + rm.rotateX(phi); + rm.invert(); + + //traslate position: the centre of the DSSD has been placed @ Y = 0.0*mm + G4ThreeVector translation(-endCap_PosX*sin(theta)*cos(phi), + endCap_PosX*sin(theta)*sin(phi) + 0.0*mm, //fDSSD_PosY, + 0.0*mm); + + G4cout << "Clover " << det << " x " << -endCap_PosX*sin(theta)*cos(phi) << G4endl; + + //Physical placement of these solids...... + //physiEndCap_CloverLR[det] = new G4PVPlacement(G4Transform3D(rm, translation), + PVPBuffer = new G4PVPlacement(G4Transform3D(rm, translation), + logicEndCap_CloverLR[det],//its logical volume + "Clover_EC", //its name + world, //its mother + true, //no boolean operat + det*4, //copy number + true); //overlap check + + //physiVacuum_CloverLR[det] = new G4PVPlacement(0, //rotation PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_GREAT), - logicBoreHole_CloverLR[det][l], - "BoreHole", - logicContact_CloverLR[det][l], - false,det*4+l,true); - + G4ThreeVector(0.*mm,0.*mm,vacuum_PosZ), + logicVacuum_CloverLR[det], //its logical volume + "Clover_Vac", //its name + logicEndCap_CloverLR[det], //its mother + true, //no boolean operat + det*4, //copy number + true); //overlap check } - } - //define the visual attributes - G4VisAttributes* visAttAlCap = new G4VisAttributes( G4Colour(0.9,0.9,0.9) ); - visAttAlCap->SetVisibility(true); - visAttAlCap->SetForceWireframe(true); - - G4VisAttributes* visAttGeVac = new G4VisAttributes( G4Colour(0.9,1.0,0.9) ); - visAttGeVac->SetForceWireframe(true); - visAttGeVac->SetVisibility(true); - - G4VisAttributes* visAttActive = new G4VisAttributes( G4Colour(1.0,1.0,0.0) ); - visAttActive->SetForceWireframe(true); - visAttActive->SetVisibility(true); - - G4VisAttributes* visAttPassive = new G4VisAttributes(G4Colour(0.0,1.0,1.0) ); - visAttPassive->SetForceWireframe(true); - visAttPassive->SetVisibility(true); - - G4VisAttributes* visAttLiContact = new G4VisAttributes(G4Colour(1.0,0.0,1.0) ); - visAttLiContact->SetVisibility(true); - - G4VisAttributes* visAttHole = new G4VisAttributes( G4Colour(0.0,0.0,1.0) ); - visAttHole->SetVisibility(true); - - for(G4int det = 0; det < 2; det++) { - logicEndCap_CloverLR[det]->SetVisAttributes(visAttAlCap); - logicVacuum_CloverLR[det]->SetVisAttributes(visAttGeVac); + //Now for the placement of the leaves in each clover...... + G4RotationMatrix* rmC; + G4double dPos = fGeLeaf_dX_GREAT + fGapBetweenLeaves_GREAT/2.; + G4double leafX; + G4double leafY; + //G4double leafZ; + + //Keep track of which detectors are used + //G4String detName[2] = {"CloverR","CloverL"}; //Looking upstream + for(G4int l = 0; l < 4; l++) { - logicGeLeaf_CloverLR[det][l]->SetVisAttributes(visAttActive); - logicPassivated_CloverLR[det][l]->SetVisAttributes(visAttPassive); - logicContact_CloverLR[det][l]->SetVisAttributes(visAttLiContact); - logicBoreHole_CloverLR[det][l]->SetVisAttributes(visAttHole); + //the rotation + rmC = new G4RotationMatrix; + rmC->set(0,0,0); + rmC->rotateZ(90.*degree*(4-l)); + rmC->invert(); + //the x-translation + if(l < 2) { + leafX = dPos; + } else { + leafX = -dPos; + } + //the y-translation + if(l == 0 || l == 3 ) { + leafY = dPos; + } else { + leafY = -dPos; + } + //the z-translation + //leafZ = geLeaf_PosZ; + + + //for(G4int det = prevNumber; det < numberOfClovers; det++) { + for(G4int det = 0; det < 2; det++) { + //physiGeLeaf_CloverLR[det][l] = new G4PVPlacement(rmC, //rotation + PVPBuffer = new G4PVPlacement(rmC, //rotation + G4ThreeVector(leafX,leafY,geLeaf_PosZ), + logicGeLeaf_CloverLR[det][l], //its logical volume + "Clover",//detName[det].data(), //its name + logicVacuum_CloverLR[det], //its mother + true, //no boolean operat + det*4+l, //copy number + true); //overlap check + + //physiPassivated_CloverLR[det][l] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(-fHole_dX_PhaseII, -fHole_dY_PhaseII, fContact_dZ_GREAT), + logicPassivated_CloverLR[det][l], + "GePassivated", + logicGeLeaf_CloverLR[det][l], + false,det*4+l,true); + + //physiContact_CloverLR[det][l] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_GREAT), + logicContact_CloverLR[det][l], + "LiContact", + logicPassivated_CloverLR[det][l], + false,det*4+l,true); + + //physiBoreHole_CloverLR[det][l] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_GREAT), + logicBoreHole_CloverLR[det][l], + "BoreHole", + logicContact_CloverLR[det][l], + false,det*4+l,true); + + } } - } -} + //define the visual attributes + G4VisAttributes* visAttAlCap = new G4VisAttributes( G4Colour(0.9,0.9,0.9) ); + visAttAlCap->SetVisibility(true); + visAttAlCap->SetForceWireframe(true); + G4VisAttributes* visAttGeVac = new G4VisAttributes( G4Colour(0.9,1.0,0.9) ); + visAttGeVac->SetForceWireframe(true); + visAttGeVac->SetVisibility(true); -//------------------------------------------------------------------ -void Chamber::Place_PhaseII_LookingUpstream(G4LogicalVolume* world) -{ - //================================================================================= - // The positioning for boolean solids is odd : for this det it is with respect to the Taper-part : - //setting the z-position as endCapTaperL/2 puts the front face at z = 0 mm - //================================================================================= - G4double endCap_PosZ = fEndCapTaperL_PhaseII/2. + 3.0*mm; - G4double vacuum_PosZ = fVacuumPosZ_PhaseII; - G4double geLeaf_PosZ = fGeLeafPosZ_PhaseII; - - logicEndCap_CloverU = new G4LogicalVolume(solidEndCap_PhaseII, endCapMaterial, "clover_EC", 0, 0, 0); - logicVacuum_CloverU = new G4LogicalVolume(solidVacuum_PhaseII, vacuumMaterial, "clover_Vac", 0, 0, 0); - - for(G4int l = 0; l < 4; l++) { - logicGeLeaf_CloverU[l] = new G4LogicalVolume(solidGeLeaf_PhaseII, geMaterial, "clover_Leaf", 0, 0, 0); - logicPassivated_CloverU[l] = new G4LogicalVolume(solidPassivated_PhaseII, geMaterial, "passivatedGe", 0, 0, 0); - logicContact_CloverU[l] = new G4LogicalVolume(solidContact_PhaseII, contactMaterial, "inner_contact", 0, 0, 0); - logicBoreHole_CloverU[l] = new G4LogicalVolume(solidBoreHole_PhaseII, vacuumMaterial, "bore_hole", 0, 0, 0); - } + G4VisAttributes* visAttActive = new G4VisAttributes( G4Colour(1.0,1.0,0.0) ); + visAttActive->SetForceWireframe(true); + visAttActive->SetVisibility(true); - //Physical placement of these solids...... - //traslate position: the centre of the DSSD has been placed @ Y = 0.0*mm - //physiEndCap_CloverU = new G4PVPlacement(0, //no rotation - PVPBuffer = new G4PVPlacement(0, //no rotation - G4ThreeVector(0.*mm, 0.0*mm, endCap_PosZ), - logicEndCap_CloverU,//its logical volume - "Clover_EC", //its name - world, //its mother - true, //no boolean operat - 12, //copy number - true); //overlap check - - //physiVacuum_CloverU = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm,vacuum_PosZ), - logicVacuum_CloverU, //its logical volume - "Clover_Vac", //its name - logicEndCap_CloverU, //its mother - true, //no boolean operat - 12, //copy number - true); //overlap check + G4VisAttributes* visAttPassive = new G4VisAttributes(G4Colour(0.0,1.0,1.0) ); + visAttPassive->SetForceWireframe(true); + visAttPassive->SetVisibility(true); - //Now for the placement of the leaves in each clover...... - G4RotationMatrix* rmC; - G4double dPos = fGeLeaf_dX_PhaseII + fGapBetweenLeaves_PhaseII/2.; - G4double leafX; - G4double leafY; - G4double leafZ; - - for(G4int l = 0; l < 4; l++) { - //the rotation - rmC = new G4RotationMatrix; - rmC->set(0,0,0); - rmC->rotateZ(90.*degree*(4-l)); - rmC->invert(); - //the x-translation - if(l < 2) { - leafX = dPos; - } else { - leafX = -dPos; + G4VisAttributes* visAttLiContact = new G4VisAttributes(G4Colour(1.0,0.0,1.0) ); + visAttLiContact->SetVisibility(true); + + G4VisAttributes* visAttHole = new G4VisAttributes( G4Colour(0.0,0.0,1.0) ); + visAttHole->SetVisibility(true); + + for(G4int det = 0; det < 2; det++) { + logicEndCap_CloverLR[det]->SetVisAttributes(visAttAlCap); + logicVacuum_CloverLR[det]->SetVisAttributes(visAttGeVac); + for(G4int l = 0; l < 4; l++) { + logicGeLeaf_CloverLR[det][l]->SetVisAttributes(visAttActive); + logicPassivated_CloverLR[det][l]->SetVisAttributes(visAttPassive); + logicContact_CloverLR[det][l]->SetVisAttributes(visAttLiContact); + logicBoreHole_CloverLR[det][l]->SetVisAttributes(visAttHole); + } } - //the y-translation - if(l == 0 || l == 3 ) { - leafY = dPos; - } else { - leafY = -dPos; } - //the z-translation - leafZ = geLeaf_PosZ; - - - //physiGeLeaf_CloverU[l] = new G4PVPlacement(rmC, //rotation - PVPBuffer = new G4PVPlacement(rmC, //rotation - G4ThreeVector(leafX, leafY, leafZ), - logicGeLeaf_CloverU[l], //its logical volume - "Clover", //its name - logicVacuum_CloverU, //its mother - true, //no boolean operat - 12+l, //copy number - true); //overlap check - - //physiPassivated_CloverU[l] = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(-fHole_dX_PhaseII, -fHole_dY_PhaseII, fContact_dZ_PhaseII), - logicPassivated_CloverU[l], - "GePassivated", - logicGeLeaf_CloverU[l], - false,12+l,true); - - //physiContact_CloverU[l] = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_GREAT), - logicContact_CloverU[l], - "LiContact", - logicPassivated_CloverU[l], - false,12+l,true); - - //physiBoreHole_CloverU[l] = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm, 0.0*mm), - logicBoreHole_CloverU[l], - "BoreHole", - logicContact_CloverU[l], - false,12+l,true); - - } - //define the visual attributes - G4VisAttributes* visAttAlCap = new G4VisAttributes( G4Colour(0.9,0.9,0.9) ); - visAttAlCap->SetVisibility(true); - visAttAlCap->SetForceWireframe(true); - - G4VisAttributes* visAttGeVac = new G4VisAttributes( G4Colour(0.9,1.0,0.9) ); - visAttGeVac->SetForceWireframe(true); - visAttGeVac->SetVisibility(true); - - G4VisAttributes* visAttActive = new G4VisAttributes( G4Colour(1.0,1.0,0.0) ); - visAttActive->SetForceWireframe(true); - visAttActive->SetVisibility(true); - - G4VisAttributes* visAttPassive = new G4VisAttributes(G4Colour(0.0,1.0,1.0) ); - visAttPassive->SetForceWireframe(true); - visAttPassive->SetVisibility(true); - - G4VisAttributes* visAttLiContact = new G4VisAttributes(G4Colour(1.0,0.0,1.0) ); - visAttLiContact->SetVisibility(true); - - G4VisAttributes* visAttHole = new G4VisAttributes( G4Colour(0.0,0.0,1.0) ); - visAttHole->SetVisibility(true); - - logicEndCap_CloverU->SetVisAttributes(visAttAlCap); - logicVacuum_CloverU->SetVisAttributes(visAttGeVac); - for(G4int l = 0; l < 4; l++) { - logicGeLeaf_CloverU[l]->SetVisAttributes(visAttActive); - logicPassivated_CloverU[l]->SetVisAttributes(visAttPassive); - logicContact_CloverU[l]->SetVisAttributes(visAttLiContact); - logicBoreHole_CloverU[l]->SetVisAttributes(visAttHole); - } -} -//------------------------------------------------------------------ -// This is just as a comparison with the current position -//------------------------------------------------------------------ -void Chamber::Place_GREAT_LookingUpstream(G4LogicalVolume* world) -{ - //================================================================================= - // The positioning for boolean solids is odd : for this det it is with respect to the Taper-part : - //setting the z-position as endCapTaperL/2 puts the front face at z = 0 mm - //================================================================================= - G4double endCap_PosZ = fEndCapTaperL_GREAT/2. + 3.0*mm; - G4double vacuum_PosZ = fVacuumPosZ_GREAT; - G4double geLeaf_PosZ = fGeLeafPosZ_GREAT; - - logicEndCap_CloverU = new G4LogicalVolume(solidEndCap_GREAT, endCapMaterial, "clover_EC", 0, 0, 0); - logicVacuum_CloverU = new G4LogicalVolume(solidVacuum_GREAT, vacuumMaterial, "clover_Vac", 0, 0, 0); - - for(G4int l = 0; l < 4; l++) { - logicGeLeaf_CloverU[l] = new G4LogicalVolume(solidGeLeaf_GREAT, geMaterial, "clover_Leaf", 0, 0, 0); - logicPassivated_CloverU[l] = new G4LogicalVolume(solidPassivated_GREAT, geMaterial, "passivatedGe", 0, 0, 0); - logicContact_CloverU[l] = new G4LogicalVolume(solidContact_GREAT, contactMaterial, "inner_contact", 0, 0, 0); - logicBoreHole_CloverU[l] = new G4LogicalVolume(solidBoreHole_GREAT, vacuumMaterial, "bore_hole", 0, 0, 0); - } - //Physical placement of these solids...... - //traslate position: the centre of the DSSD has been placed @ Y = 0.0*mm - //physiEndCap_CloverU = new G4PVPlacement(0, //no rotation - PVPBuffer = new G4PVPlacement(0, //no rotation - G4ThreeVector(0.*mm, 0.0*mm, endCap_PosZ), - logicEndCap_CloverU,//its logical volume - "Clover_EC", //its name - world, //its mother - true, //no boolean operat - 12, //copy number - true); //overlap check - - //physiVacuum_CloverU = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm,vacuum_PosZ), - logicVacuum_CloverU, //its logical volume - "Clover_Vac", //its name - logicEndCap_CloverU, //its mother - true, //no boolean operat - 12, //copy number - true); //overlap check + //------------------------------------------------------------------ + void Chamber::Place_PhaseII_LookingUpstream(G4LogicalVolume* world) + { + //================================================================================= + // The positioning for boolean solids is odd : for this det it is with respect to the Taper-part : + //setting the z-position as endCapTaperL/2 puts the front face at z = 0 mm + //================================================================================= + G4double endCap_PosZ = fEndCapTaperL_PhaseII/2. + 3.0*mm; + G4double vacuum_PosZ = fVacuumPosZ_PhaseII; + G4double geLeaf_PosZ = fGeLeafPosZ_PhaseII; - //Now for the placement of the leaves in each clover...... - G4RotationMatrix* rmC; - G4double dPos = fGeLeaf_dX_GREAT + fGapBetweenLeaves_GREAT/2.; - G4double leafX; - G4double leafY; - G4double leafZ; - - for(G4int l = 0; l < 4; l++) { - //the rotation - rmC = new G4RotationMatrix; - rmC->set(0,0,0); - rmC->rotateZ(90.*degree*(4-l)); - rmC->invert(); - //the x-translation - if(l < 2) { - leafX = dPos; - } else { - leafX = -dPos; + logicEndCap_CloverU = new G4LogicalVolume(solidEndCap_PhaseII, endCapMaterial, "clover_EC", 0, 0, 0); + logicVacuum_CloverU = new G4LogicalVolume(solidVacuum_PhaseII, vacuumMaterial, "clover_Vac", 0, 0, 0); + + for(G4int l = 0; l < 4; l++) { + logicGeLeaf_CloverU[l] = new G4LogicalVolume(solidGeLeaf_PhaseII, geMaterial, "clover_Leaf", 0, 0, 0); + logicPassivated_CloverU[l] = new G4LogicalVolume(solidPassivated_PhaseII, geMaterial, "passivatedGe", 0, 0, 0); + logicContact_CloverU[l] = new G4LogicalVolume(solidContact_PhaseII, contactMaterial, "inner_contact", 0, 0, 0); + logicBoreHole_CloverU[l] = new G4LogicalVolume(solidBoreHole_PhaseII, vacuumMaterial, "bore_hole", 0, 0, 0); + } + + //Physical placement of these solids...... + //traslate position: the centre of the DSSD has been placed @ Y = 0.0*mm + //physiEndCap_CloverU = new G4PVPlacement(0, //no rotation + PVPBuffer = new G4PVPlacement(0, //no rotation + G4ThreeVector(0.*mm, 0.0*mm, endCap_PosZ), + logicEndCap_CloverU,//its logical volume + "Clover_EC", //its name + world, //its mother + true, //no boolean operat + 12, //copy number + true); //overlap check + + //physiVacuum_CloverU = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.*mm,0.*mm,vacuum_PosZ), + logicVacuum_CloverU, //its logical volume + "Clover_Vac", //its name + logicEndCap_CloverU, //its mother + true, //no boolean operat + 12, //copy number + true); //overlap check + + //Now for the placement of the leaves in each clover...... + G4RotationMatrix* rmC; + G4double dPos = fGeLeaf_dX_PhaseII + fGapBetweenLeaves_PhaseII/2.; + G4double leafX; + G4double leafY; + G4double leafZ; + + for(G4int l = 0; l < 4; l++) { + //the rotation + rmC = new G4RotationMatrix; + rmC->set(0,0,0); + rmC->rotateZ(90.*degree*(4-l)); + rmC->invert(); + //the x-translation + if(l < 2) { + leafX = dPos; + } else { + leafX = -dPos; + } + //the y-translation + if(l == 0 || l == 3 ) { + leafY = dPos; + } else { + leafY = -dPos; + } + //the z-translation + leafZ = geLeaf_PosZ; + + + //physiGeLeaf_CloverU[l] = new G4PVPlacement(rmC, //rotation + PVPBuffer = new G4PVPlacement(rmC, //rotation + G4ThreeVector(leafX, leafY, leafZ), + logicGeLeaf_CloverU[l], //its logical volume + "Clover", //its name + logicVacuum_CloverU, //its mother + true, //no boolean operat + 12+l, //copy number + true); //overlap check + + //physiPassivated_CloverU[l] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(-fHole_dX_PhaseII, -fHole_dY_PhaseII, fContact_dZ_PhaseII), + logicPassivated_CloverU[l], + "GePassivated", + logicGeLeaf_CloverU[l], + false,12+l,true); + + //physiContact_CloverU[l] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_GREAT), + logicContact_CloverU[l], + "LiContact", + logicPassivated_CloverU[l], + false,12+l,true); + + //physiBoreHole_CloverU[l] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.*mm,0.*mm, 0.0*mm), + logicBoreHole_CloverU[l], + "BoreHole", + logicContact_CloverU[l], + false,12+l,true); + + } + + //define the visual attributes + G4VisAttributes* visAttAlCap = new G4VisAttributes( G4Colour(0.9,0.9,0.9) ); + visAttAlCap->SetVisibility(true); + visAttAlCap->SetForceWireframe(true); + + G4VisAttributes* visAttGeVac = new G4VisAttributes( G4Colour(0.9,1.0,0.9) ); + visAttGeVac->SetForceWireframe(true); + visAttGeVac->SetVisibility(true); + + G4VisAttributes* visAttActive = new G4VisAttributes( G4Colour(1.0,1.0,0.0) ); + visAttActive->SetForceWireframe(true); + visAttActive->SetVisibility(true); + + G4VisAttributes* visAttPassive = new G4VisAttributes(G4Colour(0.0,1.0,1.0) ); + visAttPassive->SetForceWireframe(true); + visAttPassive->SetVisibility(true); + + G4VisAttributes* visAttLiContact = new G4VisAttributes(G4Colour(1.0,0.0,1.0) ); + visAttLiContact->SetVisibility(true); + + G4VisAttributes* visAttHole = new G4VisAttributes( G4Colour(0.0,0.0,1.0) ); + visAttHole->SetVisibility(true); + + logicEndCap_CloverU->SetVisAttributes(visAttAlCap); + logicVacuum_CloverU->SetVisAttributes(visAttGeVac); + for(G4int l = 0; l < 4; l++) { + logicGeLeaf_CloverU[l]->SetVisAttributes(visAttActive); + logicPassivated_CloverU[l]->SetVisAttributes(visAttPassive); + logicContact_CloverU[l]->SetVisAttributes(visAttLiContact); + logicBoreHole_CloverU[l]->SetVisAttributes(visAttHole); + } } - //the y-translation - if(l == 0 || l == 3 ) { - leafY = dPos; - } else { - leafY = -dPos; + + //------------------------------------------------------------------ + // This is just as a comparison with the current position + //------------------------------------------------------------------ + void Chamber::Place_GREAT_LookingUpstream(G4LogicalVolume* world) + { + //================================================================================= + // The positioning for boolean solids is odd : for this det it is with respect to the Taper-part : + //setting the z-position as endCapTaperL/2 puts the front face at z = 0 mm + //================================================================================= + G4double endCap_PosZ = fEndCapTaperL_GREAT/2. + 3.0*mm; + G4double vacuum_PosZ = fVacuumPosZ_GREAT; + G4double geLeaf_PosZ = fGeLeafPosZ_GREAT; + + logicEndCap_CloverU = new G4LogicalVolume(solidEndCap_GREAT, endCapMaterial, "clover_EC", 0, 0, 0); + logicVacuum_CloverU = new G4LogicalVolume(solidVacuum_GREAT, vacuumMaterial, "clover_Vac", 0, 0, 0); + + for(G4int l = 0; l < 4; l++) { + logicGeLeaf_CloverU[l] = new G4LogicalVolume(solidGeLeaf_GREAT, geMaterial, "clover_Leaf", 0, 0, 0); + logicPassivated_CloverU[l] = new G4LogicalVolume(solidPassivated_GREAT, geMaterial, "passivatedGe", 0, 0, 0); + logicContact_CloverU[l] = new G4LogicalVolume(solidContact_GREAT, contactMaterial, "inner_contact", 0, 0, 0); + logicBoreHole_CloverU[l] = new G4LogicalVolume(solidBoreHole_GREAT, vacuumMaterial, "bore_hole", 0, 0, 0); + } + + //Physical placement of these solids...... + //traslate position: the centre of the DSSD has been placed @ Y = 0.0*mm + //physiEndCap_CloverU = new G4PVPlacement(0, //no rotation + PVPBuffer = new G4PVPlacement(0, //no rotation + G4ThreeVector(0.*mm, 0.0*mm, endCap_PosZ), + logicEndCap_CloverU,//its logical volume + "Clover_EC", //its name + world, //its mother + true, //no boolean operat + 12, //copy number + true); //overlap check + + //physiVacuum_CloverU = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.*mm,0.*mm,vacuum_PosZ), + logicVacuum_CloverU, //its logical volume + "Clover_Vac", //its name + logicEndCap_CloverU, //its mother + true, //no boolean operat + 12, //copy number + true); //overlap check + + //Now for the placement of the leaves in each clover...... + G4RotationMatrix* rmC; + G4double dPos = fGeLeaf_dX_GREAT + fGapBetweenLeaves_GREAT/2.; + G4double leafX; + G4double leafY; + G4double leafZ; + + for(G4int l = 0; l < 4; l++) { + //the rotation + rmC = new G4RotationMatrix; + rmC->set(0,0,0); + rmC->rotateZ(90.*degree*(4-l)); + rmC->invert(); + //the x-translation + if(l < 2) { + leafX = dPos; + } else { + leafX = -dPos; + } + //the y-translation + if(l == 0 || l == 3 ) { + leafY = dPos; + } else { + leafY = -dPos; + } + //the z-translation + leafZ = geLeaf_PosZ; + + + //physiGeLeaf_CloverU[l] = new G4PVPlacement(rmC, //rotation + PVPBuffer = new G4PVPlacement(rmC, //rotation + G4ThreeVector(leafX, leafY, leafZ), + logicGeLeaf_CloverU[l], //its logical volume + "Clover", //its name + logicVacuum_CloverU, //its mother + true, //no boolean operat + 12+l, //copy number + true); //overlap check + + //physiPassivated_CloverU[l] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(fHole_dX_GREAT, fHole_dY_GREAT, fContact_dZ_GREAT), + logicPassivated_CloverU[l], + "GePassivated", + logicGeLeaf_CloverU[l], + false,12+l,true); + + //physiContact_CloverU[l] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_GREAT), + logicContact_CloverU[l], + "LiContact", + logicPassivated_CloverU[l], + false,12+l,true); + + //physiBoreHole_CloverU[l] = new G4PVPlacement(0, //rotation + PVPBuffer = new G4PVPlacement(0, //rotation + G4ThreeVector(0.*mm,0.*mm, 0.0*mm), + logicBoreHole_CloverU[l], + "BoreHole", + logicContact_CloverU[l], + false,12+l,true); + + } + + //define the visual attributes + G4VisAttributes* visAttAlCap = new G4VisAttributes( G4Colour(0.9,0.9,0.9) ); + visAttAlCap->SetVisibility(true); + visAttAlCap->SetForceWireframe(true); + + G4VisAttributes* visAttGeVac = new G4VisAttributes( G4Colour(0.9,1.0,0.9) ); + visAttGeVac->SetForceWireframe(true); + visAttGeVac->SetVisibility(true); + + G4VisAttributes* visAttActive = new G4VisAttributes( G4Colour(1.0,1.0,0.0) ); + visAttActive->SetForceWireframe(true); + visAttActive->SetVisibility(true); + + G4VisAttributes* visAttPassive = new G4VisAttributes(G4Colour(0.0,1.0,1.0) ); + visAttPassive->SetForceWireframe(true); + visAttPassive->SetVisibility(true); + + G4VisAttributes* visAttLiContact = new G4VisAttributes(G4Colour(1.0,0.0,1.0) ); + visAttLiContact->SetVisibility(true); + + G4VisAttributes* visAttHole = new G4VisAttributes( G4Colour(0.0,0.0,1.0) ); + visAttHole->SetVisibility(true); + + logicEndCap_CloverU->SetVisAttributes(visAttAlCap); + logicVacuum_CloverU->SetVisAttributes(visAttGeVac); + for(G4int l = 0; l < 4; l++) { + logicGeLeaf_CloverU[l]->SetVisAttributes(visAttActive); + logicPassivated_CloverU[l]->SetVisAttributes(visAttPassive); + logicContact_CloverU[l]->SetVisAttributes(visAttLiContact); + logicBoreHole_CloverU[l]->SetVisAttributes(visAttHole); + } } - //the z-translation - leafZ = geLeaf_PosZ; - - - //physiGeLeaf_CloverU[l] = new G4PVPlacement(rmC, //rotation - PVPBuffer = new G4PVPlacement(rmC, //rotation - G4ThreeVector(leafX, leafY, leafZ), - logicGeLeaf_CloverU[l], //its logical volume - "Clover", //its name - logicVacuum_CloverU, //its mother - true, //no boolean operat - 12+l, //copy number - true); //overlap check - - //physiPassivated_CloverU[l] = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(fHole_dX_GREAT, fHole_dY_GREAT, fContact_dZ_GREAT), - logicPassivated_CloverU[l], - "GePassivated", - logicGeLeaf_CloverU[l], - false,12+l,true); - - //physiContact_CloverU[l] = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm, 0.0*mm),//-fContact_dZ_GREAT), - logicContact_CloverU[l], - "LiContact", - logicPassivated_CloverU[l], - false,12+l,true); - - //physiBoreHole_CloverU[l] = new G4PVPlacement(0, //rotation - PVPBuffer = new G4PVPlacement(0, //rotation - G4ThreeVector(0.*mm,0.*mm, 0.0*mm), - logicBoreHole_CloverU[l], - "BoreHole", - logicContact_CloverU[l], - false,12+l,true); - - } - //define the visual attributes - G4VisAttributes* visAttAlCap = new G4VisAttributes( G4Colour(0.9,0.9,0.9) ); - visAttAlCap->SetVisibility(true); - visAttAlCap->SetForceWireframe(true); - - G4VisAttributes* visAttGeVac = new G4VisAttributes( G4Colour(0.9,1.0,0.9) ); - visAttGeVac->SetForceWireframe(true); - visAttGeVac->SetVisibility(true); - - G4VisAttributes* visAttActive = new G4VisAttributes( G4Colour(1.0,1.0,0.0) ); - visAttActive->SetForceWireframe(true); - visAttActive->SetVisibility(true); - - G4VisAttributes* visAttPassive = new G4VisAttributes(G4Colour(0.0,1.0,1.0) ); - visAttPassive->SetForceWireframe(true); - visAttPassive->SetVisibility(true); - - G4VisAttributes* visAttLiContact = new G4VisAttributes(G4Colour(1.0,0.0,1.0) ); - visAttLiContact->SetVisibility(true); - - G4VisAttributes* visAttHole = new G4VisAttributes( G4Colour(0.0,0.0,1.0) ); - visAttHole->SetVisibility(true); - - logicEndCap_CloverU->SetVisAttributes(visAttAlCap); - logicVacuum_CloverU->SetVisAttributes(visAttGeVac); - for(G4int l = 0; l < 4; l++) { - logicGeLeaf_CloverU[l]->SetVisAttributes(visAttActive); - logicPassivated_CloverU[l]->SetVisAttributes(visAttPassive); - logicContact_CloverU[l]->SetVisAttributes(visAttLiContact); - logicBoreHole_CloverU[l]->SetVisAttributes(visAttHole); - } -} + //--------------------------------------------------------------------- + // Create the solids defining Phase-II Clovers + //--------------------------------------------------------------------- + void Chamber::CreateCloverIISolids() + { + //An approximate CloverII + G4cout << G4endl << "Constructing archetypal PhaseII Clover" << G4endl; + + //--------------------------------------------------------- + //end-cap + G4double endCapFrontThickness = 1.2*mm; //was 1.5 + G4double endCapTaperThickness = 1.5*mm; + G4double endCapSideThickness = 1.5*mm; + + G4double GeGap = fEndCap2Ge_PhaseII; + G4double taperAngle = 7.0*degree; + + G4double endCapTotalL = fTotalGeL_PhaseII + GeGap + endCapFrontThickness + 5.*mm; //+ Gap at rear end + G4double endCapFrontD = 43.5*mm; + G4double endCapBackD = 50.5*mm; + G4double endCapTaperL = 55.0*mm; + + G4double endCapBoxL = endCapTotalL - endCapTaperL; + + //the tapered part + G4Trap* solidTaperedCloverEC + = new G4Trap("taperedCloverEC", + endCapTaperL/2., //Half z-length [pDz] + 0.00*degree, //Polar angle of line joining centres of the faces @ -/+pDz + 14.0*degree, //aequivalent zimuthal angle + endCapFrontD, //pDy1 half y length at -pDz + endCapFrontD, //pDx1 half x length at -pDz, -pDy1 + endCapFrontD, //pDx2 half x length at -pDz, +pDy1 + 0.00*degree,//pAlpha1 wrt y-axis from the centre of the side (lower endcap) + endCapBackD, //pDy2 half y length at +pDz + endCapBackD, //pDx3 half x length at +pDz, -pDy2 + endCapBackD, //pDx4 half x length at +pDz, +pDy2 + 0.00*degree); //pAlpha2 wrt y-axis from the centre of the side (upper endcap) + + //the rectangular part..... + G4Box* endCapBox = new G4Box("endCapBox",endCapBackD,endCapBackD,endCapBoxL/2.); + G4ThreeVector transECBox( 0.*mm, 0.*mm, endCapTaperL/2.+endCapBoxL/2.); + + //add the two together + solidEndCap_PhaseII = new G4UnionSolid("Box+Taper",solidTaperedCloverEC,endCapBox,0,transECBox); + //need the taperL for placement + fEndCapTaperL_PhaseII = endCapTaperL; + + + //--------------------------------------------------------- + //end-cap inner vacuum + G4double endCapDelta_1 = endCapTaperThickness/cos(taperAngle) - endCapFrontThickness*tan(taperAngle); + G4double endCapDelta_2 = ( endCapSideThickness - (endCapTaperThickness*sin(taperAngle)*tan(taperAngle) + + endCapTaperThickness*cos(taperAngle) ) )/tan(taperAngle); + + G4cout << endCapDelta_1 << " " << endCapDelta_2 << endl; + + G4double endCapVacTaperL = endCapTaperL - endCapFrontThickness;// - endCapDelta_2; + G4double endCapVacBoxL = endCapBoxL - endCapFrontThickness; + G4double endCapVacTotalL = endCapVacBoxL + endCapVacTaperL; + G4double endCapVacFrontD = endCapFrontD - endCapDelta_1; + G4double endCapVacBackD = endCapBackD - endCapSideThickness; + + //position of vacuum wrt end-cap + fVacuumPosZ_PhaseII = (-endCapTotalL + endCapVacTotalL )/2. + 1.5*endCapFrontThickness; + + //tapered part... + G4Trap* solidTaperVac + = new G4Trap("cloverTaperVac", + endCapVacTaperL/2., //Half z-length [pDz] + 0.00*degree, //Polar angle of line joining centres of the faces @ -/+pDz + 14.0*degree, //aequivalent zimuthal angle + endCapVacFrontD, //pDy1 half y length at -pDz + endCapVacFrontD, //pDx1 half x length at -pDz, -pDy1 + endCapVacFrontD, //pDx2 half x length at -pDz, +pDy1 + 0.00*degree,//pAlpha1 wrt y-axis from the centre of the side (lower endcap) + endCapVacBackD, //pDy2 half y length at +pDz + endCapVacBackD, //pDx3 half x length at +pDz, -pDy2 + endCapVacBackD, //pDx4 half x length at +pDz, +pDy2 + 0.00*degree); //pAlpha2 wrt y-axis from the centre of the side (upper endcap) + + G4cout << endCapTotalL << " " << endCapVacTotalL << endl; + + //rectangular part + G4Box* endCapVacBox = new G4Box("endCapBox",endCapVacBackD,endCapVacBackD,endCapVacBoxL/2.); + G4ThreeVector transVacBox( 0.*mm, 0.*mm, (endCapVacTaperL/2.+endCapVacBoxL/2.-0.0001*mm)); + + //add them together + solidVacuum_PhaseII = new G4UnionSolid("Vac_Box+Taper",solidTaperVac,endCapVacBox,0,transVacBox); + + + //--------------------------------------------------------- + //The Ge crystal... + G4double GeTaperL = 36.0*mm; + G4double GeTotalL = fTotalGeL_PhaseII; //70.0 * mm; + G4double smallSquare = 41.0*mm; + G4double largeSquare = 45.5*mm; + + G4double transX = (largeSquare-smallSquare)/2.; + G4double transY = (largeSquare-smallSquare)/2.; + fHole_dX_PhaseII = transX; //transX /= 2.; + fHole_dY_PhaseII = transY; //transY /= 2.; + + //tapered part...... + G4Trap* solidTaper + = new G4Trap("cloverTaper", + GeTaperL/2., //Half ? z-length [pDz] + 5.05*degree, //Polar angle of line joining centres of the faces @ -/+pDz + 45.*degree, //equivalent azimuthal angle //DOES NOT MAKE SENSE !! + smallSquare/2., //pDy1 half y length at -pDz + smallSquare/2., //pDx1 half x length at -pDz, -pDy1 + smallSquare/2., //pDx2 half x length at -pDz, +pDy1 + 0.00*degree,//pAlpha1 wrt y-axis from the centre of the side (lower endcap) + largeSquare/2., //pDy2 half y length at +pDz + largeSquare/2., //pDx3 half x length at +pDz, -pDy2 + largeSquare/2., //pDx4 half x length at +pDz, +pDy2 + 0.0*degree); //pAlpha2 wrt y-axis from the centre of the side (upper endcap) + + //HERE !! + const G4int numZPlanesGe=4; // no. polycone planes + + G4double zPlaneGe[numZPlanesGe]; // positions of planes + zPlaneGe[0] = 0.00*mm; + zPlaneGe[1] = 2.06*mm; + zPlaneGe[2] = 5.00*mm; + zPlaneGe[3] = GeTaperL; + + G4double rInnerGe[numZPlanesGe]; // interior radii + rInnerGe[0] = rInnerGe[1] = rInnerGe[2] = rInnerGe[3] = 0.0*mm; + G4double rOuterGe[numZPlanesGe]; // exterior radii + rOuterGe[0] = 20.5*mm; rOuterGe[1] = 23.54*mm; + rOuterGe[2] = rOuterGe[3] = fCrystalR_PhaseII; + + + G4Polycone* solidCone = new G4Polycone("cloverCone", 0.0*degree, 360.0*degree, + numZPlanesGe, + zPlaneGe, + rInnerGe, + rOuterGe); + + G4ThreeVector transGeCone( -transX/2., -transY/2., -GeTaperL/2.); + G4IntersectionSolid* taperedCone = new G4IntersectionSolid("Taper+Cone",solidTaper,solidCone,0,transGeCone); + + //back part.... + G4double geBoxL = fTotalGeL_PhaseII - GeTaperL; + + G4Box* GeBox = new G4Box("GeBox",largeSquare/2.,largeSquare/2.,geBoxL/2.); + G4Tubs* GeCyl = new G4Tubs("GeCyl",0.0*mm,fCrystalR_PhaseII,geBoxL/2.,0.*degree,360.*degree); + + G4ThreeVector transGeBox( transX, transY, 0.0*mm); + G4IntersectionSolid* backPart = new G4IntersectionSolid("Box+Cyl",GeCyl,GeBox,0,transGeBox); + + //add front and back + G4ThreeVector transBack( -transX/2., -transY/2., (GeTaperL/2.+geBoxL/2.)); + solidGeLeaf_PhaseII = new G4UnionSolid("germanium",taperedCone,backPart,0,transBack); + + //z-position of Ge-leaf wrt vacuum + fGeLeafPosZ_PhaseII = -endCapVacTaperL/2. + GeTaperL/2. + GeGap - endCapFrontThickness; + + G4cout << "end-cap : box/2 " << endCapBoxL/2. << " taper/2 " << endCapTaperL/2. << " total/2 " << endCapTotalL << G4endl; + G4cout << "vacuum : box/2 " << endCapVacBoxL/2. << " taper/2 " << endCapVacTaperL/2. << " total/2 " << endCapVacTotalL << G4endl; + G4cout << "ge : box/2 " << geBoxL/2. << " taper/2 " << GeTaperL/2. << " total/2 " << GeTotalL << G4endl; + + + //------------------------------------------------------------------ + // Inner bore hole + lithium contact + passivated Ge + G4double GeDepth = 15.00 * mm; //Hole dirilled to this far from face + G4double passiveThick = 0.5 * mm; //fPassiveThick_PhaseII; //passivated Ge + G4double contactThick = fContactThick_PhaseII; //Li contact + //G4double innerRHole = 0.00 * mm; + G4double holeR = fHoleR_PhaseII; + G4double contactR = holeR + contactThick; + G4double passiveR = contactR + passiveThick; + G4double holeL = fTotalGeL_PhaseII - GeDepth; + G4double tubeL = holeL - holeR; + + //the same translation works for all the following rounded tubes + G4ThreeVector transSphere(0.01*mm, 0.01*mm, -tubeL/2.-0.1*mm); //if offsets are 0. it does not display !! + + //now add a passivated layer + G4Sphere* passivatedSphere = new G4Sphere("passSphere", 0.0*mm, passiveR, 0.*degree, 360.*degree, 0.*degree, 180.*degree); + G4Tubs* passivatedTube = new G4Tubs( "passTube", 0.0*mm, passiveR, tubeL/2., 0.*degree, 360.*degree); + solidPassivated_PhaseII = new G4UnionSolid("passivatedGe",passivatedTube,passivatedSphere,0,transSphere); + + //and the Li contact + G4Sphere* contactSphere = new G4Sphere("sphere1", 0.0*mm, contactR, 0.*deg, 360.*deg, 0.*deg, 180.*deg); + G4Tubs* contactTube = new G4Tubs( "tube1", 0.0*mm, contactR, tubeL/2., 0.*deg, 360.*deg); + solidContact_PhaseII = new G4UnionSolid("liContact",contactTube,contactSphere,0,transSphere); + + //bore out a hole + G4Sphere* boreSphere = new G4Sphere( "boreSphere", 0.0*mm, holeR, 0.*degree, 360.*degree, 0.*degree, 180.*degree); + G4Tubs* boreTube = new G4Tubs( "boreTube", 0.0*mm, holeR, tubeL/2., 0.*degree, 360.*degree); + solidBoreHole_PhaseII = new G4UnionSolid("boreHole",boreTube,boreSphere,0,transSphere); + + //save these for placements.... + fContact_dZ_PhaseII = holeL/2. - contactThick;// - passiveThick; + + //put corners @ (0,0) + fGeLeaf_dX_PhaseII = largeSquare/2. - transX/2.; + } -//--------------------------------------------------------------------- -// Create the solids defining Phase-II Clovers -//--------------------------------------------------------------------- -void Chamber::CreateCloverIISolids() -{ - //An approximate CloverII - G4cout << G4endl << "Constructing archetypal PhaseII Clover" << G4endl; - - //--------------------------------------------------------- - //end-cap - G4double endCapFrontThickness = 1.2*mm; //was 1.5 - G4double endCapTaperThickness = 1.5*mm; - G4double endCapSideThickness = 1.5*mm; - - G4double GeGap = fEndCap2Ge_PhaseII; - G4double taperAngle = 7.0*degree; - - G4double endCapTotalL = fTotalGeL_PhaseII + GeGap + endCapFrontThickness + 5.*mm; //+ Gap at rear end - G4double endCapFrontD = 43.5*mm; - G4double endCapBackD = 50.5*mm; - G4double endCapTaperL = 55.0*mm; - - G4double endCapBoxL = endCapTotalL - endCapTaperL; - - //the tapered part - G4Trap* solidTaperedCloverEC - = new G4Trap("taperedCloverEC", - endCapTaperL/2., //Half z-length [pDz] - 0.00*degree, //Polar angle of line joining centres of the faces @ -/+pDz - 14.0*degree, //aequivalent zimuthal angle - endCapFrontD, //pDy1 half y length at -pDz - endCapFrontD, //pDx1 half x length at -pDz, -pDy1 - endCapFrontD, //pDx2 half x length at -pDz, +pDy1 - 0.00*degree,//pAlpha1 wrt y-axis from the centre of the side (lower endcap) - endCapBackD, //pDy2 half y length at +pDz - endCapBackD, //pDx3 half x length at +pDz, -pDy2 - endCapBackD, //pDx4 half x length at +pDz, +pDy2 - 0.00*degree); //pAlpha2 wrt y-axis from the centre of the side (upper endcap) - - //the rectangular part..... - G4Box* endCapBox = new G4Box("endCapBox",endCapBackD,endCapBackD,endCapBoxL/2.); - G4ThreeVector transECBox( 0.*mm, 0.*mm, endCapTaperL/2.+endCapBoxL/2.); - - //add the two together - solidEndCap_PhaseII = new G4UnionSolid("Box+Taper",solidTaperedCloverEC,endCapBox,0,transECBox); - //need the taperL for placement - fEndCapTaperL_PhaseII = endCapTaperL; - - - //--------------------------------------------------------- - //end-cap inner vacuum - G4double endCapDelta_1 = endCapTaperThickness/cos(taperAngle) - endCapFrontThickness*tan(taperAngle); - G4double endCapDelta_2 = ( endCapSideThickness - (endCapTaperThickness*sin(taperAngle)*tan(taperAngle) + - endCapTaperThickness*cos(taperAngle) ) )/tan(taperAngle); - - G4cout << endCapDelta_1 << " " << endCapDelta_2 << endl; - - G4double endCapVacTaperL = endCapTaperL - endCapFrontThickness;// - endCapDelta_2; - G4double endCapVacBoxL = endCapBoxL - endCapFrontThickness; - G4double endCapVacTotalL = endCapVacBoxL + endCapVacTaperL; - G4double endCapVacFrontD = endCapFrontD - endCapDelta_1; - G4double endCapVacBackD = endCapBackD - endCapSideThickness; - - //position of vacuum wrt end-cap - fVacuumPosZ_PhaseII = (-endCapTotalL + endCapVacTotalL )/2. + 1.5*endCapFrontThickness; - - //tapered part... - G4Trap* solidTaperVac - = new G4Trap("cloverTaperVac", - endCapVacTaperL/2., //Half z-length [pDz] - 0.00*degree, //Polar angle of line joining centres of the faces @ -/+pDz - 14.0*degree, //aequivalent zimuthal angle - endCapVacFrontD, //pDy1 half y length at -pDz - endCapVacFrontD, //pDx1 half x length at -pDz, -pDy1 - endCapVacFrontD, //pDx2 half x length at -pDz, +pDy1 - 0.00*degree,//pAlpha1 wrt y-axis from the centre of the side (lower endcap) - endCapVacBackD, //pDy2 half y length at +pDz - endCapVacBackD, //pDx3 half x length at +pDz, -pDy2 - endCapVacBackD, //pDx4 half x length at +pDz, +pDy2 - 0.00*degree); //pAlpha2 wrt y-axis from the centre of the side (upper endcap) - - G4cout << endCapTotalL << " " << endCapVacTotalL << endl; - - //rectangular part - G4Box* endCapVacBox = new G4Box("endCapBox",endCapVacBackD,endCapVacBackD,endCapVacBoxL/2.); - G4ThreeVector transVacBox( 0.*mm, 0.*mm, (endCapVacTaperL/2.+endCapVacBoxL/2.-0.0001*mm)); - - //add them together - solidVacuum_PhaseII = new G4UnionSolid("Vac_Box+Taper",solidTaperVac,endCapVacBox,0,transVacBox); - - - //--------------------------------------------------------- - //The Ge crystal... - G4double GeTaperL = 36.0*mm; - G4double GeTotalL = fTotalGeL_PhaseII; //70.0 * mm; - G4double smallSquare = 41.0*mm; - G4double largeSquare = 45.5*mm; - - G4double transX = (largeSquare-smallSquare)/2.; - G4double transY = (largeSquare-smallSquare)/2.; - fHole_dX_PhaseII = transX; //transX /= 2.; - fHole_dY_PhaseII = transY; //transY /= 2.; - - //tapered part...... - G4Trap* solidTaper - = new G4Trap("cloverTaper", - GeTaperL/2., //Half ? z-length [pDz] - 5.05*degree, //Polar angle of line joining centres of the faces @ -/+pDz - 45.*degree, //equivalent azimuthal angle //DOES NOT MAKE SENSE !! - smallSquare/2., //pDy1 half y length at -pDz - smallSquare/2., //pDx1 half x length at -pDz, -pDy1 - smallSquare/2., //pDx2 half x length at -pDz, +pDy1 - 0.00*degree,//pAlpha1 wrt y-axis from the centre of the side (lower endcap) - largeSquare/2., //pDy2 half y length at +pDz - largeSquare/2., //pDx3 half x length at +pDz, -pDy2 - largeSquare/2., //pDx4 half x length at +pDz, +pDy2 - 0.0*degree); //pAlpha2 wrt y-axis from the centre of the side (upper endcap) - - //HERE !! - const G4int numZPlanesGe=4; // no. polycone planes - - G4double zPlaneGe[numZPlanesGe]; // positions of planes - zPlaneGe[0] = 0.00*mm; - zPlaneGe[1] = 2.06*mm; - zPlaneGe[2] = 5.00*mm; - zPlaneGe[3] = GeTaperL; - - G4double rInnerGe[numZPlanesGe]; // interior radii - rInnerGe[0] = rInnerGe[1] = rInnerGe[2] = rInnerGe[3] = 0.0*mm; - G4double rOuterGe[numZPlanesGe]; // exterior radii - rOuterGe[0] = 20.5*mm; rOuterGe[1] = 23.54*mm; - rOuterGe[2] = rOuterGe[3] = fCrystalR_PhaseII; - - - G4Polycone* solidCone = new G4Polycone("cloverCone", 0.0*degree, 360.0*degree, - numZPlanesGe, - zPlaneGe, - rInnerGe, - rOuterGe); - - G4ThreeVector transGeCone( -transX/2., -transY/2., -GeTaperL/2.); - G4IntersectionSolid* taperedCone = new G4IntersectionSolid("Taper+Cone",solidTaper,solidCone,0,transGeCone); - - //back part.... - G4double geBoxL = fTotalGeL_PhaseII - GeTaperL; - - G4Box* GeBox = new G4Box("GeBox",largeSquare/2.,largeSquare/2.,geBoxL/2.); - G4Tubs* GeCyl = new G4Tubs("GeCyl",0.0*mm,fCrystalR_PhaseII,geBoxL/2.,0.*degree,360.*degree); - - G4ThreeVector transGeBox( transX, transY, 0.0*mm); - G4IntersectionSolid* backPart = new G4IntersectionSolid("Box+Cyl",GeCyl,GeBox,0,transGeBox); - - //add front and back - G4ThreeVector transBack( -transX/2., -transY/2., (GeTaperL/2.+geBoxL/2.)); - solidGeLeaf_PhaseII = new G4UnionSolid("germanium",taperedCone,backPart,0,transBack); - - //z-position of Ge-leaf wrt vacuum - fGeLeafPosZ_PhaseII = -endCapVacTaperL/2. + GeTaperL/2. + GeGap - endCapFrontThickness; - - G4cout << "end-cap : box/2 " << endCapBoxL/2. << " taper/2 " << endCapTaperL/2. << " total/2 " << endCapTotalL << G4endl; - G4cout << "vacuum : box/2 " << endCapVacBoxL/2. << " taper/2 " << endCapVacTaperL/2. << " total/2 " << endCapVacTotalL << G4endl; - G4cout << "ge : box/2 " << geBoxL/2. << " taper/2 " << GeTaperL/2. << " total/2 " << GeTotalL << G4endl; - //------------------------------------------------------------------ - // Inner bore hole + lithium contact + passivated Ge - G4double GeDepth = 15.00 * mm; //Hole dirilled to this far from face - G4double passiveThick = 0.5 * mm; //fPassiveThick_PhaseII; //passivated Ge - G4double contactThick = fContactThick_PhaseII; //Li contact - //G4double innerRHole = 0.00 * mm; - G4double holeR = fHoleR_PhaseII; - G4double contactR = holeR + contactThick; - G4double passiveR = contactR + passiveThick; - G4double holeL = fTotalGeL_PhaseII - GeDepth; - G4double tubeL = holeL - holeR; - - //the same translation works for all the following rounded tubes - G4ThreeVector transSphere(0.01*mm, 0.01*mm, -tubeL/2.-0.1*mm); //if offsets are 0. it does not display !! - - //now add a passivated layer - G4Sphere* passivatedSphere = new G4Sphere("passSphere", 0.0*mm, passiveR, 0.*degree, 360.*degree, 0.*degree, 180.*degree); - G4Tubs* passivatedTube = new G4Tubs( "passTube", 0.0*mm, passiveR, tubeL/2., 0.*degree, 360.*degree); - solidPassivated_PhaseII = new G4UnionSolid("passivatedGe",passivatedTube,passivatedSphere,0,transSphere); - - //and the Li contact - G4Sphere* contactSphere = new G4Sphere("sphere1", 0.0*mm, contactR, 0.*deg, 360.*deg, 0.*deg, 180.*deg); - G4Tubs* contactTube = new G4Tubs( "tube1", 0.0*mm, contactR, tubeL/2., 0.*deg, 360.*deg); - solidContact_PhaseII = new G4UnionSolid("liContact",contactTube,contactSphere,0,transSphere); - - //bore out a hole - G4Sphere* boreSphere = new G4Sphere( "boreSphere", 0.0*mm, holeR, 0.*degree, 360.*degree, 0.*degree, 180.*degree); - G4Tubs* boreTube = new G4Tubs( "boreTube", 0.0*mm, holeR, tubeL/2., 0.*degree, 360.*degree); - solidBoreHole_PhaseII = new G4UnionSolid("boreHole",boreTube,boreSphere,0,transSphere); - - //save these for placements.... - fContact_dZ_PhaseII = holeL/2. - contactThick;// - passiveThick; - - //put corners @ (0,0) - fGeLeaf_dX_PhaseII = largeSquare/2. - transX/2.; -} + //--------------------------------------------------------------------- + // Create the solids defining Phase-II Clovers + //--------------------------------------------------------------------- + void Chamber::CreateGREATCloverSolids() + { + //An approximate CloverII + G4cout << G4endl << "Constructing archetypal GREAT Clover" << G4endl; + + //--------------------------------------------------------- + //end-cap + G4double endCapFrontThickness = 2.0*mm; + G4double endCapTaperThickness = 2.0*mm; + G4double endCapSideThickness = 2.0*mm; + + G4double GeGap = fEndCap2Ge_GREAT - endCapFrontThickness; + G4double taperAngle = 15.*degree; + + G4double endCapTotalL = fTotalGeL_GREAT + GeGap + 2.*endCapFrontThickness + 5.*mm; //+ Gap at rear end + G4double endCapFrontD = 60.09*mm; + G4double endCapBackD = 70.00*mm; + G4double endCapTaperL = 37.00*mm; + + G4double endCapBoxL = endCapTotalL - endCapTaperL; + + //the tapered part.... + G4Trap* solidTaperedCloverEC = new G4Trap("taperedCloverEC", + endCapTaperL/2., //Half z-length [pDz] + 0.00*degree, //Polar angle of line joining centres of the faces @ -/+pDz + 45.0*degree, //aequivalent zimuthal angle //Does not make sense ! + endCapFrontD, //pDy1 half y length at -pDz + endCapFrontD, //pDx1 half x length at -pDz, -pDy1 + endCapFrontD, //pDx2 half x length at -pDz, +pDy1 + 0.00*degree,//pAlpha1 wrt y-axis from the centre of the side (lower endcap) + endCapBackD, //pDy2 half y length at +pDz + endCapBackD, //pDx3 half x length at +pDz, -pDy2 + endCapBackD, //pDx4 half x length at +pDz, +pDy2 + 0.00*degree); //pAlpha2 wrt y-axis from the centre of the side (upper endcap) + + //the rectangular part..... + G4Box* endCapBox = new G4Box("endCapBox",endCapBackD,endCapBackD,endCapBoxL/2.); + G4ThreeVector transECBox( 0.*mm, 0.*mm, endCapTaperL/2.+endCapBoxL/2.); + + //add the two together + solidEndCap_GREAT = new G4UnionSolid("Box+Taper",solidTaperedCloverEC,endCapBox,0,transECBox); + //need the taperL for placement + fEndCapTaperL_GREAT = endCapTaperL; + + + //--------------------------------------------------------- + //end-cap inner vacuum + G4double endCapDelta_1 = endCapTaperThickness/cos(taperAngle) - endCapFrontThickness*tan(taperAngle); + G4double endCapDelta_2 = ( endCapSideThickness - (endCapTaperThickness*sin(taperAngle)*tan(taperAngle) + + endCapTaperThickness*cos(taperAngle) ) )/tan(taperAngle); + + G4cout << endCapDelta_1 << " " << endCapDelta_2 << endl; + + G4double endCapVacTaperL = endCapTaperL - endCapFrontThickness - endCapDelta_2; + G4double endCapVacBoxL = endCapBoxL + endCapDelta_2; + G4double endCapVacTotalL = endCapVacBoxL + endCapVacTaperL; + G4double endCapVacFrontD = endCapFrontD - endCapDelta_1; + G4double endCapVacBackD = endCapBackD - endCapSideThickness; + + //position of vacuum wrt end-cap + fVacuumPosZ_GREAT = (-endCapTotalL + endCapVacTotalL - endCapDelta_2)/2. + endCapFrontThickness; + + //tapered part... + G4Trap* solidTaperVac = new G4Trap("cloverTaperVac", + endCapVacTaperL/2., //Half z-length [pDz] + 0.00*degree, //Polar angle of line joining centres of the faces @ -/+pDz + 45.0*degree, //aequivalent zimuthal angle + endCapVacFrontD, //pDy1 half y length at -pDz + endCapVacFrontD, //pDx1 half x length at -pDz, -pDy1 + endCapVacFrontD, //pDx2 half x length at -pDz, +pDy1 + 0.00*degree,//pAlpha1 wrt y-axis from the centre of the side (lower endcap) + endCapVacBackD, //pDy2 half y length at +pDz + endCapVacBackD, //pDx3 half x length at +pDz, -pDy2 + endCapVacBackD, //pDx4 half x length at +pDz, +pDy2 + 0.00*degree); //pAlpha2 wrt y-axis from the centre of the side (upper endcap) + + G4cout << endCapTotalL << " " << endCapVacTotalL << endl; + + //rectangular part + G4Box* endCapVacBox = new G4Box("endCapBox",endCapVacBackD,endCapVacBackD,endCapVacBoxL/2.); + G4ThreeVector transVacBox( 0.*mm, 0.*mm, endCapVacTaperL/2.+endCapVacBoxL/2.); + + //add them together + solidVacuum_GREAT = new G4UnionSolid("Vac_Box+Taper",solidTaperVac,endCapVacBox,0,transVacBox); + + + //--------------------------------------------------------- + //The Ge crystal... + G4double GeTaperL = fTaperGeL_GREAT; //30.0*mm; + G4double GeTotalL = fTotalGeL_GREAT; //105 ? 140.0 * mm; + + G4double smallSquare = fFrontFaceSquare_GREAT; + G4double largeSquare = fBackFaceSquare_GREAT; + + G4double transX = (largeSquare-smallSquare)/2.; + G4double transY = (largeSquare-smallSquare)/2.; + transX /= 2.; + transY /= 2.; + + G4cout << "Got to the point of creating the clover leaf" << G4endl; + + //don't understand this G4Trap : expect an angle of 12.15 degrees ! + G4Trap* solidTaper = new G4Trap("cloverTaper", + GeTaperL/2., //Half z-length [pDz] + 9.63*degree, //This is a fudge angle and is diff from debug //Polar angle of line joining centres of the faces @ -/+pDz + 45.0*degree, //equivalent zimuthal angle + smallSquare/2., //pDy1 half y length at -pDz + smallSquare/2., //pDx1 half x length at -pDz, -pDy1 + smallSquare/2., //pDx2 half x length at -pDz, +pDy1 + 0.00*degree,//pAlpha1 wrt y-axis from the centre of the side (lower endcap) + largeSquare/2., //pDy2 half y length at +pDz + largeSquare/2., //pDx3 half x length at +pDz, -pDy2 + largeSquare/2., //pDx4 half x length at +pDz, +pDy2 + 0.0*degree); //pAlpha2 wrt y-axis from the centre of the side (upper endcap) + /* + This was used for a phaseII to make rounded edges + const G4int numZPlanesGe=4; // no. polycone planes + G4double zPlaneGe[numZPlanesGe]; // positions of planes + zPlaneGe[0] = 0.00*mm; + zPlaneGe[1] = 1.46*mm; + zPlaneGe[2] = 5.00*mm; + zPlaneGe[3] = GeTaperL; + G4double rInnerGe[numZPlanesGe]; // interior radii + rInnerGe[0] = rInnerGe[1] = rInnerGe[2] = rInnerGe[3] = 0.0*mm; + G4double rOuterGe[numZPlanesGe]; // exterior radii + rOuterGe[0] = 20.5*mm; rOuterGe[1] = 23.04*mm; //23.54*mm;//exagerate it more + rOuterGe[2] = rOuterGe[3] = fCrystalR_PhaseII; -//--------------------------------------------------------------------- -// Create the solids defining Phase-II Clovers -//--------------------------------------------------------------------- -void Chamber::CreateGREATCloverSolids() -{ - //An approximate CloverII - G4cout << G4endl << "Constructing archetypal GREAT Clover" << G4endl; - - //--------------------------------------------------------- - //end-cap - G4double endCapFrontThickness = 2.0*mm; - G4double endCapTaperThickness = 2.0*mm; - G4double endCapSideThickness = 2.0*mm; - - G4double GeGap = fEndCap2Ge_GREAT - endCapFrontThickness; - G4double taperAngle = 15.*degree; - - G4double endCapTotalL = fTotalGeL_GREAT + GeGap + 2.*endCapFrontThickness + 5.*mm; //+ Gap at rear end - G4double endCapFrontD = 60.09*mm; - G4double endCapBackD = 70.00*mm; - G4double endCapTaperL = 37.00*mm; - - G4double endCapBoxL = endCapTotalL - endCapTaperL; - - //the tapered part.... - G4Trap* solidTaperedCloverEC = new G4Trap("taperedCloverEC", - endCapTaperL/2., //Half z-length [pDz] - 0.00*degree, //Polar angle of line joining centres of the faces @ -/+pDz - 45.0*degree, //aequivalent zimuthal angle //Does not make sense ! - endCapFrontD, //pDy1 half y length at -pDz - endCapFrontD, //pDx1 half x length at -pDz, -pDy1 - endCapFrontD, //pDx2 half x length at -pDz, +pDy1 - 0.00*degree,//pAlpha1 wrt y-axis from the centre of the side (lower endcap) - endCapBackD, //pDy2 half y length at +pDz - endCapBackD, //pDx3 half x length at +pDz, -pDy2 - endCapBackD, //pDx4 half x length at +pDz, +pDy2 - 0.00*degree); //pAlpha2 wrt y-axis from the centre of the side (upper endcap) - - //the rectangular part..... - G4Box* endCapBox = new G4Box("endCapBox",endCapBackD,endCapBackD,endCapBoxL/2.); - G4ThreeVector transECBox( 0.*mm, 0.*mm, endCapTaperL/2.+endCapBoxL/2.); - - //add the two together - solidEndCap_GREAT = new G4UnionSolid("Box+Taper",solidTaperedCloverEC,endCapBox,0,transECBox); - //need the taperL for placement - fEndCapTaperL_GREAT = endCapTaperL; - - - //--------------------------------------------------------- - //end-cap inner vacuum - G4double endCapDelta_1 = endCapTaperThickness/cos(taperAngle) - endCapFrontThickness*tan(taperAngle); - G4double endCapDelta_2 = ( endCapSideThickness - (endCapTaperThickness*sin(taperAngle)*tan(taperAngle) + - endCapTaperThickness*cos(taperAngle) ) )/tan(taperAngle); - - G4cout << endCapDelta_1 << " " << endCapDelta_2 << endl; - - G4double endCapVacTaperL = endCapTaperL - endCapFrontThickness - endCapDelta_2; - G4double endCapVacBoxL = endCapBoxL + endCapDelta_2; - G4double endCapVacTotalL = endCapVacBoxL + endCapVacTaperL; - G4double endCapVacFrontD = endCapFrontD - endCapDelta_1; - G4double endCapVacBackD = endCapBackD - endCapSideThickness; - - //position of vacuum wrt end-cap - fVacuumPosZ_GREAT = (-endCapTotalL + endCapVacTotalL - endCapDelta_2)/2. + endCapFrontThickness; - - //tapered part... - G4Trap* solidTaperVac = new G4Trap("cloverTaperVac", - endCapVacTaperL/2., //Half z-length [pDz] - 0.00*degree, //Polar angle of line joining centres of the faces @ -/+pDz - 45.0*degree, //aequivalent zimuthal angle - endCapVacFrontD, //pDy1 half y length at -pDz - endCapVacFrontD, //pDx1 half x length at -pDz, -pDy1 - endCapVacFrontD, //pDx2 half x length at -pDz, +pDy1 - 0.00*degree,//pAlpha1 wrt y-axis from the centre of the side (lower endcap) - endCapVacBackD, //pDy2 half y length at +pDz - endCapVacBackD, //pDx3 half x length at +pDz, -pDy2 - endCapVacBackD, //pDx4 half x length at +pDz, +pDy2 - 0.00*degree); //pAlpha2 wrt y-axis from the centre of the side (upper endcap) - - G4cout << endCapTotalL << " " << endCapVacTotalL << endl; - - //rectangular part - G4Box* endCapVacBox = new G4Box("endCapBox",endCapVacBackD,endCapVacBackD,endCapVacBoxL/2.); - G4ThreeVector transVacBox( 0.*mm, 0.*mm, endCapVacTaperL/2.+endCapVacBoxL/2.); - - //add them together - solidVacuum_GREAT = new G4UnionSolid("Vac_Box+Taper",solidTaperVac,endCapVacBox,0,transVacBox); - - - //--------------------------------------------------------- - //The Ge crystal... - G4double GeTaperL = fTaperGeL_GREAT; //30.0*mm; - G4double GeTotalL = fTotalGeL_GREAT; //105 ? 140.0 * mm; - - G4double smallSquare = fFrontFaceSquare_GREAT; - G4double largeSquare = fBackFaceSquare_GREAT; - - G4double transX = (largeSquare-smallSquare)/2.; - G4double transY = (largeSquare-smallSquare)/2.; - transX /= 2.; - transY /= 2.; - - G4cout << "Got to the point of creating the clover leaf" << G4endl; - - //don't understand this G4Trap : expect an angle of 12.15 degrees ! - G4Trap* solidTaper = new G4Trap("cloverTaper", - GeTaperL/2., //Half z-length [pDz] - 9.63*degree, //This is a fudge angle and is diff from debug //Polar angle of line joining centres of the faces @ -/+pDz - 45.0*degree, //equivalent zimuthal angle - smallSquare/2., //pDy1 half y length at -pDz - smallSquare/2., //pDx1 half x length at -pDz, -pDy1 - smallSquare/2., //pDx2 half x length at -pDz, +pDy1 - 0.00*degree,//pAlpha1 wrt y-axis from the centre of the side (lower endcap) - largeSquare/2., //pDy2 half y length at +pDz - largeSquare/2., //pDx3 half x length at +pDz, -pDy2 - largeSquare/2., //pDx4 half x length at +pDz, +pDy2 - 0.0*degree); //pAlpha2 wrt y-axis from the centre of the side (upper endcap) - - /* - This was used for a phaseII to make rounded edges - const G4int numZPlanesGe=4; // no. polycone planes - G4double zPlaneGe[numZPlanesGe]; // positions of planes - zPlaneGe[0] = 0.00*mm; - zPlaneGe[1] = 1.46*mm; - zPlaneGe[2] = 5.00*mm; - zPlaneGe[3] = GeTaperL; - - G4double rInnerGe[numZPlanesGe]; // interior radii - rInnerGe[0] = rInnerGe[1] = rInnerGe[2] = rInnerGe[3] = 0.0*mm; - G4double rOuterGe[numZPlanesGe]; // exterior radii - rOuterGe[0] = 20.5*mm; rOuterGe[1] = 23.04*mm; //23.54*mm;//exagerate it more - rOuterGe[2] = rOuterGe[3] = fCrystalR_PhaseII; - - - G4Polycone* solidCone = new G4Polycone("cloverCone", 0.0*degree, 360.0*degree,numZPlanesGe, zPlaneGe, rInnerGe, rOuterGe); - G4ThreeVector transGeCone( -transX/2., -transY/2., -GeTaperL/2.); - G4IntersectionSolid* taperedCone = new G4IntersectionSolid("Taper+Cone",solidTaper,solidCone,0,transGeCone); - */ - //back part.... - G4double geBoxL = GeTotalL - GeTaperL; - G4Box* GeBox = new G4Box("GeBox", largeSquare/2., largeSquare/2., geBoxL/2.); - - //add back box and front tapered parts - G4ThreeVector transGeBox( transX, transX, GeTaperL/2.+geBoxL/2.); - G4UnionSolid* newTaper = new G4UnionSolid("Box+Taper",solidTaper,GeBox,0,transGeBox); - - - //now make a cylinder 90x60 which needs to be displaced before intersection - //the centres of the cylinders should be 56 mm apart, but the gap between leaves - // is 0.8 mm => centre of cylinder should be at (27.6,27.6) wrt inner corner - G4double dx1 = 27.60*mm; - G4double dx2 = largeSquare/2.; - G4cout << "transX " << transX << " dx2 " << dx2 << ".....hole_dX " << fHole_dX_GREAT << G4endl; - - fHole_dX_GREAT = transX + dx1 - dx2; //save the displacements for the bore-hole placements - fHole_dY_GREAT = transY + dx1 - dx2; - - G4Tubs* GeCyl = new G4Tubs("GeCyl",0.0*mm, 35*mm, GeTotalL/2.,0.*degree,360.*degree); - G4ThreeVector transGeCyl( fHole_dX_GREAT, fHole_dY_GREAT, (GeTotalL-GeTaperL)/2.); - - //add all of this together for the Ge.... - solidGeLeaf_GREAT = new G4IntersectionSolid("Box+Taper+Cyl",newTaper,GeCyl,0,transGeCyl); - - - //put corners @ (0,0) - fGeLeaf_dX_GREAT = largeSquare/2. - transX; - //fGeLeaf_dY_GREAT = largeSquare/2. - transY; - G4cout << "shift leaves " << fGeLeaf_dX_GREAT << "....." << fHole_dX_GREAT << G4endl; - - //z-position of Ge-leaf wrt vacuum - fGeLeafPosZ_GREAT = -endCapVacTaperL/2. + GeTaperL/2. + GeGap; //wrt clover Vacuum - - //1.875 28.875.....-1.575 27.6 - - //------------------------------------------------------- - // Inner bore hole + lithium contact + passivated Ge - G4double GeDepth = 15.00 * mm; - G4double holeL = GeTotalL - GeDepth; //length of bore hole - G4double passiveThick = 0.30 * mm; //passivated Ge - G4double contactThick = 0.50 * mm; //Li contact - - //G4double innerRHole = 0.00 * mm; - G4double holeR = 5.00 * mm; //fHoleR_PhaseII; - G4double contactR = holeR + contactThick; - G4double passiveR = contactR + passiveThick; - G4double tubeL = holeL - holeR; - - //the same translation works for all the following rounded tubes - G4ThreeVector transSphere(0.001*mm, 0.001*mm, -tubeL/2.-0.001*mm); //if offsets are 0. it does not display !! - - //now add a passivated layer - G4Sphere* passivatedSphere = new G4Sphere("passSphere", 0.0*mm, passiveR, 0.*degree, 360.*degree, 0.*degree, 180.*degree); - G4Tubs* passivatedTube = new G4Tubs( "passTube", 0.0*mm, passiveR, tubeL/2., 0.*degree, 360.*degree); - solidPassivated_GREAT = new G4UnionSolid("passivatedGe",passivatedTube,passivatedSphere,0,transSphere); - - //and the Li contact - G4Sphere* contactSphere = new G4Sphere("sphere1", 0.0*mm, contactR, 0.*deg, 360.*deg, 0.*deg, 180.*deg); - G4Tubs* contactTube = new G4Tubs( "tube1", 0.0*mm, contactR, tubeL/2., 0.*deg, 360.*deg); - solidContact_GREAT = new G4UnionSolid("liContact",contactTube,contactSphere,0,transSphere); - - //bore out a hole - G4Sphere* boreSphere = new G4Sphere( "boreSphere", 0.0*mm, holeR, 0.*degree, 360.*degree, 0.*degree, 180.*degree); - G4Tubs* boreTube = new G4Tubs( "boreTube", 0.0*mm, holeR, tubeL/2., 0.*degree, 360.*degree); - solidBoreHole_GREAT = new G4UnionSolid("boreHole",boreTube,boreSphere,0,transSphere); - - //save this for placement - fContact_dZ_GREAT = -GeTaperL/2 + tubeL/2 + holeR + GeDepth; - G4cout << "fContact_dZ_GREAT " << fContact_dZ_GREAT << G4endl; - G4cout << "totalL/2 " << GeTotalL/2 << " taperL/2 " << GeTaperL/2 << " tubeL/2 " << tubeL/2 << " : GeDepth " << GeDepth << G4endl; -} + G4Polycone* solidCone = new G4Polycone("cloverCone", 0.0*degree, 360.0*degree,numZPlanesGe, zPlaneGe, rInnerGe, rOuterGe); + G4ThreeVector transGeCone( -transX/2., -transY/2., -GeTaperL/2.); + G4IntersectionSolid* taperedCone = new G4IntersectionSolid("Taper+Cone",solidTaper,solidCone,0,transGeCone); + */ + + //back part.... + G4double geBoxL = GeTotalL - GeTaperL; + G4Box* GeBox = new G4Box("GeBox", largeSquare/2., largeSquare/2., geBoxL/2.); + + //add back box and front tapered parts + G4ThreeVector transGeBox( transX, transX, GeTaperL/2.+geBoxL/2.); + G4UnionSolid* newTaper = new G4UnionSolid("Box+Taper",solidTaper,GeBox,0,transGeBox); + + + //now make a cylinder 90x60 which needs to be displaced before intersection + //the centres of the cylinders should be 56 mm apart, but the gap between leaves + // is 0.8 mm => centre of cylinder should be at (27.6,27.6) wrt inner corner + G4double dx1 = 27.60*mm; + G4double dx2 = largeSquare/2.; + G4cout << "transX " << transX << " dx2 " << dx2 << ".....hole_dX " << fHole_dX_GREAT << G4endl; + + fHole_dX_GREAT = transX + dx1 - dx2; //save the displacements for the bore-hole placements + fHole_dY_GREAT = transY + dx1 - dx2; + + G4Tubs* GeCyl = new G4Tubs("GeCyl",0.0*mm, 35*mm, GeTotalL/2.,0.*degree,360.*degree); + G4ThreeVector transGeCyl( fHole_dX_GREAT, fHole_dY_GREAT, (GeTotalL-GeTaperL)/2.); + + //add all of this together for the Ge.... + solidGeLeaf_GREAT = new G4IntersectionSolid("Box+Taper+Cyl",newTaper,GeCyl,0,transGeCyl); + + + //put corners @ (0,0) + fGeLeaf_dX_GREAT = largeSquare/2. - transX; + //fGeLeaf_dY_GREAT = largeSquare/2. - transY; + G4cout << "shift leaves " << fGeLeaf_dX_GREAT << "....." << fHole_dX_GREAT << G4endl; + + //z-position of Ge-leaf wrt vacuum + fGeLeafPosZ_GREAT = -endCapVacTaperL/2. + GeTaperL/2. + GeGap; //wrt clover Vacuum + + //1.875 28.875.....-1.575 27.6 + + //------------------------------------------------------- + // Inner bore hole + lithium contact + passivated Ge + G4double GeDepth = 15.00 * mm; + G4double holeL = GeTotalL - GeDepth; //length of bore hole + G4double passiveThick = 0.30 * mm; //passivated Ge + G4double contactThick = 0.50 * mm; //Li contact + + //G4double innerRHole = 0.00 * mm; + G4double holeR = 5.00 * mm; //fHoleR_PhaseII; + G4double contactR = holeR + contactThick; + G4double passiveR = contactR + passiveThick; + G4double tubeL = holeL - holeR; + + //the same translation works for all the following rounded tubes + G4ThreeVector transSphere(0.001*mm, 0.001*mm, -tubeL/2.-0.001*mm); //if offsets are 0. it does not display !! + + //now add a passivated layer + G4Sphere* passivatedSphere = new G4Sphere("passSphere", 0.0*mm, passiveR, 0.*degree, 360.*degree, 0.*degree, 180.*degree); + G4Tubs* passivatedTube = new G4Tubs( "passTube", 0.0*mm, passiveR, tubeL/2., 0.*degree, 360.*degree); + solidPassivated_GREAT = new G4UnionSolid("passivatedGe",passivatedTube,passivatedSphere,0,transSphere); + + //and the Li contact + G4Sphere* contactSphere = new G4Sphere("sphere1", 0.0*mm, contactR, 0.*deg, 360.*deg, 0.*deg, 180.*deg); + G4Tubs* contactTube = new G4Tubs( "tube1", 0.0*mm, contactR, tubeL/2., 0.*deg, 360.*deg); + solidContact_GREAT = new G4UnionSolid("liContact",contactTube,contactSphere,0,transSphere); + + //bore out a hole + G4Sphere* boreSphere = new G4Sphere( "boreSphere", 0.0*mm, holeR, 0.*degree, 360.*degree, 0.*degree, 180.*degree); + G4Tubs* boreTube = new G4Tubs( "boreTube", 0.0*mm, holeR, tubeL/2., 0.*degree, 360.*degree); + solidBoreHole_GREAT = new G4UnionSolid("boreHole",boreTube,boreSphere,0,transSphere); + + //save this for placement + fContact_dZ_GREAT = -GeTaperL/2 + tubeL/2 + holeR + GeDepth; + G4cout << "fContact_dZ_GREAT " << fContact_dZ_GREAT << G4endl; + G4cout << "totalL/2 " << GeTotalL/2 << " taperL/2 " << GeTaperL/2 << " tubeL/2 " << tubeL/2 << " : GeDepth " << GeDepth << G4endl; + + + + + } diff --git a/NPSimulation/Core/Chamber.hh b/NPSimulation/Core/Chamber.hh index 85389b07418014333c0cbf7780c1debe11dfcb25..3b0a86447e17794553b36c9d755e529b8d80cb53 100644 --- a/NPSimulation/Core/Chamber.hh +++ b/NPSimulation/Core/Chamber.hh @@ -15,10 +15,10 @@ *---------------------------------------------------------------------------* * Decription: * * This class describe Cryogenic and standard Chamber. * - * Derived fromNPS::VDetector * + * Derived fromNPS::VDetector * *---------------------------------------------------------------------------* * Comment: * - * + * * * * *****************************************************************************/ // C++ headers @@ -40,9 +40,9 @@ // NPTool headers #include "NPSVDetector.hh" - +#include "NPInputParser.h" using namespace std; - using namespace CLHEP; +using namespace CLHEP; class Chamber : public NPS::VDetector { @@ -54,7 +54,7 @@ class Chamber : public NPS::VDetector public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Core/DetectorConstruction.cc b/NPSimulation/Core/DetectorConstruction.cc index 89bccbd235b3ddf516dd00e2ab621afc72c457ab..a5f9cb379cd9dcf47e9fda11e2becad57f88ec85 100644 --- a/NPSimulation/Core/DetectorConstruction.cc +++ b/NPSimulation/Core/DetectorConstruction.cc @@ -50,6 +50,7 @@ // NPL #include "RootOutput.h" #include "NPOptionManager.h" +#include "NPInputParser.h" // NPS #include "NPSDetectorFactory.hh" @@ -94,13 +95,14 @@ void DetectorConstruction::AddDetector(NPS::VDetector* NewDetector){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4VPhysicalVolume* DetectorConstruction::ReadConfigurationFile(){ + // Construct the World volume G4Material* Vacuum = MaterialManager::getInstance()->GetMaterialFromLibrary("Vacuum"); //------------------------------world volume - G4double world_x = 10.0 * m; - G4double world_y = 10.0 * m; - G4double world_z = 10.0 * m; + G4double world_x = 100.0 * m; + G4double world_y = 100.0 * m; + G4double world_z = 100.0 * m; G4Box* world_box = new G4Box("world_box", world_x, world_y, world_z); @@ -120,8 +122,6 @@ G4VPhysicalVolume* DetectorConstruction::ReadConfigurationFile(){ ////////General Reading needs//////// std::string LineBuffer; std::string DataBuffer; - bool cGeneralTarget=false; - bool cGeneralChamber=false; static bool already=false; std::set<std::string> check; int VerboseLevel = 0 ; @@ -131,7 +131,9 @@ G4VPhysicalVolume* DetectorConstruction::ReadConfigurationFile(){ } else VerboseLevel = 0; - cout << "\033[1;36m" ; + + if(VerboseLevel) + cout << endl << "\033[1;36m//// Reading detector file "<< Path << endl<<endl; // Access the DetectorFactory and ask it to load the Class List std::string classlist = getenv("NPTOOL"); @@ -139,102 +141,60 @@ G4VPhysicalVolume* DetectorConstruction::ReadConfigurationFile(){ NPS::DetectorFactory* theFactory = NPS::DetectorFactory::getInstance(); theFactory->ReadClassList(classlist); - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - - if (ConfigFile.is_open()) { // should be always be true - G4cout << " Configuration file " << Path << " loading " << G4endl; + NPL::InputParser parser(Path); + //////////////////////////////////////////// + /////////// Search for Target ///////////// + //////////////////////////////////////////// + std::vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Target"); + if(blocks.size()==1){ + m_Target = new Target(); + m_Target->ReadConfiguration(parser); + AddDetector(m_Target); } - else { - G4cout << " Error, no configuration file" << Path << " found" << G4endl; - exit(1); - } - - while (!ConfigFile.eof()) { - //Pick-up next line - getline(ConfigFile, LineBuffer); - //Search for comment Symbol: % - if (LineBuffer.compare(0, 1, "%") == 0) { /*Do Nothing*/;} - - //////////////////////////////////////////// - //////////// Search for Target ///////////// - //////////////////////////////////////////// - - else if (LineBuffer.compare(0, 13, "GeneralTarget") == 0 && cGeneralTarget == false) { - cGeneralTarget = true ; - if(VerboseLevel) G4cout << G4endl << "////////// Target ///////////" << G4endl << G4endl ; - - // Instantiate the new array as aNPS::VDetector Objects - NPS::VDetector* myDetector = new Target(); - - // Read Position and target specification - ConfigFile.close(); - myDetector->ReadConfiguration(Path); - ConfigFile.open(Path.c_str()); - - // Add Target to DetectorConstruction - m_Target = (Target*) myDetector; - - // Add target to theNPS::VDetector Vector - AddDetector(myDetector); - } - - //////////////////////////////////////////// - //////////// Search for Chamber ///////////// - //////////////////////////////////////////// - - else if (LineBuffer.compare(0, 14, "GeneralChamber") == 0 && cGeneralChamber == false) { - cGeneralChamber = true ; - if(VerboseLevel) G4cout << G4endl << "////////// Chamber ///////////" << G4endl << G4endl ; - - // Instantiate the new array as aNPS::VDetector Objects - NPS::VDetector* myDetector = new Chamber(); - - // Read Position and target specification - ConfigFile.close(); - myDetector->ReadConfiguration(Path); - ConfigFile.open(Path.c_str()); - - // Add Target to DetectorConstruction - m_Chamber = (Chamber*) myDetector; - - // Add target to theNPS::VDetector Vector - AddDetector(myDetector); - } - + else{ + blocks = parser.GetAllBlocksWithToken("CryoTarget"); + if(blocks.size()==1){ + m_Target = new Target(); + m_Target->ReadConfiguration(parser); + AddDetector(m_Target); + } else{ - std::stringstream oss(LineBuffer); - std::string token; - oss >> token ; - NPS::VDetector* detector = theFactory->Construct(token); - if(detector!=NULL && check.find(token)==check.end()){ - if(VerboseLevel){ - cout << "/////////////////////////////////////////" << endl; - cout << "//// Adding Detector " << token << endl; - } - detector->ReadConfiguration(Path); - if(VerboseLevel){ - cout << "/////////////////////////////////////////" << endl; - } - // Add array to the VDetector Vector - AddDetector(detector); - check.insert(token); - } - else{ - if(detector!=NULL) - delete detector; - } + cout << "WARNING: No target found in detector input file! Use with caution" << endl; } } + //////////////////////////////////////////// + /////////// Search for Chamber ///////////// + //////////////////////////////////////////// + blocks.clear(); + blocks = parser.GetAllBlocksWithToken("Chamber"); + if(blocks.size()==1){ + m_Chamber = new Chamber(); + m_Chamber->ReadConfiguration(parser); + AddDetector(m_Chamber); + } + //////////////////////////////////////////// + /////////// Search for Detectors /////////// + //////////////////////////////////////////// + // Get the list of main token + std::vector<std::string> token = parser.GetAllBlocksToken(); + // Look for detectors among them + for(unsigned int i = 0 ; i < token.size() ; i++){ + NPS::VDetector* detector = theFactory->Construct(token[i]); + if(detector!=NULL && check.find(token[i])==check.end()){ + cout << "/////////////////////////////////////////" << endl; + cout << "//// Adding Detector " << token[i] << endl; + detector->ReadConfiguration(parser); + cout << "/////////////////////////////////////////" << endl; + // Add array to the VDetector Vector + AddDetector(detector); + check.insert(token[i]); + } + else if(detector!=NULL) + delete detector; + } - ConfigFile.close(); cout << "\033[0m" ; - if(m_Target==NULL){ - G4cout << "\033[1;31mERROR: No target define in detector file. Cannot perform simulation without target\033[0m" << G4endl ; - exit(1); - } - // Create the Material sample for DEDX tables MaterialManager::getInstance()->CreateSampleVolumes(world_log); diff --git a/NPSimulation/Core/EventGeneratorBeam.cc b/NPSimulation/Core/EventGeneratorBeam.cc index ebcc3240c019af841c29d9d31ce3be3a2ad2e6f4..91282a47a7554060062f1021479d07f8d826692c 100644 --- a/NPSimulation/Core/EventGeneratorBeam.cc +++ b/NPSimulation/Core/EventGeneratorBeam.cc @@ -67,8 +67,8 @@ void EventGeneratorBeam::SetTarget(Target* Target){ } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorBeam::ReadConfiguration(string Path,int){ - m_Beam->ReadConfigurationFile(Path); +void EventGeneratorBeam::ReadConfiguration(NPL::InputParser parser){ + m_Beam->ReadConfigurationFile(parser); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void EventGeneratorBeam::GenerateEvent(G4Event* anEvent){ diff --git a/NPSimulation/Core/EventGeneratorBeam.hh b/NPSimulation/Core/EventGeneratorBeam.hh index 3618b5c1658ba0498f6ab1ee9066bcf7717b4ae7..963ba8ef2095ee5c9fb5a2f51ad799e707d85ecb 100644 --- a/NPSimulation/Core/EventGeneratorBeam.hh +++ b/NPSimulation/Core/EventGeneratorBeam.hh @@ -36,7 +36,7 @@ // NPL Header #include "NPBeam.h" - +#include "NPInputParser.h" using namespace std ; class EventGeneratorBeam : public NPS::VEventGenerator{ @@ -45,7 +45,7 @@ public: // Constructor and destructor virtual ~EventGeneratorBeam(); public: // Inherit from VEventGenerator Class - void ReadConfiguration(string,int); + void ReadConfiguration(NPL::InputParser); void GenerateEvent(G4Event*); void InitializeRootOutput(); void SetTarget(Target* Target) ; diff --git a/NPSimulation/Core/EventGeneratorGammaDecay.cc b/NPSimulation/Core/EventGeneratorGammaDecay.cc index 7eb33608f5e2dab2dbfe124e6727e7af04e82aeb..d7d7471ce6c8352707168fc2d483e16e6a9e7901 100644 --- a/NPSimulation/Core/EventGeneratorGammaDecay.cc +++ b/NPSimulation/Core/EventGeneratorGammaDecay.cc @@ -33,6 +33,7 @@ // NPL #include "NPOptionManager.h" #include "NPFunction.h" +#include "NPInputParser.h" using namespace NPL; // G4 headers including CLHEP headers @@ -57,147 +58,38 @@ EventGeneratorGammaDecay::~EventGeneratorGammaDecay(){ } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorGammaDecay::ReadConfiguration(string Path, int Occurence){ - ////////General Reading needs//////// - string LineBuffer; - string DataBuffer; - istringstream LineStream; - int TokenOccurence = 0 ; - //////// Setting needs/////// - unsigned int NumberOfCascade = 0; - bool ReadingStatusGammaDecay = false ; - bool CascadeStatus = false ; - - bool check_E = false; - bool check_BranchingRatio = false; - bool check_CSPath = false ; - bool check_created = false; - - int VerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); - - ////////////////////////////////////////////////////////////////////////////////////////// - ifstream InputFile; - InputFile.open(Path.c_str()); - - if (InputFile.is_open()) {} else { - return; - } - - while (!InputFile.eof() && !check_created) { - //Pick-up next line - getline(InputFile, LineBuffer); - - if (LineBuffer.compare(0, 10, "GammaDecay") == 0) { - TokenOccurence++; - if (TokenOccurence == Occurence) { - ReadingStatusGammaDecay = true ; - if(VerboseLevel==1) G4cout << "///////////////////////////////////////// " << G4endl; - // Get the nuclei name - LineStream.clear(); - LineStream.str(LineBuffer); - LineStream >> DataBuffer; - DataBuffer.erase(); - LineStream >> DataBuffer; - m_NucleiName = DataBuffer ; - if(VerboseLevel==1) G4cout << "Gamma Decay for " << m_NucleiName << G4endl; - } +void EventGeneratorGammaDecay::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("GammaCascade"); + vector<string> token = {"BranchingRatio","Energies"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "\033[1;35m//// Cascade for nuclei " << blocks[i]->GetMainValue() << endl; + if(m_NucleiName=="") + m_NucleiName = blocks[i]->GetMainValue(); + + else if(m_NucleiName!=blocks[i]->GetMainValue()){ + cout << "ERROR: The decay of only one nuclei is presently supported\033[0m" << endl; + exit(1); } - - /////////////////////////////// - /// Gamma Decay case - while(ReadingStatusGammaDecay){ - InputFile >> DataBuffer; - //Search for comment Symbol % - if (DataBuffer.compare(0, 1, "%") == 0) { InputFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - else if (DataBuffer == "Cascade") { - CascadeStatus = true ; - NumberOfCascade++; - if(VerboseLevel==1) G4cout << " Cascade " << NumberOfCascade << G4endl; - - LineStream.clear(); - LineStream.str(LineBuffer); - - // Instantiate new variable for the up coming cascade - check_E = false; - check_BranchingRatio = false; - check_CSPath = false ; - - double BranchingRatio = -1; - vector<double> E ; - string CSPath,CSName; - - while (CascadeStatus) { - getline(InputFile, LineBuffer); - LineStream.clear(); - LineStream.str(LineBuffer); - LineStream >> DataBuffer ; - - // G4cout << DataBuffer << G4endl; - - //Search for comment Symbol % - if (DataBuffer.compare(0, 1, "%") == 0) { InputFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - else if(DataBuffer == "BranchingRatio=") { - check_BranchingRatio = true; - LineStream.clear(); - LineStream.str(LineBuffer); - LineStream >> DataBuffer ; - LineStream >> DataBuffer ; - BranchingRatio = atof(DataBuffer.c_str()); - if(VerboseLevel==1) G4cout << " Branching Ratio: " << atof(DataBuffer.c_str()) << G4endl; - - } - - else if(DataBuffer == "Energies=") { - check_E = true; - if(VerboseLevel==1) G4cout << " Energies: " ; - LineStream.clear(); - LineStream.str(LineBuffer); - LineStream >> DataBuffer; - while(LineStream >> DataBuffer){ - E.push_back(atof(DataBuffer.c_str())); - if(VerboseLevel==1)G4cout << atof(DataBuffer.c_str()) << " "; - - } - if(VerboseLevel==1)G4cout << G4endl; - } - - else if(DataBuffer == "DifferentialCrossSection="){ - LineStream.clear(); - LineStream.str(LineBuffer); - LineStream >> DataBuffer >> CSPath >> CSName ; - if(VerboseLevel==1) G4cout << " Cross Section Path: " << CSPath << G4endl; - check_CSPath = true; - } - - // Cascade ended - if(check_E && check_BranchingRatio && E.size()>1){ - AddCascade(E, BranchingRatio, "_void_"); - CascadeStatus = false; - } - - if(check_E && check_BranchingRatio && (E.size()<2 && check_CSPath)){ - AddCascade(E, BranchingRatio, CSPath , CSName); - CascadeStatus = false; - } - - } - - } - - ////////////////////////////////////////////////////// - // If no Token and no comment, toggle out // - // else - // {ReadingStatusGammaDecay = false; G4cout << "WARNING : Wrong Token Sequence: Getting out " << G4endl ;} - - - if(InputFile.eof()) {ReadingStatusGammaDecay=false;check_created=true;} + + vector<double> E = blocks[i]->GetVectorDouble("Energies","MeV"); + double BranchingRatio = blocks[i]->GetDouble("BranchingRatio","void"); + vector<string> CS; + if(blocks[i]->HasToken("DifferentialCrossSection")) + CS = blocks[i]->GetVectorString("DifferentialCrossSection"); + + // Sanity Check + if(E.size()>1 && CS.size()>0){ + cout << "ERROR: Cannot use Cross section with decay of multiple gamma" << endl; } + + if(CS.size()>0) + AddCascade(E, BranchingRatio, CS[0] , CS[1]); + else + AddCascade(E, BranchingRatio); } - if(VerboseLevel==1) G4cout << "///////////////////////////////////////// " << G4endl; - InputFile.close(); - PrepareCascade(); +PrepareCascade(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -328,7 +220,7 @@ void EventGeneratorGammaDecay::PrepareCascade(){ // Check that the total ratio is not over 100% (below is allowed) if(TotalRatio>1) { - G4cout << "Gamma Decay Error: Sum of branching ratio is over 100%" << G4endl; + cout << "Gamma Decay Error: Sum of branching ratio is over 100%" << endl; exit(1); } diff --git a/NPSimulation/Core/EventGeneratorGammaDecay.hh b/NPSimulation/Core/EventGeneratorGammaDecay.hh index 197aacaa833eca55173375997fe27d3f8363d3ae..26d6806d138726d7cb531a3b5cc3915f46293bd7 100644 --- a/NPSimulation/Core/EventGeneratorGammaDecay.hh +++ b/NPSimulation/Core/EventGeneratorGammaDecay.hh @@ -37,7 +37,7 @@ using namespace std; #include "VEventGenerator.hh" #include "Target.hh" #include "ParticleStack.hh" - +#include "NPInputParser.h" // ROOT #include "TH1F.h" @@ -49,7 +49,7 @@ public: // Constructor and destructor ~EventGeneratorGammaDecay(); public: // Inherit from VEventGenerator class - void ReadConfiguration(string,int); + void ReadConfiguration(NPL::InputParser); void GenerateEvent(G4Event*); void SetTarget(Target* Target) ; diff --git a/NPSimulation/Core/EventGeneratorIsotropic.cc b/NPSimulation/Core/EventGeneratorIsotropic.cc index d3bfc7c64169919a2f092e2dfea3585e5f43fc30..96de0ad6585e3fdf11811fe20919b704644ea119 100644 --- a/NPSimulation/Core/EventGeneratorIsotropic.cc +++ b/NPSimulation/Core/EventGeneratorIsotropic.cc @@ -32,25 +32,23 @@ // NPS headers #include "EventGeneratorIsotropic.hh" -// NPl headers +// NPL headers #include "RootOutput.h" #include "NPNucleus.h" - +#include "NPOptionManager.h" using namespace CLHEP; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... EventGeneratorIsotropic::EventGeneratorIsotropic(){ - m_EnergyLow = 0 ; - m_EnergyHigh = 0 ; - m_x0 = 0 ; - m_y0 = 0 ; - m_z0 = 0 ; - m_SigmaX = 0; - m_SigmaY = 0; - m_Multiplicty.clear(); - m_particle = NULL; - m_ParticleStack = ParticleStack::getInstance(); - m_ExcitationEnergy = 0 ; + m_EnergyLow = 0 ; + m_EnergyHigh = 0 ; + m_x0 = 0 ; + m_y0 = 0 ; + m_z0 = 0 ; + m_SigmaX = 0; + m_SigmaY = 0; + m_ParticleStack = ParticleStack::getInstance(); + m_particle = NULL; } @@ -62,235 +60,99 @@ EventGeneratorIsotropic::~EventGeneratorIsotropic(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorIsotropic::ReadConfiguration(string Path,int){ - ////////General Reading needs//////// - string LineBuffer; - string DataBuffer; - istringstream LineStream; - - bool ReadingStatus = false ; - bool check_EnergyLow = false ; - bool check_EnergyHigh = false ; - bool check_HalfOpenAngleMin = false ; - bool check_HalfOpenAngleMax = false ; - bool check_x0 = false ; - bool check_y0 = false ; - bool check_z0 = false ; - bool check_particle = false ; - bool check_ExcitationEnergy = false ; - bool check_Multiplicity = false; - - ////////Reaction Setting needs/////// - string particle ; - ////////////////////////////////////////////////////////////////////////////////////////// - ifstream ReactionFile; - ReactionFile.open(Path.c_str()); - - if (ReactionFile.is_open()) {} - else { - return; - } - - while (!ReactionFile.eof()) { - //Pick-up next line - getline(ReactionFile, LineBuffer); - - if (LineBuffer.compare(0, 9, "Isotropic") == 0) { - G4cout << "///////////////////////////////////////////////////" << G4endl ; - G4cout << "Isotropic Source Found" << G4endl ; - ReadingStatus = true;} - - - - while (ReadingStatus) - { - ReactionFile >> DataBuffer; - //Search for comment Symbol % - if (DataBuffer.compare(0, 1, "%") == 0) { ReactionFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - else if (DataBuffer == "EnergyLow=") { - check_EnergyLow = true ; - ReactionFile >> DataBuffer; - m_EnergyLow = atof(DataBuffer.c_str()) * MeV; - G4cout << "Minimum energy " << m_EnergyLow / MeV << " MeV" << G4endl; - } - - else if (DataBuffer == "EnergyHigh=") { - check_EnergyHigh = true ; - ReactionFile >> DataBuffer; - m_EnergyHigh = atof(DataBuffer.c_str()) * MeV; - G4cout << "Maximum energy " << m_EnergyHigh / MeV << " MeV" << G4endl; - } - - else if (DataBuffer == "HalfOpenAngleMin=") { - check_HalfOpenAngleMin = true ; - ReactionFile >> DataBuffer; - m_HalfOpenAngleMin = atof(DataBuffer.c_str()) * deg; - G4cout << "HalfOpenAngleMin " << m_HalfOpenAngleMin / deg << " degree" << G4endl; - } - - else if (DataBuffer == "HalfOpenAngleMax=") { - check_HalfOpenAngleMax = true ; - ReactionFile >> DataBuffer; - m_HalfOpenAngleMax = atof(DataBuffer.c_str()) * deg; - G4cout << "HalfOpenAngleMax " << m_HalfOpenAngleMax / deg << " degree" << G4endl; - } - - else if (DataBuffer == "x0=") { - check_x0 = true ; - ReactionFile >> DataBuffer; - m_x0 = atof(DataBuffer.c_str()) * mm; - G4cout << "x0 " << m_x0 << " mm" << G4endl; - } - - else if (DataBuffer == "y0=") { - check_y0 = true ; - ReactionFile >> DataBuffer; - m_y0 = atof(DataBuffer.c_str()) * mm; - G4cout << "y0 " << m_y0 << " mm" << G4endl; - } - - else if (DataBuffer == "z0=" ) { - check_z0 = true ; - ReactionFile >> DataBuffer; - m_z0 = atof(DataBuffer.c_str()) * mm; - G4cout << "z0 " << m_z0 << " mm" << G4endl; - } - - else if (DataBuffer == "SigmaX=" ) { - ReactionFile >> DataBuffer; - m_SigmaX = atof(DataBuffer.c_str()) * mm; - G4cout << "SigmaX " << m_SigmaX << " mm" << G4endl; - } - - else if (DataBuffer == "SigmaY=" ) { - ReactionFile >> DataBuffer; - m_SigmaY = atof(DataBuffer.c_str()) * mm; - G4cout << "SigmaY " << m_SigmaY << " mm" << G4endl; - } - - else if (DataBuffer == "Multiplicity=" ) { - check_Multiplicity = true; - LineStream.clear(); - LineStream.str(LineBuffer); - - getline(ReactionFile, LineBuffer); - LineStream.clear(); - LineStream.str(LineBuffer); - G4cout << " Multiplicity: " ; - while(LineStream >> DataBuffer){ - m_Multiplicty.push_back(atof(DataBuffer.c_str())); - G4cout << DataBuffer << " " ; - } - G4cout << G4endl; - //ReactionFile >> DataBuffer; - //m_Multiplicty = atof(DataBuffer.c_str()); - //G4cout << "Multiplicity= " << m_Multiplicty << " " << G4endl; - } - - else if (DataBuffer=="Particle=" || DataBuffer=="particle=") { - check_particle = true ; - LineStream.clear(); - LineStream.str(LineBuffer); - - getline(ReactionFile, LineBuffer); - LineStream.clear(); - LineStream.str(LineBuffer); - G4cout << " Particle: " ; - while(LineStream >> DataBuffer){ - //m_particleName.push_back(DataBuffer); - G4cout << DataBuffer << " " ; - // Case of light particle - if(DataBuffer=="proton"){ m_particleName.push_back("1H") ; check_ExcitationEnergy = true ;} - else if(DataBuffer=="deuton"){ m_particleName.push_back("2H") ; check_ExcitationEnergy = true ;} - else if(DataBuffer=="triton"){ m_particleName.push_back("3H") ; check_ExcitationEnergy = true ;} - else if(DataBuffer=="3He" || DataBuffer=="He3") { m_particleName.push_back("3He") ; check_ExcitationEnergy = true ;} - else if(DataBuffer=="alpha") { m_particleName.push_back("4He") ; check_ExcitationEnergy = true ;} - else if(DataBuffer=="gamma") { m_particleName.push_back("gamma") ; check_ExcitationEnergy = true ;} - else if(DataBuffer=="neutron") {m_particleName.push_back("neutron") ; check_ExcitationEnergy = true ;} - else { check_ExcitationEnergy = true ;} - } - G4cout << G4endl; - } - - else if (DataBuffer=="ExcitationEnergy=") { - check_ExcitationEnergy = true ; - ReactionFile >> DataBuffer; - m_ExcitationEnergy = atof(DataBuffer.c_str()) * MeV; - G4cout << "ExcitationEnergy : " << m_ExcitationEnergy << G4endl ; - } - - // If no isotropic Token and no comment, toggle out - else - {ReadingStatus = false; G4cout << "WARNING : Wrong Token Sequence: Getting out " << G4endl ;} - - - /////////////////////////////////////////////////// - // If all Token found toggle out - if( check_EnergyLow && check_EnergyHigh && check_HalfOpenAngleMin && check_HalfOpenAngleMax && check_x0 && check_y0 && check_z0 && check_particle && check_ExcitationEnergy) - ReadingStatus = false ; - - } +void EventGeneratorIsotropic::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Isotropic"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "\033[1;35m//// Isotropic reaction found " << endl; + + vector<string> token = {"EnergyLow","EnergyHigh","HalfOpenAngleMin","HalfOpenAngleMax","x0","y0","z0","Particle"}; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + m_EnergyLow =blocks[i]->GetDouble("EnergyLow","MeV"); + m_EnergyHigh =blocks[i]->GetDouble("EnergyHigh","MeV"); + m_HalfOpenAngleMin =blocks[i]->GetDouble("HalfOpenAngleMin","deg"); + m_HalfOpenAngleMax =blocks[i]->GetDouble("HalfOpenAngleMax","deg"); + m_x0 =blocks[i]->GetDouble("x0","mm"); + m_y0 =blocks[i]->GetDouble("y0","mm"); + m_z0 =blocks[i]->GetDouble("z0","mm"); + vector<string> particleName =blocks[i]->GetVectorString("Particle"); + for(unsigned int j = 0 ; j < particleName.size() ; j++){ + if(particleName[j]=="proton"){ m_particleName.push_back("1H") ;} + else if(particleName[j]=="deuton"){ m_particleName.push_back("2H") ; } + else if(particleName[j]=="triton"){ m_particleName.push_back("3H") ; } + else if(particleName[j]=="3He" || particleName[j]=="He3") { m_particleName.push_back("3He") ; } + else if(particleName[j]=="alpha") { m_particleName.push_back("4He") ; } + else if(particleName[j]=="gamma") { m_particleName.push_back("gamma") ;} + else if(particleName[j]=="neutron") {m_particleName.push_back("neutron") ;} + } + + if(blocks[i]->HasToken("ExcitationEnergy")) + m_ExcitationEnergy =blocks[i]->GetVectorDouble("ExcitationEnergy","MeV"); + if(blocks[i]->HasToken("SigmaX")) + m_SigmaX=blocks[i]->GetDouble("SigmaX","mm"); + if(blocks[i]->HasToken("SigmaY")) + m_SigmaX=blocks[i]->GetDouble("SigmaY","mm"); + if(blocks[i]->HasToken("Multiplicity")) + m_Multiplicty=blocks[i]->GetVectorInt("Multiplicity"); } - if(check_Multiplicity==false) {m_Multiplicty.push_back(1);check_Multiplicity=true;} - - if(m_Multiplicty.size()!=m_particleName.size()) { - G4cout << "WARNING : Size of m_particleName and m_Multiplicty are different" << G4endl ; - G4cout << "Assuming m_Multiplicty=1 for all particles" << G4endl ; + else{ + cout << "ERROR: check your input file formatting \033[0m" << endl; + exit(1); } - - if( !check_EnergyLow || !check_EnergyHigh || !check_HalfOpenAngleMin || !check_HalfOpenAngleMax || !check_x0 || !check_y0 || !check_z0 || !check_particle) - {cout << "ERROR : Token Sequence Incomplete, Isotropic definition can not be Fonctionnal" << G4endl ; exit(1);} -} + } + if(m_ExcitationEnergy.size()==0) + m_ExcitationEnergy.resize(m_particleName.size(),0); + if(m_Multiplicty.size()==0) + m_Multiplicty.resize(m_particleName.size(),1); +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + void EventGeneratorIsotropic::GenerateEvent(G4Event*){ -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorIsotropic::GenerateEvent(G4Event*){ - for(unsigned int p=0; p<m_particleName.size(); p++){ - for(int i=0; i<m_Multiplicty[p]; i++){ - m_particle=NULL; - if(m_particle==NULL){ - - if(m_particleName[p]=="gamma" || m_particleName[p]=="neutron" || m_particleName[p]=="opticalphoton"){ - m_particle = G4ParticleTable::GetParticleTable()->FindParticle(m_particleName[p].c_str()); - } - else{ - NPL::Nucleus* N = new NPL::Nucleus(m_particleName[p]); - m_particle = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIon(N->GetZ(), N->GetA(),m_ExcitationEnergy); - delete N; - } - - } - - G4double cos_theta_min = cos(m_HalfOpenAngleMin); - G4double cos_theta_max = cos(m_HalfOpenAngleMax); - G4double cos_theta = cos_theta_min + (cos_theta_max - cos_theta_min) * RandFlat::shoot(); - G4double theta = acos(cos_theta) ; - G4double phi = RandFlat::shoot() * 2 * pi ; - G4double particle_energy = m_EnergyLow + RandFlat::shoot() * (m_EnergyHigh - m_EnergyLow) ; - - // Direction of particle, energy and laboratory angle - G4double momentum_x = sin(theta) * cos(phi) ; - G4double momentum_y = sin(theta) * sin(phi) ; - G4double momentum_z = cos(theta) ; - - G4double x0 = RandGauss::shoot(m_x0,m_SigmaX); - G4double y0 = RandGauss::shoot(m_y0,m_SigmaY); - - Particle particle(m_particle, theta,particle_energy,G4ThreeVector(momentum_x, momentum_y, momentum_z),G4ThreeVector(x0, y0, m_z0)); - - - m_ParticleStack->AddParticleToStack(particle); + for(int i=0; i<m_Multiplicty[p]; i++){ + m_particle=NULL; + if(m_particle==NULL){ + + if(m_particleName[p]=="gamma" || m_particleName[p]=="neutron" || m_particleName[p]=="opticalphoton"){ + m_particle = G4ParticleTable::GetParticleTable()->FindParticle(m_particleName[p].c_str()); + } + else{ + NPL::Nucleus* N = new NPL::Nucleus(m_particleName[p]); + m_particle = G4ParticleTable::GetParticleTable()->GetIonTable()->GetIon(N->GetZ(), N->GetA(),m_ExcitationEnergy[p]); + delete N; + } + } + + G4double cos_theta_min = cos(m_HalfOpenAngleMin); + G4double cos_theta_max = cos(m_HalfOpenAngleMax); + G4double cos_theta = cos_theta_min + (cos_theta_max - cos_theta_min) * RandFlat::shoot(); + G4double theta = acos(cos_theta) ; + G4double phi = RandFlat::shoot() * 2 * pi ; + G4double particle_energy = m_EnergyLow + RandFlat::shoot() * (m_EnergyHigh - m_EnergyLow) ; + + // Direction of particle, energy and laboratory angle + G4double momentum_x = sin(theta) * cos(phi) ; + G4double momentum_y = sin(theta) * sin(phi) ; + G4double momentum_z = cos(theta) ; + + G4double x0 = RandGauss::shoot(m_x0,m_SigmaX); + G4double y0 = RandGauss::shoot(m_y0,m_SigmaY); + + Particle particle(m_particle, theta,particle_energy,G4ThreeVector(momentum_x, momentum_y, momentum_z),G4ThreeVector(x0, y0, m_z0)); + + + m_ParticleStack->AddParticleToStack(particle); + } } -} + } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorIsotropic::InitializeRootOutput(){ - -} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + void EventGeneratorIsotropic::InitializeRootOutput(){ + + } diff --git a/NPSimulation/Core/EventGeneratorIsotropic.hh b/NPSimulation/Core/EventGeneratorIsotropic.hh index 04a67057020fa71fc932594810908cd888b65d2b..4388bac9963d0849818614bea25746325365281c 100644 --- a/NPSimulation/Core/EventGeneratorIsotropic.hh +++ b/NPSimulation/Core/EventGeneratorIsotropic.hh @@ -34,14 +34,14 @@ using namespace CLHEP; // NPS headers #include "VEventGenerator.hh" #include "ParticleStack.hh" - +#include "NPInputParser.h" class EventGeneratorIsotropic : public NPS::VEventGenerator{ public: // Constructor and destructor EventGeneratorIsotropic() ; virtual ~EventGeneratorIsotropic(); public: // Inherit from VEventGenerator Class - void ReadConfiguration(string,int) ; + void ReadConfiguration(NPL::InputParser) ; void GenerateEvent(G4Event*) ; void InitializeRootOutput() ; @@ -56,7 +56,7 @@ private: // Source parameter from input file G4double m_SigmaX ; G4double m_SigmaY ; G4ParticleDefinition* m_particle ; // Kind of particle to shoot isotropically - G4double m_ExcitationEnergy ; // Excitation energy of the emitted particle + vector<G4double> m_ExcitationEnergy ; // Excitation energy of the emitted particle vector<string> m_particleName ; ParticleStack* m_ParticleStack ; vector<G4int> m_Multiplicty; diff --git a/NPSimulation/Core/EventGeneratorParticleDecay.cc b/NPSimulation/Core/EventGeneratorParticleDecay.cc index e152dcd542c2f791d88cdc4dba66278943c0a008..40e5e8b4637019cc3b76c1ec31c35c7c4165c9d2 100644 --- a/NPSimulation/Core/EventGeneratorParticleDecay.cc +++ b/NPSimulation/Core/EventGeneratorParticleDecay.cc @@ -55,145 +55,46 @@ EventGeneratorParticleDecay::~EventGeneratorParticleDecay(){ } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorParticleDecay::ReadConfiguration(string Path,int Occurence){ - ////////General Reading needs//////// - string LineBuffer; - string DataBuffer; - istringstream LineStream; - int TokkenOccurence = 0; - //////// Setting needs/////// - bool ReadingStatusParticleDecay = false ; - - bool check_Daughter = false ; - bool check_shoot = false ; - bool check_created = false ; - - // Instantiate new variable for the up coming Particle - vector<string> DaughterName; - vector<double> ExcitationEnergy; - vector<bool> shoot; - string CSPath = "TGenPhaseSpace"; - string CSName ; - int VerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); - - ////////////////////////////////////////////////////////////////////////////////////////// - ifstream InputFile; - InputFile.open(Path.c_str()); - - if (InputFile.is_open()) {} - - else { - return; +void EventGeneratorParticleDecay::ReadConfiguration(NPL::InputParser parser){ + + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("ParticleDecay"); + + m_MotherNucleiName = blocks[0]->GetMainValue(); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "\033[1;35m//// Particle decay found for" << m_MotherNucleiName << endl; + + vector<string> token = {"Daughter","shoot"}; + vector<string> DaughterName; + vector<int> shoot; + vector<double> ExcitationEnergy; + string CSPath = "TGenPhaseSpace"; + string CSName = ""; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + DaughterName = blocks[i]->GetVectorString("Daughter"); + shoot = blocks[i]->GetVectorInt("shoot"); + + if(blocks[i]->HasToken("ExcitationEnergy")) + ExcitationEnergy = blocks[i]->GetVectorDouble("ExcitationEnergy","MeV"); + + if(blocks[i]->HasToken("DifferentialCrossSection")){ + vector<string> cs = blocks[i]->GetVectorString("DifferentialCrossSection"); + CSPath = cs[0]; CSName=cs[1]; + } + } - - while (!InputFile.eof()&& !check_created) { - //Pick-up next line - getline(InputFile, LineBuffer); - - if (LineBuffer.compare(0, 13, "ParticleDecay") == 0) { - TokkenOccurence++; - if(TokkenOccurence==Occurence){ - ReadingStatusParticleDecay = true ; - if(VerboseLevel==1) G4cout << "///////////////////////////////////////// " << G4endl; - // Get the nuclei name - LineStream.clear(); - LineStream.str(LineBuffer); - LineStream >> DataBuffer; - DataBuffer.erase(); - LineStream >> DataBuffer; - m_MotherNucleiName = DataBuffer ; - if(VerboseLevel==1) G4cout << "Particle Decay for " << m_MotherNucleiName << G4endl; - } - } - - /////////////////////////////// - /// Gamma Decay case - while(ReadingStatusParticleDecay){ - - InputFile >> DataBuffer; - //Search for comment Symbol % - if (DataBuffer.compare(0, 1, "%") == 0) { - InputFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - else if (DataBuffer == "Daughter=") { - check_Daughter = true ; - LineStream.clear(); - LineStream.str(LineBuffer); - - getline(InputFile, LineBuffer); - LineStream.clear(); - LineStream.str(LineBuffer); - if(VerboseLevel==1) G4cout << " Daughter: " ; - while(LineStream >> DataBuffer){ - DaughterName.push_back(DataBuffer); - if(VerboseLevel==1)G4cout << DataBuffer << " " ; - } - - if(VerboseLevel==1)G4cout << G4endl; - - } - - else if(DataBuffer == "ExcitationEnergy=") { - LineStream.clear(); - LineStream.str(LineBuffer); - - getline(InputFile, LineBuffer); - LineStream.clear(); - LineStream.str(LineBuffer); - if(VerboseLevel==1) G4cout << " Excitation Energy: " ; - while(LineStream >> DataBuffer){ - ExcitationEnergy.push_back( atof(DataBuffer.c_str()) ); - if(VerboseLevel==1) G4cout << DataBuffer << " " ; - } - - if(VerboseLevel==1) G4cout << G4endl; - } - - else if(DataBuffer == "DifferentialCrossSection=") { - LineStream.clear(); - getline(InputFile, LineBuffer); - - LineStream.str(LineBuffer); - LineStream >> CSPath >> CSName ; - if(VerboseLevel==1) G4cout << " Cross Section Path: " << CSPath << G4endl; - } - - else if(DataBuffer == "shoot=") { - check_shoot = true; - LineStream.clear(); - LineStream.str(LineBuffer); - - getline(InputFile, LineBuffer); - LineStream.clear(); - LineStream.str(LineBuffer); - if(VerboseLevel==1) G4cout << " Shoot Particle: " ; - while(LineStream >> DataBuffer){ - shoot.push_back( atof(DataBuffer.c_str()) ); - if(VerboseLevel==1)G4cout << DataBuffer << " " ; - } - - if(VerboseLevel==1)G4cout << G4endl; - } - - ////////////////////////////////////////////////////// - // If no Token and no comment, toggle out // - else - {ReadingStatusParticleDecay = false; G4cout << "ERROR : Wrong Token Sequence: Getting out " << G4endl ; - exit(1); - } - - // Decay ended - if(check_Daughter && check_shoot){ - SetDecay(DaughterName,shoot,ExcitationEnergy,CSPath,CSName); - ReadingStatusParticleDecay = false; - check_created=true; - } - } + else{ + cout << "ERROR: check your input file formatting \033[0m" << endl; + exit(1); } - - if(VerboseLevel==1) G4cout << "///////////////////////////////////////// " << G4endl; - InputFile.close(); + } + + if(ExcitationEnergy.size()==0) + ExcitationEnergy.resize(DaughterName.size(),0); + + SetDecay(DaughterName,shoot,ExcitationEnergy,CSPath,CSName); + cout << "\033[0m" ; + } @@ -321,7 +222,7 @@ void EventGeneratorParticleDecay::SetTarget(Target* Target){ } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorParticleDecay::SetDecay(vector<string> DaughterName, vector<bool> shoot, vector<double> ExcitationEnergy, string CSPath, string CSName){ +void EventGeneratorParticleDecay::SetDecay(vector<string> DaughterName, vector<int> shoot, vector<double> ExcitationEnergy, string CSPath, string CSName){ m_CrossSectionPath=CSPath; m_CrossSectionName=CSName; diff --git a/NPSimulation/Core/EventGeneratorParticleDecay.hh b/NPSimulation/Core/EventGeneratorParticleDecay.hh index b1af598e28b382bfe1b6c8fbd7080360b3a096d1..dac80080653a6966f5675c2fbd857356862e4d71 100644 --- a/NPSimulation/Core/EventGeneratorParticleDecay.hh +++ b/NPSimulation/Core/EventGeneratorParticleDecay.hh @@ -42,6 +42,7 @@ using namespace std; //NPL #include "NPFunction.h" +#include "NPInputParser.h" using namespace NPL; // Geant4 @@ -53,7 +54,7 @@ public: // Constructor and destructor ~EventGeneratorParticleDecay(); public: // Inherit from VEventGenerator class - void ReadConfiguration(string,int); + void ReadConfiguration(NPL::InputParser); void GenerateEvent(G4Event*); void SetTarget(Target* Target) ; @@ -66,7 +67,7 @@ private: // The decaying nuclei vector<G4ParticleDefinition*> m_DaughterNuclei; vector<string> m_DaughterName; vector<double> m_ExcitationEnergy; - vector<bool> m_shoot; + vector<int> m_shoot; // Used for cross section string m_DifferentialCrossSection; @@ -82,6 +83,6 @@ private: // Pointer to the Particle stack for faster acces ParticleStack* m_ParticleStack; public: // Managing the decay // Set everything for the decay - void SetDecay(vector<string> DaughterName, vector<bool> shoot, vector<double> ExcitationEnergy, string CSPath , string CSName); + void SetDecay(vector<string> DaughterName, vector<int> shoot, vector<double> ExcitationEnergy, string CSPath , string CSName); }; #endif diff --git a/NPSimulation/Core/EventGeneratorTwoBodyReaction.cc b/NPSimulation/Core/EventGeneratorTwoBodyReaction.cc index 1083a714a4d5488bbd04050fc0563ae3232559e8..60b467d9e5bad4bebcfb67a5d018b98ed428982a 100644 --- a/NPSimulation/Core/EventGeneratorTwoBodyReaction.cc +++ b/NPSimulation/Core/EventGeneratorTwoBodyReaction.cc @@ -91,8 +91,8 @@ void EventGeneratorTwoBodyReaction::Print() const{ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Inherit from VEventGenerator -void EventGeneratorTwoBodyReaction::ReadConfiguration(string Path, int){ - m_Reaction->ReadConfigurationFile(Path); +void EventGeneratorTwoBodyReaction::ReadConfiguration(NPL::InputParser parser){ + m_Reaction->ReadConfigurationFile(parser); m_ShootLight = m_Reaction->GetShoot3(); m_ShootHeavy = m_Reaction->GetShoot4();; diff --git a/NPSimulation/Core/EventGeneratorTwoBodyReaction.hh b/NPSimulation/Core/EventGeneratorTwoBodyReaction.hh index 03b7bcb38c874207e015382eec6e3e43ca3b3686..fc0dd9cd32d8e45c82838b69d927be178e5a5a45 100644 --- a/NPSimulation/Core/EventGeneratorTwoBodyReaction.hh +++ b/NPSimulation/Core/EventGeneratorTwoBodyReaction.hh @@ -55,7 +55,7 @@ class EventGeneratorTwoBodyReaction : public NPS::VEventGenerator public: // Inherit from VEventGenerator class - void ReadConfiguration(string,int); + void ReadConfiguration(NPL::InputParser); void GenerateEvent(G4Event*); void SetTarget(Target* Target) ; diff --git a/NPSimulation/Core/EventGeneratorpBUU.cc b/NPSimulation/Core/EventGeneratorpBUU.cc index 0e3b400bf7ab9127ce54157daba649d417b79177..d0ceffbf15dff18e67fbff6a545554a11f2b76ff 100644 --- a/NPSimulation/Core/EventGeneratorpBUU.cc +++ b/NPSimulation/Core/EventGeneratorpBUU.cc @@ -59,7 +59,9 @@ EventGeneratorpBUU::~EventGeneratorpBUU(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void EventGeneratorpBUU::ReadConfiguration(string Path,int){ +void EventGeneratorpBUU::ReadConfiguration(NPL::InputParser ){ + return; + string Path=""; ////////General Reading needs//////// string LineBuffer; string DataBuffer; diff --git a/NPSimulation/Core/EventGeneratorpBUU.hh b/NPSimulation/Core/EventGeneratorpBUU.hh index d397a0291f8f05c199feca7585ab81302db70cea..dd119b7fd7b6130aae30201ca8fe10d0df0f1b61 100644 --- a/NPSimulation/Core/EventGeneratorpBUU.hh +++ b/NPSimulation/Core/EventGeneratorpBUU.hh @@ -33,7 +33,7 @@ using namespace CLHEP; // NPS headers #include "VEventGenerator.hh" #include "ParticleStack.hh" - +#include "NPInputParser.h" // ROOT Headers #include "TH1F.h" #include "TH2F.h" @@ -41,11 +41,11 @@ using namespace CLHEP; class EventGeneratorpBUU : public NPS::VEventGenerator{ public: // Constructor and destructor - EventGeneratorpBUU() ; + EventGeneratorpBUU(); virtual ~EventGeneratorpBUU(); public: // Inherit from VEventGenerator Class - void ReadConfiguration(string,int) ; + void ReadConfiguration(NPL::InputParser) ; void GenerateEvent(G4Event*) ; void InitializeRootOutput() ; diff --git a/NPSimulation/Core/MaterialManager.cc b/NPSimulation/Core/MaterialManager.cc index ea9d389dde7cef5072724aed66e799ee6fa193ee..820f3e6b4c881478aaf4257c74b9e6507084f029 100644 --- a/NPSimulation/Core/MaterialManager.cc +++ b/NPSimulation/Core/MaterialManager.cc @@ -87,7 +87,7 @@ G4Material* MaterialManager::GetMaterialFromLibrary(string Name,double density){ if(it==m_Material.end()){ //Usual compound - if(Name == "Vacuum"){ + if(Name == "Vacuum"||Name=="Vaccum"||Name=="Vaccuum"||Name=="Vacum"){ if(!density) density = 0.000000001 * mg / cm3; G4Material* material = new G4Material("NPS_"+Name, density ,2); @@ -547,6 +547,15 @@ G4Material* MaterialManager::GetMaterialFromLibrary(string Name,double density){ return material; } + else if(Name == "Ca"){ + if(!density) + density = 1.54*g/cm3; + G4Material* material = new G4Material("NPS_"+Name,density,1); + material->AddElement(GetElementFromLibrary("Ca"),1); + m_Material[Name]=material; + return material; + } + else if(Name == "P10_1atm"){ if(!density) density = 1.74*mg/cm3; diff --git a/NPSimulation/Core/NPSDetectorFactory.cc b/NPSimulation/Core/NPSDetectorFactory.cc index dc04247933a3622a096a75fd2b6be55f5b365112..5b4a2a88bcf35af1c550200ba8808166e73fad60 100644 --- a/NPSimulation/Core/NPSDetectorFactory.cc +++ b/NPSimulation/Core/NPSDetectorFactory.cc @@ -19,6 +19,12 @@ std::string SHARED_LIB_EXTENSION = ".dylib"; #endif +//////////////////////////////////////////////////////////////////////////////// +G4ThreeVector NPS::ConvertVector(TVector3 vec){ + + return G4ThreeVector(vec.X(),vec.Y(),vec.Z()); +} + //////////////////////////////////////////////////////////////////////////////// DetectorFactory::DetectorFactory(){ @@ -82,7 +88,8 @@ NPS::VDetector* DetectorFactory::Construct(std::string Token){ std::string path = getenv("NPTOOL"); std::string libName = path+"/NPSimulation/lib/"+m_TokenLib[Token]; dlopen(libName.c_str(),RTLD_NOW); - + char* LibError = dlerror(); + if(m_Construct.find(Token)!=m_Construct.end()) return m_Construct[Token](); @@ -92,7 +99,7 @@ NPS::VDetector* DetectorFactory::Construct(std::string Token){ } else{ - std::cout << "Warning: Detector with Token " << Token << " has no Constructor or no Library" << std::endl; + std::cout << "Warning: Detector with Token " << Token << " has no Constructor or no Library" << endl << " error is: " << LibError << std::endl; return NULL; } } diff --git a/NPSimulation/Core/NPSDetectorFactory.hh b/NPSimulation/Core/NPSDetectorFactory.hh index 85929df1d5bc458a1abe25f9ebb245e083c55156..d81da9326cbe41f791ecc9c38a41d3cd1a03ccd1 100644 --- a/NPSimulation/Core/NPSDetectorFactory.hh +++ b/NPSimulation/Core/NPSDetectorFactory.hh @@ -4,9 +4,17 @@ #include<map> #include<string> +// Geant4 +#include"G4ThreeVector.hh" +// Root +#include"TVector3.h" + typedef NPS::VDetector* (*ClassDetectorFactoryFn)(); namespace NPS{ + // Convert fron root to g4 standard + G4ThreeVector ConvertVector(TVector3 vec); + class DetectorFactory{ private: DetectorFactory(); diff --git a/NPSimulation/Core/NPSVDetector.hh b/NPSimulation/Core/NPSVDetector.hh index 3162bf64315dd928c6a5882d066ffab9175af9af..60052097787f54a09979fa5394691fc6a29b8f1c 100644 --- a/NPSimulation/Core/NPSVDetector.hh +++ b/NPSimulation/Core/NPSVDetector.hh @@ -48,6 +48,7 @@ #include "G4MultiFunctionalDetector.hh" // NPLib header #include "TInteractionCoordinates.h" +#include "NPInputParser.h" using namespace std; using namespace CLHEP; @@ -61,7 +62,7 @@ class VDetector{ // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetectorConstruction::ReadDetectorConfiguration Method - virtual void ReadConfiguration(string) = 0; + virtual void ReadConfiguration(NPL::InputParser){}; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Core/PrimaryGeneratorAction.cc b/NPSimulation/Core/PrimaryGeneratorAction.cc index c2731f4fc5ee89f08666798ac4002e00f232937f..354229af87bd14f1fd399d91d99823331fe28e78 100644 --- a/NPSimulation/Core/PrimaryGeneratorAction.cc +++ b/NPSimulation/Core/PrimaryGeneratorAction.cc @@ -30,7 +30,7 @@ // NPL #include "NPOptionManager.h" - +#include "NPInputParser.h" // CLHEP #include "CLHEP/Random/RandGauss.h" #include "CLHEP/Random/RandGeneral.h" @@ -49,165 +49,110 @@ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... PrimaryGeneratorAction::PrimaryGeneratorAction(DetectorConstruction* det): m_detector(det){ - m_Messenger = new PrimaryGeneratorActionMessenger(this); - m_GenerateEvent = &NPS::VEventGenerator::GenerateEvent; + m_Messenger = new PrimaryGeneratorActionMessenger(this); + m_GenerateEvent = &NPS::VEventGenerator::GenerateEvent; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... PrimaryGeneratorAction::~PrimaryGeneratorAction(){ - unsigned int mysize = m_EventGenerator.size(); - for (unsigned int i = 0 ; i < mysize; i++) { - delete m_EventGenerator[i]; - } - m_EventGenerator.clear(); + unsigned int mysize = m_EventGenerator.size(); + for (unsigned int i = 0 ; i < mysize; i++) { + delete m_EventGenerator[i]; + } + m_EventGenerator.clear(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent){ - // In case the target has changed - SetTarget(); - unsigned int mysize = m_EventGenerator.size(); - for (unsigned int i = 0 ; i < mysize; i++) { - //m_EventGenerator[i]->GenerateEvent(anEvent); - (m_EventGenerator[i]->*m_GenerateEvent)(anEvent); - } - - ParticleStack::getInstance()->ShootAllParticle(anEvent); - + // In case the target has changed + SetTarget(); + unsigned int mysize = m_EventGenerator.size(); + for (unsigned int i = 0 ; i < mysize; i++) { + //m_EventGenerator[i]->GenerateEvent(anEvent); + (m_EventGenerator[i]->*m_GenerateEvent)(anEvent); + } + + ParticleStack::getInstance()->ShootAllParticle(anEvent); + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PrimaryGeneratorAction::ReadEventGeneratorFile(string Path){ - bool check_Isotropic = false; - bool check_pBUU = false; - bool check_TwoBodyReaction = false; - bool check_Beam = false; - - // You can have more than one of those - int alreadyiInstantiate_GammaDecay = 0; - int seenToken_GammaDecay = 0; - int alreadyiInstantiate_ParticleDecay = 0; - int seenToken_ParticleDecay = 0; - - if(NPOptionManager::getInstance()->GetVerboseLevel()==1) G4cout << "/////////////////////////////////////////////////// " << G4endl ; - - string LineBuffer; - ifstream EventGeneratorFile; - EventGeneratorFile.open(Path.c_str()); - - if (EventGeneratorFile.is_open()) { // should always be true - G4cout << "Event Generator file " << Path << " loading " << G4endl ; - } - else { - G4cout << "Error, Event Generator file " << Path << " found" << G4endl; - } - - while (!EventGeneratorFile.eof()) { - //Pick-up next line - getline(EventGeneratorFile, LineBuffer); - - //Search for comment Symbol % - if (LineBuffer.compare(0, 1, "%") == 0) { /*do nothing*/ - ; - } - - //Search for Isotropic source - else if (LineBuffer.compare(0, 9, "Isotropic") == 0 && !check_Isotropic) { - check_Isotropic = true; - NPS::VEventGenerator* myEventGenerator = new EventGeneratorIsotropic(); - EventGeneratorFile.close(); - myEventGenerator->ReadConfiguration(Path); - EventGeneratorFile.open(Path.c_str()); - myEventGenerator->InitializeRootOutput(); - m_EventGenerator.push_back(myEventGenerator); - } - - //Search for pBUU source - else if (LineBuffer.compare(0, 4, "pBUU") == 0 && !check_pBUU) { - check_pBUU = true; - NPS::VEventGenerator* myEventGenerator = new EventGeneratorpBUU(); - EventGeneratorFile.close(); - myEventGenerator->ReadConfiguration(Path); - EventGeneratorFile.open(Path.c_str()); - myEventGenerator->InitializeRootOutput(); - m_EventGenerator.push_back(myEventGenerator); - } - - //Search for Beam - else if (LineBuffer.compare(0, 4, "Beam") == 0 && !check_Beam) { - check_Beam = true; - NPS::VEventGenerator* myEventGenerator = new EventGeneratorBeam(); - EventGeneratorFile.close(); - myEventGenerator->ReadConfiguration(Path); - EventGeneratorFile.open(Path.c_str()); - myEventGenerator->InitializeRootOutput(); - myEventGenerator->SetTarget(m_detector->GetTarget()); - m_EventGenerator.push_back(myEventGenerator); - } - - //Search for Two body reaction - else if (LineBuffer.compare(0, 15, "TwoBodyReaction") == 0 && !check_TwoBodyReaction) { - check_TwoBodyReaction = true; - NPS::VEventGenerator* myEventGenerator = new EventGeneratorTwoBodyReaction(); - EventGeneratorFile.close(); - myEventGenerator->ReadConfiguration(Path); - EventGeneratorFile.open(Path.c_str()); - myEventGenerator->InitializeRootOutput(); - myEventGenerator->SetTarget(m_detector->GetTarget()); - m_EventGenerator.push_back(myEventGenerator); - } - - //Search for GammaDecay - else if ( LineBuffer.compare(0, 10, "GammaDecay") == 0 ) { - seenToken_GammaDecay++; - if (seenToken_GammaDecay>alreadyiInstantiate_GammaDecay) { - alreadyiInstantiate_GammaDecay++; - NPS::VEventGenerator* myEventGenerator = new EventGeneratorGammaDecay(); - EventGeneratorFile.close(); - myEventGenerator->ReadConfiguration(Path,alreadyiInstantiate_GammaDecay); - EventGeneratorFile.open(Path.c_str()); - myEventGenerator->InitializeRootOutput(); - myEventGenerator->SetTarget(m_detector->GetTarget()); - m_EventGenerator.push_back(myEventGenerator); - seenToken_GammaDecay=0; - } - - } - - //Search for ParticleDecay - else if ( LineBuffer.compare(0, 13, "ParticleDecay") == 0 ) { - seenToken_ParticleDecay++; - if(seenToken_ParticleDecay>alreadyiInstantiate_ParticleDecay){ - alreadyiInstantiate_ParticleDecay++; - NPS::VEventGenerator* myEventGenerator = new EventGeneratorParticleDecay(); - EventGeneratorFile.close(); - myEventGenerator->ReadConfiguration(Path,alreadyiInstantiate_ParticleDecay); - EventGeneratorFile.open(Path.c_str()); - myEventGenerator->InitializeRootOutput(); - myEventGenerator->SetTarget(m_detector->GetTarget()); - m_EventGenerator.push_back(myEventGenerator); - seenToken_ParticleDecay=0; - } - } - } - - EventGeneratorFile.close(); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "\033[1;35m//// Reading event generator file "<< Path << endl; + + NPL::InputParser parser(Path); + + vector<NPL::InputBlock*> blocks; + + blocks.clear(); + blocks = parser.GetAllBlocksWithToken("Isotropic"); + if (blocks.size()>0) { + NPS::VEventGenerator* myEventGenerator = new EventGeneratorIsotropic(); + myEventGenerator->ReadConfiguration(parser); + myEventGenerator->InitializeRootOutput(); + m_EventGenerator.push_back(myEventGenerator); + } + blocks.clear(); + blocks = parser.GetAllBlocksWithToken("pBUU"); + if (blocks.size()>0) { + NPS::VEventGenerator* myEventGenerator = new EventGeneratorpBUU(); + myEventGenerator->ReadConfiguration(parser); + myEventGenerator->InitializeRootOutput(); + m_EventGenerator.push_back(myEventGenerator); + } + blocks.clear(); + blocks = parser.GetAllBlocksWithToken("Beam"); + if (blocks.size()>0) { + NPS::VEventGenerator* myEventGenerator = new EventGeneratorBeam(); + myEventGenerator->ReadConfiguration(parser); + myEventGenerator->InitializeRootOutput(); + myEventGenerator->SetTarget(m_detector->GetTarget()); + m_EventGenerator.push_back(myEventGenerator); + } + blocks.clear(); + blocks = parser.GetAllBlocksWithToken("TwoBodyReaction"); + if (blocks.size()>0) { + NPS::VEventGenerator* myEventGenerator = new EventGeneratorTwoBodyReaction(); + myEventGenerator->ReadConfiguration(parser); + myEventGenerator->InitializeRootOutput(); + myEventGenerator->SetTarget(m_detector->GetTarget()); + m_EventGenerator.push_back(myEventGenerator); + } + blocks.clear(); + blocks = parser.GetAllBlocksWithToken("GammaCascade"); + if (blocks.size()>0) { + NPS::VEventGenerator* myEventGenerator = new EventGeneratorGammaDecay(); + myEventGenerator->ReadConfiguration(parser); + myEventGenerator->InitializeRootOutput(); + myEventGenerator->SetTarget(m_detector->GetTarget()); + m_EventGenerator.push_back(myEventGenerator); + } + blocks.clear(); + blocks = parser.GetAllBlocksWithToken("ParticleDecay"); + if (blocks.size()>0) { + NPS::VEventGenerator* myEventGenerator = new EventGeneratorParticleDecay(); + myEventGenerator->ReadConfiguration(parser); + myEventGenerator->InitializeRootOutput(); + myEventGenerator->SetTarget(m_detector->GetTarget()); + m_EventGenerator.push_back(myEventGenerator); + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PrimaryGeneratorAction::ClearEventGenerator(){ - unsigned int mysize = m_EventGenerator.size(); - for (unsigned int i = 0 ; i < mysize; i++) { - delete m_EventGenerator[i]; - } - - m_EventGenerator.clear(); - + unsigned int mysize = m_EventGenerator.size(); + for (unsigned int i = 0 ; i < mysize; i++) { + delete m_EventGenerator[i]; + } + + m_EventGenerator.clear(); + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PrimaryGeneratorAction::SetTarget(){ - for (unsigned int i = 0 ; i < m_EventGenerator.size(); i++) { - m_EventGenerator[i]->SetTarget(m_detector->GetTarget()); - } + for (unsigned int i = 0 ; i < m_EventGenerator.size(); i++) { + m_EventGenerator[i]->SetTarget(m_detector->GetTarget()); + } } diff --git a/NPSimulation/Core/Target.cc b/NPSimulation/Core/Target.cc index b8b862dee1f486be8152069cfa35b350cee0276f..0ffa9abb04efd029c9398f8e888eadf43fc80406 100644 --- a/NPSimulation/Core/Target.cc +++ b/NPSimulation/Core/Target.cc @@ -53,7 +53,7 @@ using namespace CLHEP ; // NPL #include "NPOptionManager.h" - +#include "NPInputParser.h" using namespace std; Target* Target::TargetInstance=0; @@ -85,227 +85,60 @@ G4Material* Target::GetMaterialFromLibrary(G4String MaterialName){ // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Target::ReadConfiguration(string Path){ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer; - string DataBuffer; - - bool ReadingStatusTarget = false ; - bool ReadingStatusCryoTarget = false ; - - bool check_Thickness = false ; - bool check_Radius = false ; - bool check_Material = false ; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - bool check_Angle = false; - bool check_Density = false ; - bool check_WinThickness = false ; - bool check_WinMaterial = false ; - - int VerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 6, "Target") == 0) { - if(VerboseLevel==1) G4cout << "Target Found" << G4endl; - m_TargetType = true ; - ReadingStatusTarget = true ; +void Target::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> starget = parser.GetAllBlocksWithToken("Target"); + vector<NPL::InputBlock*> ctarget = parser.GetAllBlocksWithToken("CryoTarget"); + + if(starget.size()==1){ + cout << "//// TARGET ////" << endl; + cout << "//// Solid Target found " << endl; + vector<string> token = {"Thickness","Radius","Material","Angle","X","Y","Z"}; + if(starget[0]->HasTokenList(token)){ + m_TargetThickness= starget[0]->GetDouble("Thickness","micrometer"); + m_TargetAngle=starget[0]->GetDouble("Angle","deg"); + m_TargetRadius=starget[0]->GetDouble("Radius","mm"); + m_TargetMaterial= GetMaterialFromLibrary(starget[0]->GetString("Material")); + m_TargetX=starget[0]->GetDouble("X","mm"); + m_TargetY=starget[0]->GetDouble("Y","mm"); + m_TargetZ=starget[0]->GetDouble("Z","mm"); } - else if (LineBuffer.compare(0, 10, "CryoTarget") == 0) { - if(VerboseLevel==1) G4cout << "Cryogenic Target Found" << G4endl; - m_TargetType = false ; - ReadingStatusCryoTarget = true ; + else{ + cout << "ERROR: Target token list incomplete, check your input file" << endl; + exit(1); } + if(starget[0]->HasToken("NBLAYERS")) + m_TargetNbLayers = starget[0]->GetInt("NBLAYERS"); - while (ReadingStatusTarget) { - ConfigFile >> DataBuffer; - //Search for comment Symbol % - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - else if (DataBuffer.compare(0, 10, "THICKNESS=") == 0) { - check_Thickness = true ; - ConfigFile >> DataBuffer; - m_TargetThickness = atof(DataBuffer.c_str()) * micrometer; - if(VerboseLevel==1) G4cout << "Target Thickness: " << m_TargetThickness / micrometer << " micrometer" << G4endl; - } - - else if (DataBuffer.compare(0, 6, "ANGLE=") == 0) { - check_Angle = true ; - ConfigFile >> DataBuffer; - m_TargetAngle = atof(DataBuffer.c_str()) * deg; - if(VerboseLevel==1) G4cout << "Target Angle: " << m_TargetAngle / deg << G4endl ; - } - - else if (DataBuffer.compare(0, 7, "RADIUS=") == 0) { - check_Radius = true ; - ConfigFile >> DataBuffer; - m_TargetRadius = atof(DataBuffer.c_str()) * mm; - if(VerboseLevel==1) G4cout << "Target Radius: " << m_TargetRadius / mm << " mm " << G4endl; - } - - else if (DataBuffer.compare(0, 9, "MATERIAL=") == 0) { - check_Material = true ; - ConfigFile >> DataBuffer; - m_TargetMaterial = GetMaterialFromLibrary(DataBuffer); - if(VerboseLevel==1) G4cout << "Target Material: " << m_TargetMaterial << G4endl ; - } - - else if (DataBuffer.compare(0, 2, "X=") == 0) { - check_X = true ; - ConfigFile >> DataBuffer; - m_TargetX = atof(DataBuffer.c_str()) * mm; - if(VerboseLevel==1) G4cout << "Target coordinate (mm): ( " << m_TargetX / mm << " ; "; - } - - else if (DataBuffer.compare(0, 2, "Y=") == 0) { - check_Y = true ; - ConfigFile >> DataBuffer; - m_TargetY = atof(DataBuffer.c_str()) * mm; - if(VerboseLevel==1) G4cout << m_TargetY / mm << " ; "; - } - else if (DataBuffer.compare(0, 2, "Z=") == 0) { - check_Z = true ; - ConfigFile >> DataBuffer; - m_TargetZ = atof(DataBuffer.c_str()) * mm; - if(VerboseLevel==1) G4cout << m_TargetZ / mm << " )" << G4endl ; - } - - else if (DataBuffer.compare(0, 9, "NBLAYERS=") == 0) { - // check_m_TargetNbLayers = true ; - ConfigFile >> DataBuffer; - m_TargetNbLayers = atoi(DataBuffer.c_str()); - if(VerboseLevel==1) - G4cout << "Number of steps for slowing down the beam in target: " - << m_TargetNbLayers << G4endl; - } - - /////////////////////////////////////////////////// - // If no Beam Token and no comment, toggle out - else{ReadingStatusTarget = false; - G4cout << "WARNING : Wrong Token Sequence: Getting out " << G4endl ; - } - - /////////////////////////////////////////////////// - // If all Token found toggle out - if( check_Thickness && check_Radius && check_Material - && check_X && check_Y && check_Z && check_Angle){ - m_EffectiveThickness = m_TargetThickness / cos(m_TargetAngle); - ReadingStatusTarget = false ; - } + } + else if(ctarget.size()==1){ + cout << " Solid Target found " << endl; + vector<string> token = {"Thickness","Radius","Material","Density","WindowsThickness","WindowsMaterial","Angle","X","Y","Z"}; + if(ctarget[0]->HasTokenList(token)){ + m_TargetThickness= ctarget[0]->GetDouble("Thickness","micrometer"); + m_TargetAngle=ctarget[0]->GetDouble("Angle","deg"); + m_TargetMaterial= GetMaterialFromLibrary(ctarget[0]->GetString("Material")); + m_WindowsThickness= ctarget[0]->GetDouble("WindowsThickness","micrometer"); + m_WindowsMaterial= GetMaterialFromLibrary(ctarget[0]->GetString("WindowsMaterial")); + m_TargetX=ctarget[0]->GetDouble("X","mm"); + m_TargetY=ctarget[0]->GetDouble("Y","mm"); + m_TargetZ =ctarget[0]->GetDouble("Z","mm"); } - - while(ReadingStatusCryoTarget){ - ConfigFile >> DataBuffer; - //Search for comment Symbol % - if (DataBuffer.compare(0, 1, "%") == 0) {/*Do Nothing*/;} - - else if (DataBuffer.compare(0, 10, "THICKNESS=") == 0) { - check_Thickness = true ; - ConfigFile >> DataBuffer; - m_TargetThickness = atof(DataBuffer.c_str()) * micrometer; - if(VerboseLevel==1) - G4cout << "Target Thickness: " << m_TargetThickness / micrometer - << "um" << G4endl ; - } - - else if (DataBuffer.compare(0, 7, "RADIUS=") == 0) { - check_Radius = true ; - ConfigFile >> DataBuffer; - m_TargetRadius = atof(DataBuffer.c_str()) * mm; - if(VerboseLevel==1) - G4cout << "Target Radius: " << m_TargetRadius / mm << "mm" << G4endl ; - } - - else if (DataBuffer.compare(0, 8, "DENSITY=") == 0) { - check_Density= true ; - ConfigFile >> DataBuffer; - if(VerboseLevel==1) m_TargetDensity = atof(DataBuffer.c_str())*g/cm3; - } - - else if (DataBuffer.compare(0, 9, "MATERIAL=") == 0) { - check_Material = true ; - ConfigFile >> DataBuffer; - m_TargetMaterial = - GetMaterialFromLibrary(DataBuffer); - if(VerboseLevel==1) - G4cout << "Target Material: " << m_TargetMaterial << G4endl; - } - - else if (DataBuffer.compare(0, 17, "WINDOWSTHICKNESS=") == 0) { - check_WinThickness = true ; - ConfigFile >> DataBuffer; - m_WindowsThickness = atof(DataBuffer.c_str()) * micrometer; - if(VerboseLevel==1) - G4cout << "Windows Thickness: " - << m_WindowsThickness / micrometer << "um" << G4endl ; - } - - else if (DataBuffer.compare(0, 16, "WINDOWSMATERIAL=") == 0) { - check_WinMaterial = true ; - ConfigFile >> DataBuffer; - m_WindowsMaterial = GetMaterialFromLibrary(DataBuffer); - if(VerboseLevel==1) - G4cout << "Windows Material: " << m_WindowsMaterial << G4endl; - } - - else if (DataBuffer.compare(0, 2, "X=") == 0) { - check_X = true ; - ConfigFile >> DataBuffer; - m_TargetX = atof(DataBuffer.c_str()) * mm; - if(VerboseLevel==1) - G4cout << "Target coordinate (mm): ( " << m_TargetX / mm << " ; "; - } - - else if (DataBuffer.compare(0, 2, "Y=") == 0) { - check_Y = true ; - ConfigFile >> DataBuffer; - m_TargetY = atof(DataBuffer.c_str()) * mm; - if(VerboseLevel==1) G4cout << m_TargetY / mm << " ; "; - } - - else if (DataBuffer.compare(0, 2, "Z=") == 0) { - check_Z = true ; - ConfigFile >> DataBuffer; - m_TargetZ = atof(DataBuffer.c_str()) * mm; - if(VerboseLevel==1) G4cout << m_TargetZ / mm << " )" << G4endl ; - } - - else if (DataBuffer.compare(0, 9, "NBLAYERS=") == 0) { - ConfigFile >> DataBuffer; - m_TargetNbLayers = atoi(DataBuffer.c_str()); - if(VerboseLevel==1) - G4cout << "Number of steps for slowing down the beam in target: " - << m_TargetNbLayers << G4endl; - } - - /////////////////////////////////////////////////// - // If no Beam Token and no comment, toggle out - else{ - ReadingStatusCryoTarget = false; - G4cout << "WARNING : Wrong Token Sequence: Getting out " << G4endl ; - } - - /////////////////////////////////////////////////// - // If all Token found toggle out - if( check_Thickness && check_Radius && check_Material && check_X - && check_Y && check_Z && check_WinThickness && check_WinMaterial - && check_Density){ - m_EffectiveThickness = m_TargetThickness / cos(m_TargetAngle); - ReadingStatusCryoTarget = false ; - } - + else{ + cout << "ERROR: Target token list incomplete, check your input file" << endl; + exit(1); } + + if(ctarget[0]->HasToken("NBLAYERS")) + m_TargetNbLayers = ctarget[0]->GetInt("NBLAYERS"); + } - // if the target as a null radius then no target exist - if(m_TargetRadius==0) { - m_TargetThickness=0; - m_TargetRadius=0.1*um; + else{ + cout << "ERROR: One and only one target shall be declared in your detector file" << endl; + exit(1); } + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/NPSimulation/Core/Target.hh b/NPSimulation/Core/Target.hh index 506c6eeaf4c62ebc21112cbeb492316bf26cb2c4..45c33930f7933bcfdb969a1d212a190801b4c2bb 100644 --- a/NPSimulation/Core/Target.hh +++ b/NPSimulation/Core/Target.hh @@ -41,7 +41,7 @@ // NPTool headers #include "NPSVDetector.hh" - +#include "NPInputParser.h" using namespace std; using namespace CLHEP; @@ -53,7 +53,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Core/VEventGenerator.hh b/NPSimulation/Core/VEventGenerator.hh index 85c1bb9b5eca037d3a42c0a6e545e1b238b9d09b..eb9012a80fe3cf1f5fb3aaa89b8b77c0eb29fedf 100644 --- a/NPSimulation/Core/VEventGenerator.hh +++ b/NPSimulation/Core/VEventGenerator.hh @@ -40,7 +40,7 @@ // NPTool headers #include "Target.hh" - +#include "NPInputParser.h" using namespace CLHEP; using namespace std; using namespace CLHEP; @@ -54,7 +54,7 @@ public: virtual ~VEventGenerator(); public: - virtual void ReadConfiguration(string,int dump=0) {dump*=1;}; + virtual void ReadConfiguration(NPL::InputParser) {}; virtual void GenerateEvent(G4Event*) {}; virtual void InitializeRootOutput() {}; diff --git a/NPSimulation/Detectors/AGATA/AGATA.cc b/NPSimulation/Detectors/AGATA/AGATA.cc index 0923f4dfff13cc480e5e021a674fcb81398f6f43..a007dd1db01d1cf7023370e744e3b703e8a9ce94 100644 --- a/NPSimulation/Detectors/AGATA/AGATA.cc +++ b/NPSimulation/Detectors/AGATA/AGATA.cc @@ -46,6 +46,7 @@ #include "RootOutput.h" #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" +#include "NPOptionManager.h" // CLHEP header #include "CLHEP/Random/RandGauss.h" @@ -75,11 +76,10 @@ AGATA::~AGATA(){ } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void AGATA::AddAGATA(double R, double Theta, double Phi, string Shape){ +void AGATA::AddAGATA(double R, double Theta, double Phi){ m_R.push_back(R); m_Theta.push_back(Theta); m_Phi.push_back(Phi); - m_Shape.push_back(Shape); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -134,156 +134,31 @@ G4AssemblyVolume* AGATA::BuildTripleCluster(){ // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void AGATA::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double Theta = 0 , Phi = 0 , R = 0 ; - double X = 0 , Y = 0 , Z = 0 ; - string Shape ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool check_Shape = false ; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - bool ReadingStatus = false ; - - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Start Up AGATA bloc, Reading toggle to true - string name = "AGATA"; - - if (LineBuffer.compare(0, name.length(), name) == 0) { - G4cout << "///" << G4endl ; - G4cout << "AGATA found: " << G4endl ; - ReadingStatus = true ; +void AGATA::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("AGATA"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> token = {"R","Theta","Phi"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + + // To be done + AddAGATA(R,Theta,Phi); } - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, name.length(),name) == 0) { - G4cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << G4endl ; - ReadingStatus = false ; - } - - //Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - if(R==0) - R=1e-12*um; - G4cout << "R: " << R/mm << G4endl; - } - - //Position method - else if (DataBuffer.compare(0, 2, "X=") == 0) { - check_X = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - X = X * mm; - G4cout << "X: " << X / mm << G4endl; - } - - else if (DataBuffer.compare(0, 2, "Y=") == 0) { - check_Y = true; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - Y = Y * mm; - G4cout << "Y: " << Y / mm << G4endl; - } - - else if (DataBuffer.compare(0, 2, "Z=") == 0) { - check_Z = true; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - Z = Z * mm; - G4cout << "Z: " << Z / mm << G4endl; - } - - - //General - else if (DataBuffer.compare(0, 6, "Shape=") == 0) { - check_Shape = true; - ConfigFile >> DataBuffer ; - Shape = DataBuffer ; - G4cout << "Shape: " << Shape << G4endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; - G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (( check_Theta && check_Phi && check_R && check_Shape) - || - ( check_X && check_Y && check_Z && check_Shape)){ - - - // Convert Cartesian to Spherical (detector always face the target) - if (check_X){ - R = sqrt (X*X+Y*Y+Z*Z); - Theta = acos(Z / (R) ); - Phi = atan2(Y,X); - } - - AddAGATA(R,Theta,Phi,Shape); - - // Reinitialisation of Check Boolean - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_Shape = false ; - check_X = false ; - check_Y = false ; - check_Z = false ; - ReadingStatus = false ; - G4cout << "///"<< G4endl ; - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } + } + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Construct detector and inialise sensitive part. diff --git a/NPSimulation/Detectors/AGATA/AGATA.hh b/NPSimulation/Detectors/AGATA/AGATA.hh index c217368e5d749d2c47c1f96bfc8adf66ddd69c33..1fe1da99f7c10045ba333231e16724fdfaa681d4 100644 --- a/NPSimulation/Detectors/AGATA/AGATA.hh +++ b/NPSimulation/Detectors/AGATA/AGATA.hh @@ -33,10 +33,10 @@ using namespace std; #include "G4AssemblyVolume.hh" #include "G4MultiFunctionalDetector.hh" #include "G4GDMLParser.hh" - // NPTool header #include "NPSVDetector.hh" #include "TAGATAData.h" +#include "NPInputParser.h" class AGATA : public NPS::VDetector{ //////////////////////////////////////////////////// @@ -53,8 +53,7 @@ class AGATA : public NPS::VDetector{ // Cylindric plastic void AddAGATA(double R, double Theta, - double Phi, - string Shape); + double Phi); G4AssemblyVolume* BuildTripleCluster(); @@ -68,7 +67,7 @@ class AGATA : public NPS::VDetector{ public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method @@ -102,9 +101,6 @@ class AGATA : public NPS::VDetector{ vector<double> m_R; vector<double> m_Theta; vector<double> m_Phi; - - // Shape type - vector<string> m_Shape ; // Needed for dynamic loading of the library public: diff --git a/NPSimulation/Detectors/AnnularS1/AnnularS1.cc b/NPSimulation/Detectors/AnnularS1/AnnularS1.cc index 0cbebabfd0cfa15d8dcf6f8f6de598c521ed9fe5..d5f031c9cc4f9d50216a3dd9ce604526ba329931 100644 --- a/NPSimulation/Detectors/AnnularS1/AnnularS1.cc +++ b/NPSimulation/Detectors/AnnularS1/AnnularS1.cc @@ -47,7 +47,7 @@ #include "SiliconScorers.hh" #include "TS1Data.h" #include "RootOutput.h" - +#include "NPOptionManager.h" // CLHEP #include "CLHEP/Random/RandGauss.h" @@ -236,62 +236,21 @@ G4LogicalVolume* AnnularS1::ConstructVolume(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void AnnularS1::ReadConfiguration(string Path){ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer, DataBuffer; - - G4double Z = 0; - bool check_Z = false; - bool check_VIS = false; - bool ReadingStatus = false; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - if (LineBuffer.compare(0, 9, "AnnularS1") == 0) { - G4cout << "///" << G4endl ; - G4cout << "Annular element found: " << G4endl ; - ReadingStatus = true ; +void AnnularS1::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("AnnularS1"); + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> token = {"Z"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + double Z = blocks[i]->GetDouble("Z","mm"); + AddModule(Z); } - else ReadingStatus = false ; - - while (ReadingStatus) { - ConfigFile >> DataBuffer; - - // Search for comment Symbol % - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Position method - else if (DataBuffer.compare(0, 2, "Z=") == 0) { - check_Z = true; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - Z = Z * mm; - G4cout << "Z: " << Z / mm << G4endl; - } - else if (DataBuffer.compare(0, 4, "VIS=") == 0) { - check_VIS = true; - ConfigFile >> DataBuffer; - if (DataBuffer.compare(0, 3, "all") == 0) m_non_sensitive_part_visiualisation = true; - } - else { - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - ReadingStatus = false; - G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl; - } - - // Add The previously define module - if (check_Z && check_VIS) { - AddModule(Z); - check_Z = false; - check_VIS = false; - ReadingStatus = false; - G4cout << "///"<< G4endl; - } + + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } } diff --git a/NPSimulation/Detectors/AnnularS1/AnnularS1.hh b/NPSimulation/Detectors/AnnularS1/AnnularS1.hh index c7432513f7bbf1f7f422612fd32aed5e3431f475..d21057d262fb18dffcfec87ad6293f752f4b54fa 100644 --- a/NPSimulation/Detectors/AnnularS1/AnnularS1.hh +++ b/NPSimulation/Detectors/AnnularS1/AnnularS1.hh @@ -29,7 +29,7 @@ using namespace CLHEP; // NPTool header #include "NPSVDetector.hh" - +#include "NPInputParser.h" // NPTool - ROOT headers #include "TS1Data.h" @@ -64,7 +64,7 @@ private: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/ComptonTelescope/ComptonTelescope.cc b/NPSimulation/Detectors/ComptonTelescope/ComptonTelescope.cc index f500dc08b8438fccd53e8e1cb68d2aefc39ed4c3..7d8af5cb3d15f37d1be62c342aead50ce1a56f5a 100644 --- a/NPSimulation/Detectors/ComptonTelescope/ComptonTelescope.cc +++ b/NPSimulation/Detectors/ComptonTelescope/ComptonTelescope.cc @@ -53,7 +53,7 @@ #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" #include "RootOutput.h" - +#include "NPOptionManager.h" // CLHEP #include "CLHEP/Random/RandGauss.h" @@ -253,268 +253,38 @@ void ComptonTelescope::VolumeMaker(G4int TelescopeNumber, // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void ComptonTelescope::ReadConfiguration(string Path) -{ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - G4double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - G4ThreeVector A , B , C , D ; - G4double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ; - - G4int TRACKER = 0, CALORIMETER = 0; - - bool ReadingStatus = false ; - - bool check_A = false ; - bool check_C = false ; - bool check_B = false ; - bool check_D = false ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 16, "ComptonTelescope") == 0) { - G4cout << "///" << G4endl ; - G4cout << "ComptonTelescope found: " << G4endl ; - ReadingStatus = true ; - } - else ReadingStatus = false; - - while (ReadingStatus) { - - ConfigFile >> DataBuffer; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 16, "ComptonTelescope") == 0) { -// G4cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << G4endl; -// ReadingStatus = false; - } - - // Position method - else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax * mm ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay * mm ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az * mm ; - - A = G4ThreeVector(Ax, Ay, Az); - G4cout << "X1 Y1 corner position : " << A << G4endl; - } - - else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx * mm ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By * mm ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz * mm ; - - B = G4ThreeVector(Bx, By, Bz); - G4cout << "X128 Y1 corner position : " << B << G4endl; - } - - else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx * mm ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy * mm ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz * mm ; - - C = G4ThreeVector(Cx, Cy, Cz); - G4cout << "X1 Y128 corner position : " << C << G4endl; - } - - else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx * mm ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy * mm ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz * mm ; - - D = G4ThreeVector(Dx, Dy, Dz); - G4cout << "X128 Y128 corner position : " << D << G4endl; - } - - // Angle method - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R / mm << G4endl; - } - - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; - } - - else if (DataBuffer.compare(0, 11, "SIZE_DSSSD=") == 0) { - ConfigFile >> DataBuffer; - m_SizeOfDSSSD = atof(DataBuffer.c_str()); - m_SizeOfDSSSD = m_SizeOfDSSSD * mm; - G4cout << "Size DSSSD: " << m_SizeOfDSSSD / mm << G4endl; - } - - else if (DataBuffer.compare(0, 13, "NUMBER_DSSSD=") == 0) { - ConfigFile >> DataBuffer; - m_NumberOfDSSSD = atoi(DataBuffer.c_str()); - G4cout << "Number of DSSSD: " << m_NumberOfDSSSD << G4endl; - } - - else if (DataBuffer.compare(0, 21, "DISTANCE_INTER_DSSSD=") == 0) { - ConfigFile >> DataBuffer; - m_DistanceInterDSSSD = atof(DataBuffer.c_str()); - m_DistanceInterDSSSD = m_DistanceInterDSSSD * mm; - G4cout << "Distance Inter DSSSD: " << m_DistanceInterDSSSD / mm << G4endl; - } - - else if (DataBuffer.compare(0, 16, "THICKNESS_DSSSD=") == 0) { - ConfigFile >> DataBuffer; - m_ThicknessOfDSSSD = atof(DataBuffer.c_str()); - m_ThicknessOfDSSSD = m_ThicknessOfDSSSD * mm; - G4cout << "Thickness DSSSD: " << m_ThicknessOfDSSSD / mm << G4endl; - } - - else if (DataBuffer.compare(0, 14, "NUMBER_STRIPS=") == 0) { - ConfigFile >> DataBuffer; - m_NumberOfStrips = atoi(DataBuffer.c_str()); - G4cout << "Number of STRIPS: " << m_NumberOfStrips << G4endl; - } - - else if (DataBuffer.compare(0, 29, "DISTANCE_TRACKER_CALORIMETER=") == 0) { - ConfigFile >> DataBuffer; - m_DistanceTrackerCalorimeter = atof(DataBuffer.c_str()); - m_DistanceTrackerCalorimeter = m_DistanceTrackerCalorimeter * mm; - G4cout << "Distance Tracker Calorimeter: " << m_DistanceTrackerCalorimeter / mm << G4endl; - } - - else if (DataBuffer.compare(0, 22, "THICKNESS_CALORIMETER=") == 0) { - ConfigFile >> DataBuffer; - m_ThicknessOfCalorimeter = atof(DataBuffer.c_str()); - m_ThicknessOfCalorimeter = m_ThicknessOfCalorimeter * mm; - G4cout << "Thickness Calorimeter: " << m_ThicknessOfCalorimeter / mm << G4endl; - } - - else if (DataBuffer.compare(0, 8, "TRACKER=") == 0) { - ConfigFile >> DataBuffer; - TRACKER = atof(DataBuffer.c_str()) ; - G4cout << "Tracker: " << TRACKER << G4endl; - } - - else if (DataBuffer.compare(0, 12, "CALORIMETER=") == 0) { - ConfigFile >> DataBuffer; - CALORIMETER = atof(DataBuffer.c_str()) ; - G4cout << "Calorimeter: " << CALORIMETER << G4endl; - } - - else if (DataBuffer.compare(0, 4, "VIS=") == 0) { - ConfigFile >> DataBuffer; - if (DataBuffer.compare(0, 3, "all") == 0) m_non_sensitive_part_visiualisation = true; - } - - else { - ReadingStatus = false; - G4cout << "other token " << DataBuffer << G4endl; - G4cout << "WARNING: Wrong Token, ComptonTelescope not added" << G4endl; - } - - //Add The previously define telescope - //With position method - if ((check_A && check_B && check_C && check_D) && !(check_Theta && check_Phi && check_R)) { - ReadingStatus = false ; - check_A = false ; - check_C = false ; - check_B = false ; - check_D = false ; - - AddModule(A , - B , - C , - D , - TRACKER == 1 , - CALORIMETER == 1); - } - - //with angle method - if ((check_Theta && check_Phi && check_R) && !(check_A && check_B && check_C && check_D)) { - ReadingStatus = false ; - check_Theta = false ; - check_Phi = false ; - check_R = false ; - - AddModule(R , - Theta , - Phi , - beta_u , - beta_v , - beta_w , - TRACKER == 1 , - CALORIMETER == 1); - } +void ComptonTelescope::ReadConfiguration(NPL::InputParser parser ){ + + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("ComptonTelescope"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> token = {"R","THETA","PHI","BETA","SIZE_DSSSD","NUMBER_DSSSD","DISTANCE_INTER_DSSSD","THICKNESS_DSSSD","NUMBER_STRIPS","DISTANCE_TRACKER_CALORIMETER","THICKNESS_CALORIMETER","TRACKER","CALORIMETER","VIS"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + m_SizeOfDSSSD = blocks[i]->GetDouble("SIZE_DSSSD","mm"); + m_NumberOfDSSSD = blocks[i]->GetInt("NUMBER_DSSSD"); + m_DistanceInterDSSSD = blocks[i]->GetDouble("DISTANCE_INTER_DSSSD","mm"); + m_ThicknessOfDSSSD= blocks[i]->GetDouble("THICKNESS_DSSSD","mm"); + m_NumberOfStrips = blocks[i]->GetInt("NUMBER_STRIPS"); + m_DistanceTrackerCalorimeter = blocks[i]->GetDouble("DISTANCE_TRACKER_CALORIMETER","mm"); + m_ThicknessOfCalorimeter = blocks[i]->GetDouble("THICKNESS_CALORIMETER","mm"); + int tracker = blocks[i]->GetInt("TRACKER"); + int calorimeter = blocks[i]->GetInt("CALORIMETER"); + m_non_sensitive_part_visiualisation = blocks[i]->GetInt("VIS"); + AddModule(R,Theta,Phi,beta[0],beta[1],beta[2],tracker== 1 ,calorimeter== 1); + } - } - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } } // Construct detector and inialise sensitive part. diff --git a/NPSimulation/Detectors/ComptonTelescope/ComptonTelescope.hh b/NPSimulation/Detectors/ComptonTelescope/ComptonTelescope.hh index a320cd2aa562f8e3fb76731db61390d20379ac3a..0d1017cc363eccb6f8a7fac50c23b7c9ac0c7329 100644 --- a/NPSimulation/Detectors/ComptonTelescope/ComptonTelescope.hh +++ b/NPSimulation/Detectors/ComptonTelescope/ComptonTelescope.hh @@ -27,7 +27,7 @@ #include "NPSVDetector.hh" #include "TComptonTelescopeData.h" #include "TComptonTelescopeProcessData.h" - +#include "NPInputParser.h" // Geant4 headers #include "G4SDManager.hh" #include "G4MultiFunctionalDetector.hh" @@ -88,7 +88,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/CsI/CsI.cc b/NPSimulation/Detectors/CsI/CsI.cc index b9843696c80a5322f67d3d67365aaced5d60e303..7e13655aed3c63ee10fa6c5764cfa18bfe9b6e7d 100644 --- a/NPSimulation/Detectors/CsI/CsI.cc +++ b/NPSimulation/Detectors/CsI/CsI.cc @@ -51,6 +51,7 @@ #include "PhotoDiodeScorers.hh" #include "CalorimeterScorers.hh" #include "NPSDetectorFactory.hh" +#include "NPOptionManager.h" //using namespace OBSOLETEGENERALSCORERS ; // CLHEP header #include "CLHEP/Random/RandGauss.h" @@ -69,9 +70,6 @@ CsI::CsI(){ ResoCsI = 2.5/2.35;// 2.5% FWHM PhotoDiodeFace = 18.;//mm PhotoDiodeThickness = 3.;//mm - - - } CsI::~CsI(){ @@ -129,238 +127,79 @@ void CsI::AddCsI( G4double R , // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void CsI::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - G4double Theta = 0 , Phi = 0 , R = 0 , Thickness = 0 , Radius = 0 ; - G4double LeadThickness = 0, X = 0 , Y = 0 , Z = 0 , FaceFront = 0 , FaceBack = 0 ; - G4String Scintillator, Shape ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool check_Thickness = false ; - bool check_Radius = false ; - bool check_LeadThickness = false ; - bool check_Scintillator = false ; - bool check_FaceFront = false ; - bool check_FaceBack = false ; - bool check_Shape = false ; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - bool ReadingStatus = false ; - - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Start Up CsI bloc, Reading toggle to true - if (LineBuffer.compare(0, 3, "CsI") == 0) { - G4cout << "///" << G4endl ; - G4cout << "CsI found: " << G4endl ; - ReadingStatus = true ; - - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); +void CsI::ReadConfiguration(NPL::InputParser parser ){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("CsI"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> cart = {"X","Y","Z"}; + vector<string> sphe = {"R","Theta","Phi"}; + vector<string> trapez= {"Shape","FaceFront","FaceBack","Thickness","Scintillator","LeadThickness"}; + vector<string> cylind= {"Shape","Radius","Thickness","Scintillator","LeadThickness"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Plastic " << i+1 << endl; + double X = blocks[i]->GetDouble("X","mm"); + double Y = blocks[i]->GetDouble("Y","mm"); + double Z = blocks[i]->GetDouble("Z","mm"); + double R = sqrt (X*X+Y*Y+Z*Z); + double Theta = acos(Z / (R) ); + double Phi = atan2(Y,X); + + if(blocks[i]->HasTokenList(trapez)){ + string Shape = blocks[i]->GetString("Shape"); + double FaceFront = blocks[i]->GetDouble("FaceFront","mm"); + double FaceBack = blocks[i]->GetDouble("FaceBack","mm"); + double Thickness = blocks[i]->GetDouble("Thickness","mm"); + string Scintillator= blocks[i]->GetString("Scintillator"); + double LeadThickness = blocks[i]->GetDouble("LeadThickness","mm"); + AddCsI(R,Theta,Phi,FaceFront,FaceBack,Thickness,Scintillator,LeadThickness); } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 3, "CsI") == 0) { - G4cout << "WARNING: Another Telescope is find before standard sequence of Token, Error may occured in Telecope definition" << G4endl ; - ReadingStatus = false ; - } - - //Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; + + else if(blocks[i]->HasTokenList(cylind)){ + string Shape = blocks[i]->GetString("Shape"); + double Radius = blocks[i]->GetDouble("Radius","mm"); + double Thickness = blocks[i]->GetDouble("Thickness","mm"); + string Scintillator= blocks[i]->GetString("Scintillator"); + double LeadThickness = blocks[i]->GetDouble("LeadThickness","mm"); + AddCsI(R,Theta,Phi,Thickness,Radius,Scintillator,LeadThickness); } - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R/mm << G4endl; - } - - //Position method - else if (DataBuffer.compare(0, 2, "X=") == 0) { - check_X = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - X = X * mm; - G4cout << "X: " << X / mm << G4endl; - } - - else if (DataBuffer.compare(0, 2, "Y=") == 0) { - check_Y = true; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - Y = Y * mm; - G4cout << "Y: " << Y / mm << G4endl; - } - - else if (DataBuffer.compare(0, 2, "Z=") == 0) { - check_Z = true; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - Z = Z * mm; - G4cout << "Z: " << Z / mm << G4endl; - } - - - //General - else if (DataBuffer.compare(0, 6, "Shape=") == 0) { - check_Shape = true; - ConfigFile >> DataBuffer ; - Shape = DataBuffer ; - G4cout << "Shape: " << Shape << G4endl; - } - - // Cylindrical shape - else if (DataBuffer.compare(0, 7, "Radius=") == 0) { - check_Radius = true; - ConfigFile >> DataBuffer ; - Radius = atof(DataBuffer.c_str()) ; - Radius = Radius * mm; - G4cout << "CsI Radius: " << Radius/mm << G4endl; - } - - // Trapezoidal shape - else if (DataBuffer.compare(0, 10, "FaceFront=") == 0) { - check_FaceFront = true; - ConfigFile >> DataBuffer ; - FaceFront = atof(DataBuffer.c_str()) ; - FaceFront = FaceFront * mm; - G4cout << "CsI FaceFront: " << FaceFront/mm << G4endl; - } - - else if (DataBuffer.compare(0, 9, "FaceBack=") == 0) { - check_FaceBack = true; - ConfigFile >> DataBuffer ; - FaceBack = atof(DataBuffer.c_str()) ; - FaceBack = FaceBack * mm; - G4cout << "CsI FaceBack: " << FaceBack/mm << G4endl; - } - - // Common - else if (DataBuffer.compare(0, 10, "Thickness=") == 0) { - check_Thickness = true; - ConfigFile >> DataBuffer ; - Thickness = atof(DataBuffer.c_str()) ; - Thickness = Thickness * mm; - G4cout << "CsI Thickness: " << Thickness/mm << G4endl; - } - - else if (DataBuffer.compare(0, 13, "Scintillator=") == 0) { - check_Scintillator = true ; - ConfigFile >> DataBuffer ; - Scintillator = DataBuffer ; - G4cout << "CsI Scintillator type: " << Scintillator << G4endl; + } + else if(blocks[i]->HasTokenList(sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Plastic " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + + if(blocks[i]->HasTokenList(trapez)){ + string Shape = blocks[i]->GetString("Shape"); + double FaceFront = blocks[i]->GetDouble("FaceFront","mm"); + double FaceBack = blocks[i]->GetDouble("FaceBack","mm"); + double Thickness = blocks[i]->GetDouble("Thickness","mm"); + string Scintillator = blocks[i]->GetString("Scintillator"); + double LeadThickness = blocks[i]->GetDouble("LeadThickness","mm"); + AddCsI(R,Theta,Phi,FaceFront,FaceBack,Thickness,Scintillator,LeadThickness); } - - else if (DataBuffer.compare(0, 14, "LeadThickness=") == 0) { - check_LeadThickness = true; - ConfigFile >> DataBuffer ; - LeadThickness = atof(DataBuffer.c_str()) ; - LeadThickness = LeadThickness * mm; - G4cout << "Lead Thickness : " << LeadThickness/mm << G4endl; + + else if(blocks[i]->HasTokenList(cylind)){ + string Shape = blocks[i]->GetString("Shape"); + double Radius = blocks[i]->GetDouble("Radius","mm"); + double Thickness = blocks[i]->GetDouble("Thickness","mm"); + string Scintillator = blocks[i]->GetString("Scintillator"); + double LeadThickness = blocks[i]->GetDouble("LeadThickness","mm"); + AddCsI(R,Theta,Phi,Thickness,Radius,Scintillator,LeadThickness); } - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; - G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - } + } - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (( check_Theta && check_Phi && check_R && check_Thickness - && check_Radius && check_LeadThickness && check_Scintillator - && check_Shape) // Cylindrical case - || - ( check_X && check_Y && check_Z && check_Thickness && check_Radius - && check_LeadThickness && check_Scintillator ) - || - ( check_Theta && check_Phi && check_R && check_Thickness - && check_FaceBack && check_FaceFront && check_LeadThickness - && check_Scintillator && check_Shape ) // Trapezoidal case - || - ( check_X && check_Y && check_Z && check_Thickness && check_FaceBack - && check_FaceFront && check_LeadThickness && check_Scintillator )) { - - if (check_X && check_Y && check_Z){ - R = sqrt (X*X+Y*Y+Z*Z); - Theta = acos(Z / (R) ); - Phi = atan2(Y,X); - } - if (Shape == "Cylinder") - AddCsI( R , - Theta , - Phi , - Thickness , - Radius , - Scintillator , - LeadThickness ); - - else if (Shape == "Trapezoidal") - AddCsI( R , - Theta , - Phi , - FaceFront , - FaceBack , - Thickness , - Scintillator , - LeadThickness ); - - // Reinitialisation of Check Boolean - - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_Thickness = false ; - check_Radius = false ; - check_LeadThickness = false ; - check_Scintillator = false ; - check_FaceFront = false ; - check_FaceBack = false ; - check_Shape = false ; - check_X = false ; - check_Y = false ; - check_Z = false ; - ReadingStatus = false ; - G4cout << "///"<< G4endl ; - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } } diff --git a/NPSimulation/Detectors/CsI/CsI.hh b/NPSimulation/Detectors/CsI/CsI.hh index 70f3b337ce29574eac6f35ffd3676a842d576ac0..a21c52d8a8dabe43483c8b961c2640cb733b71ba 100644 --- a/NPSimulation/Detectors/CsI/CsI.hh +++ b/NPSimulation/Detectors/CsI/CsI.hh @@ -14,8 +14,8 @@ * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class describe a Modular cylindrical CsI Scintillator * - * Few Material are instantiate and user can choose position and dimension * + * This class describe a Modular cylindrical CsI Scintillator * + * Few Material are instantiate and user can choose position and dimension * * but also the adding of a lead plate on the rear side of the detector * * * *---------------------------------------------------------------------------* @@ -42,7 +42,7 @@ // NPTool header #include "NPSVDetector.hh" #include "TCsIData.h" - +#include "NPInputParser.h" using namespace std; using namespace CLHEP; @@ -90,7 +90,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/Eurogam/Eurogam.cc b/NPSimulation/Detectors/Eurogam/Eurogam.cc index 165d99a6ffde49eeff52f25a5dfcaad0db8a193c..e65f40301f9a91391ea8799fe277cc222eb4fc11 100755 --- a/NPSimulation/Detectors/Eurogam/Eurogam.cc +++ b/NPSimulation/Detectors/Eurogam/Eurogam.cc @@ -49,6 +49,7 @@ #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" #include "RootOutput.h" +#include "NPOptionManager.h" using namespace OBSOLETEGENERALSCORERS; // CLHEP header @@ -100,112 +101,30 @@ void Eurogam::AddEurogamModule(G4double R, G4double Theta, G4double Phi, // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Eurogam::ReadConfiguration(string Path) -{ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer, DataBuffer; - - G4double R = 0, Theta = 0, Phi = 0; - G4double beta_u = 0, beta_v = 0, beta_w = 0; - - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; - bool ReadingStatus = false; - - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Start Up Eurogam bloc, Reading toggle to true - if (LineBuffer.compare(0, 7, "Eurogam") == 0) { - G4cout << "///" << G4endl; - G4cout << "Eurogam Module found: " << G4endl; - ReadingStatus = true; - } - // Else don't toggle to Reading Block Status - else ReadingStatus = false; - - // Reading Block - while (ReadingStatus) { - // Pickup Next Word - ConfigFile >> DataBuffer; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 7, "Eurogam") == 0) { - G4cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << G4endl; - ReadingStatus = false; - } +void Eurogam::ReadConfiguration(NPL::InputParser parser){ - // Angle method - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R/mm << G4endl; - } - - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Eurogam"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } + vector<string> token = {"R","Theta","Phi"}; - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else { - ReadingStatus = false; - G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl; - } + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + AddEurogamModule(R, Theta, Phi, beta[0], beta[1], beta[2]); + } - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if (check_Theta && check_Phi && check_R) { - AddEurogamModule(R, Theta, Phi, beta_u, beta_v, beta_w); - - // Reinitialisation of Check Boolean - check_R = false; - check_Theta = false; - check_Phi = false; - ReadingStatus = false; - G4cout << "///"<< G4endl; - } - } - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } } - - // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method void Eurogam::ConstructDetector(G4LogicalVolume* world) diff --git a/NPSimulation/Detectors/Eurogam/Eurogam.hh b/NPSimulation/Detectors/Eurogam/Eurogam.hh index 62571d736b1cc928823033c1983299365c4c027c..fe0441c85eceb652387372d982e03c46b366506c 100644 --- a/NPSimulation/Detectors/Eurogam/Eurogam.hh +++ b/NPSimulation/Detectors/Eurogam/Eurogam.hh @@ -38,96 +38,95 @@ // NPTool header #include "NPSVDetector.hh" #include "TEurogamData.h" - +#include "NPInputParser.h" using namespace std; - using namespace CLHEP; - -class Eurogam : public NPS::VDetector -{ - //////////////////////////////////////////////////// - /////// Default Constructor and Destructor ///////// - //////////////////////////////////////////////////// -public: - Eurogam() ; - virtual ~Eurogam() ; - - //////////////////////////////////////////////////// - //////// Specific Function of this Class /////////// - //////////////////////////////////////////////////// -public: - // By Angle Method - void AddEurogamModule(G4double R, G4double Theta, G4double Phi, - G4double beta_u, G4double beta_v, G4double beta_w); - - void VolumeMaker(G4int DetectorNumber, - G4ThreeVector DetectorPosition, - G4RotationMatrix* DetectorRotation, - G4LogicalVolume* world); - - - //////////////////////////////////////////////////// - ///////// Inherite from NPS::VDetector class /////////// - //////////////////////////////////////////////////// -public: - // Read stream at Configfile to pick-up parameters of detector (Position,...) - // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path); - - // Construct detector and inialise sensitive part. - // Called After DetecorConstruction::AddDetector Method - void ConstructDetector(G4LogicalVolume* world); - - // Add Detector branch to the EventTree. - // Called After DetecorConstruction::AddDetector Method - void InitializeRootOutput(); - - // Read sensitive part and fill the Root tree. - // Called at in the EventAction::EndOfEventAvtion - void ReadSensitive(const G4Event* event); - - - ///////////////////////////////////////////////// - /////////////////// Materials /////////////////// - ///////////////////////////////////////////////// -private: - void InitializeMaterial(); - G4Material* m_Material_Vacuum; - G4Material* m_Material_Aluminium; - G4Material* m_Material_Silicon; - G4Material* m_Material_Germanium; - - - ///////////////////////////////////////////////// - //////////////////// Scorers //////////////////// - ///////////////////////////////////////////////// -public: - // Initialize all Scorer used by Eurogam - void InitializeScorers(); - -private: - // Eurogam Scorer - G4MultiFunctionalDetector* m_EurogamScorer; - - - //////////////////////////////////////////////////// - ///////////Event class to store Data//////////////// - //////////////////////////////////////////////////// -private: - TEurogamData* m_Event; - - - //////////////////////////////////////////////////// - ///////////////Private intern Data////////////////// - //////////////////////////////////////////////////// -private: - // Used for "By Angle Definition" - vector<G4double> m_R; // | - vector<G4double> m_Theta; // > Spherical coordinate Eurogam volume center - vector<G4double> m_Phi; // | - vector<G4double> m_beta_u; // | - vector<G4double> m_beta_v; // > Tilt angle of the detector - vector<G4double> m_beta_w; // | -public: +using namespace CLHEP; + +class Eurogam : public NPS::VDetector{ + //////////////////////////////////////////////////// + /////// Default Constructor and Destructor ///////// + //////////////////////////////////////////////////// + public: + Eurogam() ; + virtual ~Eurogam() ; + + //////////////////////////////////////////////////// + //////// Specific Function of this Class /////////// + //////////////////////////////////////////////////// + public: + // By Angle Method + void AddEurogamModule(G4double R, G4double Theta, G4double Phi, + G4double beta_u, G4double beta_v, G4double beta_w); + + void VolumeMaker(G4int DetectorNumber, + G4ThreeVector DetectorPosition, + G4RotationMatrix* DetectorRotation, + G4LogicalVolume* world); + + + //////////////////////////////////////////////////// + ///////// Inherite from NPS::VDetector class /////////// + //////////////////////////////////////////////////// + public: + // Read stream at Configfile to pick-up parameters of detector (Position,...) + // Called in DetecorConstruction::ReadDetextorConfiguration Method + void ReadConfiguration(NPL::InputParser); + + // Construct detector and inialise sensitive part. + // Called After DetecorConstruction::AddDetector Method + void ConstructDetector(G4LogicalVolume* world); + + // Add Detector branch to the EventTree. + // Called After DetecorConstruction::AddDetector Method + void InitializeRootOutput(); + + // Read sensitive part and fill the Root tree. + // Called at in the EventAction::EndOfEventAvtion + void ReadSensitive(const G4Event* event); + + + ///////////////////////////////////////////////// + /////////////////// Materials /////////////////// + ///////////////////////////////////////////////// + private: + void InitializeMaterial(); + G4Material* m_Material_Vacuum; + G4Material* m_Material_Aluminium; + G4Material* m_Material_Silicon; + G4Material* m_Material_Germanium; + + + ///////////////////////////////////////////////// + //////////////////// Scorers //////////////////// + ///////////////////////////////////////////////// + public: + // Initialize all Scorer used by Eurogam + void InitializeScorers(); + + private: + // Eurogam Scorer + G4MultiFunctionalDetector* m_EurogamScorer; + + + //////////////////////////////////////////////////// + ///////////Event class to store Data//////////////// + //////////////////////////////////////////////////// + private: + TEurogamData* m_Event; + + + //////////////////////////////////////////////////// + ///////////////Private intern Data////////////////// + //////////////////////////////////////////////////// + private: + // Used for "By Angle Definition" + vector<G4double> m_R; // | + vector<G4double> m_Theta; // > Spherical coordinate Eurogam volume center + vector<G4double> m_Phi; // | + vector<G4double> m_beta_u; // | + vector<G4double> m_beta_v; // > Tilt angle of the detector + vector<G4double> m_beta_w; // | + public: static NPS::VDetector* Construct(); }; @@ -135,19 +134,19 @@ public: //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... namespace EUROGAMDETECTOR { - // Energy and time Resolution - const G4double ResoTime = 4.2 ;// = 10ns of Resolution // Unit is MeV/2.35 - const G4double ResoEnergy = 0.2 ;// Resolution in % + // Energy and time Resolution + const G4double ResoTime = 4.2 ;// = 10ns of Resolution // Unit is MeV/2.35 + const G4double ResoEnergy = 0.2 ;// Resolution in % - // Geometry - const G4double EurogamSize = 90*mm; - const G4double EurogamDepth = 280*mm; + // Geometry + const G4double EurogamSize = 90*mm; + const G4double EurogamDepth = 280*mm; - // definition of the -// const G4double + // definition of the + // const G4double - // Definition of the crystal -// const G4double CrystalLength = + // Definition of the crystal + // const G4double CrystalLength = } #endif diff --git a/NPSimulation/Detectors/FPDTamu/FPDTamu.cc b/NPSimulation/Detectors/FPDTamu/FPDTamu.cc index 4c523bdffed3c41ae3fd168046560d863ba0091a..8d2f8271a85db8b3c41b9e9dd1157a10cef16716 100644 --- a/NPSimulation/Detectors/FPDTamu/FPDTamu.cc +++ b/NPSimulation/Detectors/FPDTamu/FPDTamu.cc @@ -125,153 +125,9 @@ G4LogicalVolume* FPDTamu::BuildCylindricalDetector(){ // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void FPDTamu::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double Theta = 0 , Phi = 0 , R = 0 ; - double X = 0 , Y = 0 , Z = 0 ; - string Shape ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool check_Shape = false ; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - bool ReadingStatus = false ; - - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Start Up FPDTamu bloc, Reading toggle to true - string name = "FPDTamu"; - - if (LineBuffer.compare(0, name.length(), name) == 0) { - G4cout << "///" << G4endl ; - G4cout << "FPDTamu found: " << G4endl ; - ReadingStatus = true ; - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, name.length(),name) == 0) { - G4cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << G4endl ; - ReadingStatus = false ; - } +void FPDTamu::ReadConfiguration(NPL::InputParser){ - //Angle method - else if (DataBuffer == "THETA=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - - else if (DataBuffer == "PHI=" ) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - - else if (DataBuffer == "R=") { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R/mm << G4endl; - } - - //Position method - else if (DataBuffer == "X=") { - check_X = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - X = X * mm; - G4cout << "X: " << X / mm << G4endl; - } - - else if (DataBuffer == "Y=") { - check_Y = true; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - Y = Y * mm; - G4cout << "Y: " << Y / mm << G4endl; - } - - else if (DataBuffer == "Z=") { - check_Z = true; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - Z = Z * mm; - G4cout << "Z: " << Z / mm << G4endl; - } - - - //General - else if (DataBuffer == "Shape=") { - check_Shape = true; - ConfigFile >> DataBuffer ; - Shape = DataBuffer ; - G4cout << "Shape: " << Shape << G4endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; - G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (( check_Theta && check_Phi && check_R && check_Shape) - || - ( check_X && check_Y && check_Z && check_Shape)){ - - - // Convert Cartesian to Spherical (detector always face the target) - if (check_X){ - R = sqrt (X*X+Y*Y+Z*Z); - Theta = acos(Z / (R) ); - Phi = atan2(Y,X); - } - - AddFPDTamu(R,Theta,Phi,Shape); - - // Reinitialisation of Check Boolean - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_Shape = false ; - check_X = false ; - check_Y = false ; - check_Z = false ; - ReadingStatus = false ; - G4cout << "///"<< G4endl ; - } - } - } + // to be done } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/NPSimulation/Detectors/FPDTamu/FPDTamu.hh b/NPSimulation/Detectors/FPDTamu/FPDTamu.hh index 1f1e1fa773bf5eafab1f3ba97bcc51418b8d911a..fb9d540a43d6bda59e2d5fafa3d37763bf8e024b 100644 --- a/NPSimulation/Detectors/FPDTamu/FPDTamu.hh +++ b/NPSimulation/Detectors/FPDTamu/FPDTamu.hh @@ -35,7 +35,7 @@ using namespace std; // NPTool header #include "NPSVDetector.hh" #include "TFPDTamuData.h" - +#include "NPInputParser.h" class FPDTamu : public NPS::VDetector{ //////////////////////////////////////////////////// /////// Default Constructor and Destructor ///////// @@ -67,7 +67,7 @@ class FPDTamu : public NPS::VDetector{ public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/Fatima/Fatima.cc b/NPSimulation/Detectors/Fatima/Fatima.cc index 112da594e8abd499734089e5e49a58718e7d275c..c12a738ae6248fbea1473c87a6cfab0282a643bf 100644 --- a/NPSimulation/Detectors/Fatima/Fatima.cc +++ b/NPSimulation/Detectors/Fatima/Fatima.cc @@ -116,167 +116,40 @@ void Fatima::AddDetector(G4ThreeVector Pos, double beta_u, double beta_v, double // Virtual Method of NPS::VDetector class // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Fatima::ReadConfiguration(string Path){ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer, DataBuffer; - - // A,B,C,D are the four corner of the detector - - G4double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - G4ThreeVector A , B , C , D ; - G4double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ; - - bool ReadingStatus = false; - - bool check_A = false; - bool check_C = false; - bool check_B = false; - bool check_D = false; - - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 14, "FatimaDetector") == 0) { - G4cout << "///" << G4endl ; - G4cout << "Detector found: " << G4endl ; - ReadingStatus = true ; +void Fatima::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Fatima"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + // Cartesian Case + vector<string> cart = {"A","B","C","D"}; + + // Spherical Case + vector<string> sphe= {"R","THETA","PHI","BETA"}; + + if(blocks[i]->HasTokenList(cart)){ + cout << endl << "//// Fatima " << i+1 << endl; + G4ThreeVector A = NPS::ConvertVector(blocks[i]->GetTVector3("A","mm")); + G4ThreeVector B = NPS::ConvertVector(blocks[i]->GetTVector3("B","mm")); + G4ThreeVector C = NPS::ConvertVector(blocks[i]->GetTVector3("C","mm")); + G4ThreeVector D = NPS::ConvertVector(blocks[i]->GetTVector3("D","mm")); + AddDetector(A,B,C,D) ; } + else if(blocks[i]->HasTokenList(sphe)){ + cout << endl << "//// Fatima " << i+1 << endl; + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi= blocks[i]->GetDouble("PHI","deg"); + double R = blocks[i]->GetDouble("R","mm"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + R = R + 0.5*Length; + G4ThreeVector Pos(R*sin(Theta)*cos(Phi),R*sin(Theta)*sin(Phi),R*cos(Theta)); + AddDetector(Pos,beta[0],beta[1],beta[2]); + } - while (ReadingStatus) { - ConfigFile >> DataBuffer; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} - - // Position method - else if (DataBuffer == "A=") { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax * mm ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay * mm ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az * mm ; - - A = G4ThreeVector(Ax, Ay, Az); - G4cout << "Corner A position : " << A << G4endl; - } - else if (DataBuffer == "B=") { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx * mm ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By * mm ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz * mm ; - - B = G4ThreeVector(Bx, By, Bz); - G4cout << "Corner B position : " << B << G4endl; - } - - else if (DataBuffer == "C=") { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx * mm ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy * mm ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz * mm ; - - C = G4ThreeVector(Cx, Cy, Cz); - G4cout << "Corner C position : " << C << G4endl; - } - else if (DataBuffer == "D=") { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx * mm ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy * mm ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz * mm ; - - D = G4ThreeVector(Dx, Dy, Dz); - G4cout << "Corner D position : " << D << G4endl; - } - - // Angle method - else if (DataBuffer=="Theta=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - else if (DataBuffer=="Phi=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - else if (DataBuffer=="R=") { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R / mm << G4endl; - } - else if (DataBuffer=="Beta=") { - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; - } - - else G4cout << "WARNING: Wrong Token, Fatima: Dector not added" << G4endl; - - // Add The previously define telescope - // With position method - if ((check_A && check_B && check_C && check_D) && - !(check_Theta && check_Phi && check_R)) { - ReadingStatus = false; - check_A = false; - check_C = false; - check_B = false; - check_D = false; - - AddDetector(A, B, C, D); - } - - // With angle method - if ((check_Theta && check_Phi && check_R ) && - !(check_A && check_B && check_C && check_D)) { - ReadingStatus = false; - check_Theta = false; - check_Phi = false; - check_R = false; - - R = R + 0.5*Length; - G4ThreeVector Pos(R*sin(Theta)*cos(Phi),R*sin(Theta)*sin(Phi),R*cos(Theta)); - AddDetector(Pos, beta_u, beta_v, beta_w); - } + else{ + cout << "ERROR: Missing token for Fatima blocks, check your input file" << endl; + exit(1); } } } diff --git a/NPSimulation/Detectors/Fatima/Fatima.hh b/NPSimulation/Detectors/Fatima/Fatima.hh index b429edaaf10df889fb6ecc13c47a0686e7565425..b0e7ca4748c252b7d645f3d186b116685def62dd 100644 --- a/NPSimulation/Detectors/Fatima/Fatima.hh +++ b/NPSimulation/Detectors/Fatima/Fatima.hh @@ -33,7 +33,7 @@ #include "G4LogicalVolume.hh" #include "G4VisAttributes.hh" #include "G4MultiFunctionalDetector.hh" - +#include "NPInputParser.h" // NPSimulation header #include "NPSVDetector.hh" @@ -72,7 +72,7 @@ private: // Guarranty that each volume is created only once public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/GASPARD/GaspardTracker.cc b/NPSimulation/Detectors/GASPARD/GaspardTracker.cc index cd72b3094d60abe88f6ee04b57519bf814b50967..b8840de6fa156c82b6a6f85b40c068ce609c9cfa 100644 --- a/NPSimulation/Detectors/GASPARD/GaspardTracker.cc +++ b/NPSimulation/Detectors/GASPARD/GaspardTracker.cc @@ -35,6 +35,7 @@ #include "GaspardTrackerDummyShape.hh" #include "NPSDetectorFactory.hh" #include "MaterialManager.hh" +#include "NPOptionManager.h" // G4 #include "G4VisAttributes.hh" @@ -62,120 +63,97 @@ GaspardTracker::~GaspardTracker() // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void GaspardTracker::ReadConfiguration(string Path) -{ - // open configuration file - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - - bool GPDTrkSquare = false; - bool GPDTrkRectangle = false; - bool GPDTrkTrapezoid = false; - bool GPDTrkAnnular = false; - bool GPDTrkDummyShape = false; - bool GPDChamber = false; - string LineBuffer; - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 11, "GPDChamber=") == 0 && GPDChamber== false) { - GPDChamber= true; - m_Chamber = "MUGAST"; - cout << "Chamber found : " << m_Chamber << endl; - // read part of the configuration file corresponding to square elements - } +void GaspardTracker::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("GaspardTracker"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + + bool GPDTrkSquare = false; + bool GPDTrkAnnular= false; + bool GPDTrkTrapezoid= false; + bool GPDTrkDummyShape= false; + bool GPDTrkRectangle= false; - else if (LineBuffer.compare(0, 9, "GPDSquare") == 0 && GPDTrkSquare == false) { + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + + if(blocks[i]->GetMainValue() == "Square" && !GPDTrkSquare){ GPDTrkSquare = true; // instantiate a new "detector" corresponding to the Square elements GaspardTrackerModule* myDetector = new GaspardTrackerSquare(); - // read part of the configuration file corresponding to square elements - ConfigFile.close(); - myDetector->ReadConfiguration(Path); - ConfigFile.open(Path.c_str()); - - // ms_InterCoord comes from NPS::VDetector + // Pass the data object to the GaspardTracker*** object myDetector->SetInterCoordPointer(ms_InterCoord); - // store GaspardTrackerSquare "detector" + // read part of the configuration file corresponding to square elements + myDetector->ReadConfiguration(parser); m_Modules.push_back(myDetector); } - else if (LineBuffer.compare(0, 12, "GPDRectangle") == 0 && GPDTrkRectangle == false) { - GPDTrkRectangle = true; + else if(blocks[i]->GetMainValue() == "Annular" && !GPDTrkAnnular){ + GPDTrkAnnular= true; // instantiate a new "detector" corresponding to the Square elements - GaspardTrackerModule* myDetector = new GaspardTrackerRectangle(); - - // read part of the configuration file corresponding to square elements - ConfigFile.close(); - myDetector->ReadConfiguration(Path); - ConfigFile.open(Path.c_str()); + GaspardTrackerModule* myDetector = new GaspardTrackerAnnular(); - // ms_InterCoord comes from NPS::VDetector + // Pass the data object to the GaspardTracker*** object myDetector->SetInterCoordPointer(ms_InterCoord); - - // store GaspardTrackerSquare "detector" + + // read part of the configuration file corresponding to square elements + myDetector->ReadConfiguration(parser); m_Modules.push_back(myDetector); + } - else if (LineBuffer.compare(0, 12, "GPDTrapezoid") == 0 && GPDTrkTrapezoid == false) { - GPDTrkTrapezoid = true; + else if(blocks[i]->GetMainValue() == "Trapezoid" &&! GPDTrkTrapezoid){ + GPDTrkTrapezoid= true; - // instantiate a new "detector" corresponding to the Trapezoid elements + // instantiate a new "detector" corresponding to the Square elements GaspardTrackerModule* myDetector = new GaspardTrackerTrapezoid(); - // read part of the configuration file corresponding to trapezoid elements - ConfigFile.close(); - myDetector->ReadConfiguration(Path); - ConfigFile.open(Path.c_str()); - - // ms_InterCoord comes from NPS::VDetector + // Pass the data object to the GaspardTracker*** object myDetector->SetInterCoordPointer(ms_InterCoord); - // store GaspardTrackerTrapezoid "detector" + // read part of the configuration file corresponding to square elements + myDetector->ReadConfiguration(parser); m_Modules.push_back(myDetector); - } - else if (LineBuffer.compare(0, 10, "GPDAnnular") == 0 && GPDTrkAnnular == false) { - GPDTrkAnnular = true; - // instantiate a new "detector" corresponding to the Trapezoid elements - GaspardTrackerModule* myDetector = new GaspardTrackerAnnular(); + } + else if(blocks[i]->GetMainValue() == "Rectangle" && !GPDTrkRectangle){ + GPDTrkRectangle= true; - // read part of the configuration file corresponding to trapezoid elements - ConfigFile.close(); - myDetector->ReadConfiguration(Path); - ConfigFile.open(Path.c_str()); + // instantiate a new "detector" corresponding to the Square elements + GaspardTrackerModule* myDetector = new GaspardTrackerRectangle(); - // ms_InterCoord comes from NPS::VDetector + // Pass the data object to the GaspardTracker*** object myDetector->SetInterCoordPointer(ms_InterCoord); - // store GaspardTrackerTrapezoid "detector" + // read part of the configuration file corresponding to square elements + myDetector->ReadConfiguration(parser); m_Modules.push_back(myDetector); + } - else if (LineBuffer.compare(0, 13, "GPDDummyShape") == 0 && GPDTrkDummyShape == false) { - GPDTrkDummyShape = true; + else if(blocks[i]->GetMainValue() == "DummyShape" && !GPDTrkDummyShape){ + GPDTrkDummyShape= true; - // instantiate a new "detector" corresponding to the Shape elements - // The GaspardTrackerSquare class should be replaced by the - // GaspardTrackerShape class you need to define + // instantiate a new "detector" corresponding to the Square elements GaspardTrackerModule* myDetector = new GaspardTrackerDummyShape(); - // read part of the configuration file corresponding to shape elements - ConfigFile.close(); - myDetector->ReadConfiguration(Path); - ConfigFile.open(Path.c_str()); - - // ms_InterCoord comes from NPS::VDetector + // Pass the data object to the GaspardTracker*** object myDetector->SetInterCoordPointer(ms_InterCoord); - // store GaspardTrackerShape "detector" + + // read part of the configuration file corresponding to square elements + myDetector->ReadConfiguration(parser); m_Modules.push_back(myDetector); + + } + + else{ + cout << "Warning: check your input file formatting " << endl; } } } - - // Construct detector and initialize sensitive part. // Called After DetecorConstruction::AddDetector Method void GaspardTracker::ConstructDetector(G4LogicalVolume* world) diff --git a/NPSimulation/Detectors/GASPARD/GaspardTracker.hh b/NPSimulation/Detectors/GASPARD/GaspardTracker.hh index 5b1cb9da1dbddc97961e93cee618efe1b2641a7f..d216e421698660fa04316222fa26baef16af7cbe 100644 --- a/NPSimulation/Detectors/GASPARD/GaspardTracker.hh +++ b/NPSimulation/Detectors/GASPARD/GaspardTracker.hh @@ -28,7 +28,7 @@ // NPTool header #include "NPSVDetector.hh" #include "GaspardTrackerModule.hh" - +#include "NPInputParser.h" // Geant4 Header #include "G4AssemblyVolume.hh" @@ -49,7 +49,7 @@ class GaspardTracker : public NPS::VDetector{ public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/GASPARD/GaspardTrackerAnnular.cc b/NPSimulation/Detectors/GASPARD/GaspardTrackerAnnular.cc index b9219b9df01b4d24f6a0b20c29c52d393261e774..2cc0e770b6881c16125c95e97bdaaa36678fad06 100644 --- a/NPSimulation/Detectors/GASPARD/GaspardTrackerAnnular.cc +++ b/NPSimulation/Detectors/GASPARD/GaspardTrackerAnnular.cc @@ -257,115 +257,31 @@ void GaspardTrackerAnnular::VolumeMaker(G4int DetectorNumber, // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void GaspardTrackerAnnular::ReadConfiguration(string Path) -{ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - G4double Z = 0, Rmin = 0, Rmax = 0; - int FIRSTSTAGE = 0 , SECONDSTAGE = 0 , THIRDSTAGE = 0; - - - bool ReadingStatus = false ; - bool check_Z = false ; - bool check_Rmin = false ; - bool check_Rmax = false ; - bool check_FirstStage = false ; - bool check_SecondStage = false ; - bool check_ThirdStage = false ; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 10, "GPDAnnular") == 0) { - G4cout << "///" << G4endl ; - G4cout << "Annular element found: " << G4endl ; - ReadingStatus = true ;} - - while(ReadingStatus){ - - ConfigFile >> DataBuffer; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} - - - - //Position method - else if (DataBuffer.compare(0, 2, "Z=") == 0) { - check_Z = true; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - Z = Z * mm; - G4cout << "Z: " << Z / mm << G4endl; - } - - //Position method - else if (DataBuffer.compare(0, 5, "RMIN=") == 0) { - check_Rmin = true; - ConfigFile >> DataBuffer ; - Rmin = atof(DataBuffer.c_str()) ; - Rmin = Rmin * mm; - G4cout << "Rmin: " << Rmin / mm << G4endl; - } - - //Position method - else if (DataBuffer.compare(0, 5, "RMAX=") == 0) { - check_Rmax = true; - ConfigFile >> DataBuffer ; - Rmax = atof(DataBuffer.c_str()) ; - Rmax = Rmax * mm; - G4cout << "Rmax: " << Rmax / mm << G4endl; - } - - else if (DataBuffer.compare(0, 11, "FIRSTSTAGE=") == 0) { - check_FirstStage = true ; - ConfigFile >> DataBuffer; - FIRSTSTAGE = atof(DataBuffer.c_str()) ; - } - - else if (DataBuffer.compare(0, 12, "SECONDSTAGE=") == 0) { - check_SecondStage = true ; - ConfigFile >> DataBuffer; - SECONDSTAGE = atof(DataBuffer.c_str()) ; - } - - else if (DataBuffer.compare(0, 11, "THIRDSTAGE=") == 0) { - check_ThirdStage = true ; - ConfigFile >> DataBuffer; - THIRDSTAGE = atof(DataBuffer.c_str()) ; - } - - else if (DataBuffer.compare(0, 4, "VIS=") == 0) { - ConfigFile >> DataBuffer; - if (DataBuffer.compare(0, 3, "all") == 0) m_non_sensitive_part_visiualisation = true; - } - - else { - G4cout << "WARNIG: Wrong Token Sequence, GaspardTrackerAnnular: Annular Element not added" << G4endl; - } - - if (check_Z && check_Rmin && check_Rmax && check_FirstStage && check_SecondStage && check_ThirdStage) { - - ReadingStatus = false ; - check_Z = false ; - check_Rmin = false ; - check_Rmax = false ; - check_FirstStage = false ; - check_SecondStage = false ; - check_ThirdStage = false ; - - AddModule(Z, - Rmin, - Rmax, - FIRSTSTAGE == 1 , - SECONDSTAGE == 1 , - THIRDSTAGE == 1); - } - - +void GaspardTrackerAnnular::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("GaspardTracker"); + vector<string> tokenp= {"Z","RMIN","RMAX"}; + + vector<string> token={"FIRSTSTAGE","SECONDSTAGE","THIRDSTAGE"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->GetMainValue() == "Annular" && blocks[i]->HasTokenList(token) ){ + bool first = blocks[i]->GetInt("FIRSTSTAGE"); + bool second = blocks[i]->GetInt("SECONDSTAGE"); + bool third = blocks[i]->GetInt("THIRDSTAGE"); + m_non_sensitive_part_visiualisation = blocks[i]->GetInt("VIS"); + if(blocks[i]->HasTokenList(tokenp)){ + // Add module + double Z = blocks[i]->GetDouble("Z","mm"); + double Rmin = blocks[i]->GetDouble("Rmin","mm"); + double Rmax = blocks[i]->GetDouble("Rmax","mm"); + AddModule(Z,Rmin,Rmax,first,second,third); } - } + else{ + cout << "ERROR: Check input formatting for Gaspard" << endl; + exit(1); + } + } + } } // Construct detector and inialise sensitive part. diff --git a/NPSimulation/Detectors/GASPARD/GaspardTrackerAnnular.hh b/NPSimulation/Detectors/GASPARD/GaspardTrackerAnnular.hh index fedf2c8e301493e132fb9b31f7347331885e5966..636f615b5849d9ff873cc9fb96b66f75d9b4183b 100644 --- a/NPSimulation/Detectors/GASPARD/GaspardTrackerAnnular.hh +++ b/NPSimulation/Detectors/GASPARD/GaspardTrackerAnnular.hh @@ -28,7 +28,7 @@ // NPTool header #include "GaspardTrackerModule.hh" #include "TInteractionCoordinates.h" - +#include "NPInputParser.h" using namespace std; using namespace CLHEP; @@ -72,7 +72,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/GASPARD/GaspardTrackerDummyShape.cc b/NPSimulation/Detectors/GASPARD/GaspardTrackerDummyShape.cc index 8c63df2b283f628dd099b85152f2f8371fbd7980..f654d70f006acda9e7367e22e055ad537d1c293c 100644 --- a/NPSimulation/Detectors/GASPARD/GaspardTrackerDummyShape.cc +++ b/NPSimulation/Detectors/GASPARD/GaspardTrackerDummyShape.cc @@ -58,6 +58,8 @@ #include "GaspardScorers.hh" #include "RootOutput.h" #include "NPSVDetector.hh" +#include "NPOptionManager.h" +#include "NPSDetectorFactory.hh" // CLHEP #include "CLHEP/Random/RandGauss.h" @@ -329,216 +331,44 @@ void GaspardTrackerDummyShape::VolumeMaker(G4int DetectorNumber, // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void GaspardTrackerDummyShape::ReadConfiguration(string Path) -{ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer, DataBuffer; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - G4double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - G4ThreeVector A , B , C , D ; - G4double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ; - int FIRSTSTAGE = 0 , SECONDSTAGE = 0 , THIRDSTAGE = 0 ; - int NSTRIP = 128; - - bool ReadingStatus = false; - - bool check_A = false; - bool check_C = false; - bool check_B = false; - bool check_D = false; - - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; - - bool check_FirstStage = false; - bool check_SecondStage = false; - bool check_ThirdStage = false; - bool checkVis = false; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 13, "GPDDummyShape") == 0) { - G4cout << "///" << G4endl ; - G4cout << "DummyShape element found: " << G4endl ; - ReadingStatus = true ; +void GaspardTrackerDummyShape::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("GaspardTracker"); + vector<string> token_cart= {"X1_Y1","X128_Y1","X1_Y128","X128_Y128"}; + vector<string> token_sphe= {"R","THETA","PHI","BETA"}; + + vector<string> token={"FIRSTSTAGE","SECONDSTAGE","THIRDSTAGE"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->GetMainValue() == "DummyShape" && blocks[i]->HasTokenList(token) ){ + + bool first = blocks[i]->GetInt("FIRSTSTAGE"); + bool second = blocks[i]->GetInt("SECONDSTAGE"); + bool third = blocks[i]->GetInt("THIRDSTAGE"); + if(blocks[i]->HasToken("VIS")) + m_non_sensitive_part_visiualisation = blocks[i]->GetInt("VIS"); + + if(blocks[i]->HasTokenList(token_cart)){ + // Add module + G4ThreeVector A = NPS::ConvertVector(blocks[i]->GetTVector3("X1_Y1","mm")); + G4ThreeVector B = NPS::ConvertVector(blocks[i]->GetTVector3("X128_Y1","mm")); + G4ThreeVector C = NPS::ConvertVector(blocks[i]->GetTVector3("X1_Y128","mm")); + G4ThreeVector D = NPS::ConvertVector(blocks[i]->GetTVector3("X128_Y128","mm")); + + AddModule(A,B,C,D,first,second,third); } - - while (ReadingStatus) { - ConfigFile >> DataBuffer; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} - - // Position method - else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax * mm ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay * mm ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az * mm ; - - A = G4ThreeVector(Ax, Ay, Az); - G4cout << "X1 Y1 corner position : " << A << G4endl; - } - else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx * mm ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By * mm ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz * mm ; - - B = G4ThreeVector(Bx, By, Bz); - G4cout << "X128 Y1 corner position : " << B << G4endl; - } - else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx * mm ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy * mm ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz * mm ; - - C = G4ThreeVector(Cx, Cy, Cz); - G4cout << "X1 Y128 corner position : " << C << G4endl; - } - else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx * mm ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy * mm ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz * mm ; - - D = G4ThreeVector(Dx, Dy, Dz); - G4cout << "X128 Y128 corner position : " << D << G4endl; - } - - // Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R / mm << G4endl; - } - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; - } - - else if (DataBuffer.compare(0, 11, "FIRSTSTAGE=") == 0) { - check_FirstStage = true ; - ConfigFile >> DataBuffer; - FIRSTSTAGE = atof(DataBuffer.c_str()) ; - } - else if (DataBuffer.compare(0, 12, "SECONDSTAGE=") == 0) { - check_SecondStage = true ; - ConfigFile >> DataBuffer; - SECONDSTAGE = atof(DataBuffer.c_str()) ; - } - else if (DataBuffer.compare(0, 11, "THIRDSTAGE=") == 0) { - check_ThirdStage = true ; - ConfigFile >> DataBuffer; - THIRDSTAGE = atof(DataBuffer.c_str()) ; - } - - else if (DataBuffer.compare(0, 7, "NSTRIP=") == 0) { - ConfigFile >> DataBuffer; - NSTRIP = atof(DataBuffer.c_str()) ; - NSTRIP *= 1; - } - - else if (DataBuffer.compare(0, 4, "VIS=") == 0) { - checkVis = true ; - ConfigFile >> DataBuffer; - if (DataBuffer.compare(0, 3, "all") == 0) m_non_sensitive_part_visiualisation = true; - } - - else G4cout << "WARNING: Wrong Token, GaspardTrackerDummyShape: DummyShape Element not added" << G4endl; - - // Add The previously define telescope - // With position method - if ((check_A && check_B && check_C && check_D && check_FirstStage && check_SecondStage && check_ThirdStage && checkVis) && - !(check_Theta && check_Phi && check_R)) { - ReadingStatus = false; - check_A = false; - check_C = false; - check_B = false; - check_D = false; - check_FirstStage = false; - check_SecondStage = false; - check_ThirdStage = false; - checkVis = false; - - AddModule(A, B, C, D, FIRSTSTAGE == 1, SECONDSTAGE == 1, THIRDSTAGE == 1); - } - - // With angle method - if ((check_Theta && check_Phi && check_R && check_FirstStage && check_SecondStage && check_ThirdStage && checkVis) && - !(check_A && check_B && check_C && check_D)) { - ReadingStatus = false; - check_Theta = false; - check_Phi = false; - check_R = false; - check_FirstStage = false; - check_SecondStage = false; - check_ThirdStage = false; - checkVis = false; - - AddModule(R, Theta, Phi, beta_u, beta_v, beta_w, FIRSTSTAGE == 1, SECONDSTAGE == 1, THIRDSTAGE == 1); - } + else if(blocks[i]->HasTokenList(token_sphe)){ + // Add module + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + + AddModule(R,Theta,Phi,beta[0],beta[1],beta[2],first,second,third); } - } + } + } } - - // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method void GaspardTrackerDummyShape::ConstructDetector(G4LogicalVolume* world) diff --git a/NPSimulation/Detectors/GASPARD/GaspardTrackerDummyShape.hh b/NPSimulation/Detectors/GASPARD/GaspardTrackerDummyShape.hh index 4c0d16e9affd271e5d68b536f3a7d22883bd0315..318806916248424105972cba8a519a226c2d3cef 100644 --- a/NPSimulation/Detectors/GASPARD/GaspardTrackerDummyShape.hh +++ b/NPSimulation/Detectors/GASPARD/GaspardTrackerDummyShape.hh @@ -31,9 +31,9 @@ // NPTool header #include "GaspardTrackerModule.hh" #include "TInteractionCoordinates.h" - +#include "NPInputParser.h" using namespace std; - using namespace CLHEP; +using namespace CLHEP; @@ -87,7 +87,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/GASPARD/GaspardTrackerModule.hh b/NPSimulation/Detectors/GASPARD/GaspardTrackerModule.hh index 3b5309e6c29ec2edef0405a343d5d8b9b45aba2e..50fdabb435e34a796c11543d0a4c358dfa7fdb89 100644 --- a/NPSimulation/Detectors/GASPARD/GaspardTrackerModule.hh +++ b/NPSimulation/Detectors/GASPARD/GaspardTrackerModule.hh @@ -35,11 +35,9 @@ // NPTool - ROOT headers #include "TInteractionCoordinates.h" #include "TGaspardTrackerData.h" - +#include "NPInputParser.h" using namespace std; - using namespace CLHEP; - - +using namespace CLHEP; class GaspardTrackerModule { @@ -49,7 +47,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) - virtual void ReadConfiguration(string Path) = 0; + virtual void ReadConfiguration(NPL::InputParser) = 0; // Construct detector and inialise sensitive part. virtual void ConstructDetector(G4LogicalVolume* world) = 0; diff --git a/NPSimulation/Detectors/GASPARD/GaspardTrackerRectangle.cc b/NPSimulation/Detectors/GASPARD/GaspardTrackerRectangle.cc index ec57ab53d79a27dd10164507d6339368ddd4c2dd..9524afd90c9cefbe98e5d8d11fb5997951f93d84 100644 --- a/NPSimulation/Detectors/GASPARD/GaspardTrackerRectangle.cc +++ b/NPSimulation/Detectors/GASPARD/GaspardTrackerRectangle.cc @@ -54,6 +54,8 @@ #include "NPSDetectorFactory.hh" #include "RootOutput.h" #include "NPSVDetector.hh" +#include "NPSDetectorFactory.hh" +#include "NPOptionManager.h" // CLHEP #include "CLHEP/Random/RandGauss.h" @@ -282,232 +284,42 @@ void GaspardTrackerRectangle::VolumeMaker(G4int DetectorNumber, // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void GaspardTrackerRectangle::ReadConfiguration(string Path) -{ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - G4double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - G4ThreeVector A , B , C , D ; - G4double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ; - int FIRSTSTAGE = 0 , SECONDSTAGE = 0 , THIRDSTAGE = 0 ; - - bool ReadingStatus = false ; - - bool check_A = false ; - bool check_C = false ; - bool check_B = false ; - bool check_D = false ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - - bool check_FirstStage = false ; - bool check_SecondStage = false ; - bool check_ThirdStage = false ; - bool checkVis = false ; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 12, "GPDRectangle") == 0) { - G4cout << "///" << G4endl ; - G4cout << "Rectangle element found: " << G4endl ; - ReadingStatus = true ; - } - - while(ReadingStatus){ - - ConfigFile >> DataBuffer; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} +void GaspardTrackerRectangle::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("GaspardTracker"); + vector<string> token_cart= {"X1_Y1","X128_Y1","X1_Y128","X128_Y128"}; + vector<string> token_sphe= {"R","THETA","PHI","BETA"}; + + vector<string> token={"FIRSTSTAGE","SECONDSTAGE","THIRDSTAGE"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->GetMainValue() == "Rectangle" && blocks[i]->HasTokenList(token) ){ + + bool first = blocks[i]->GetInt("FIRSTSTAGE"); + bool second = blocks[i]->GetInt("SECONDSTAGE"); + bool third = blocks[i]->GetInt("THIRDSTAGE"); + if(blocks[i]->HasToken("VIS")) + m_non_sensitive_part_visiualisation = blocks[i]->GetInt("VIS"); + + if(blocks[i]->HasTokenList(token_cart)){ + // Add module + G4ThreeVector A = NPS::ConvertVector(blocks[i]->GetTVector3("X1_Y1","mm")); + G4ThreeVector B = NPS::ConvertVector(blocks[i]->GetTVector3("X128_Y1","mm")); + G4ThreeVector C = NPS::ConvertVector(blocks[i]->GetTVector3("X1_Y128","mm")); + G4ThreeVector D = NPS::ConvertVector(blocks[i]->GetTVector3("X128_Y128","mm")); - // Position method - else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax * mm ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay * mm ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az * mm ; - - A = G4ThreeVector(Ax, Ay, Az); - G4cout << "X1 Y1 corner position : " << A << G4endl; - G4cout << mm << G4endl; - } - - else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx * mm ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By * mm ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz * mm ; - - B = G4ThreeVector(Bx, By, Bz); - G4cout << "X128 Y1 corner position : " << B << G4endl; - } - - else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx * mm ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy * mm ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz * mm ; - - C = G4ThreeVector(Cx, Cy, Cz); - G4cout << "X1 Y128 corner position : " << C << G4endl; - } - - else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx * mm ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy * mm ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz * mm ; - - D = G4ThreeVector(Dx, Dy, Dz); - G4cout << "X128 Y128 corner position : " << D << G4endl; - } - - - // Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R / mm << G4endl; - } - - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; - } - - else if (DataBuffer.compare(0, 11, "FIRSTSTAGE=") == 0) { - check_FirstStage = true ; - ConfigFile >> DataBuffer; - FIRSTSTAGE = atof(DataBuffer.c_str()) ; - } - - else if (DataBuffer.compare(0, 12, "SECONDSTAGE=") == 0) { - check_SecondStage = true ; - ConfigFile >> DataBuffer; - SECONDSTAGE = atof(DataBuffer.c_str()) ; - } - - else if (DataBuffer.compare(0, 11, "THIRDSTAGE=") == 0) { - check_ThirdStage = true ; - ConfigFile >> DataBuffer; - THIRDSTAGE = atof(DataBuffer.c_str()) ; - } - - else if (DataBuffer.compare(0, 4, "VIS=") == 0) { - checkVis = true ; - ConfigFile >> DataBuffer; - if (DataBuffer.compare(0, 3, "all") == 0) m_non_sensitive_part_visiualisation = true; - } - - else G4cout << "WARNING: Wrong Token, GaspardTrackerRectangle: Rectangle Element not added" << G4endl; - - //Add The previously define telescope - //With position method - if ((check_A && check_B && check_C && check_D && check_FirstStage && check_SecondStage && check_ThirdStage && checkVis) && !(check_Theta && check_Phi && check_R)) { - - ReadingStatus = false ; - check_A = false ; - check_C = false ; - check_B = false ; - check_D = false ; - check_FirstStage = false ; - check_SecondStage = false ; - check_ThirdStage = false ; - checkVis = false ; - - AddModule(A , - B , - C , - D , - FIRSTSTAGE == 1 , - SECONDSTAGE == 1 , - THIRDSTAGE == 1); - } - - //with angle method - if ((check_Theta && check_Phi && check_R && check_FirstStage && check_SecondStage && check_ThirdStage && checkVis) && !(check_A && check_B && check_C && check_D)) { - ReadingStatus = false ; - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_FirstStage = false ; - check_SecondStage = false ; - check_ThirdStage = false ; - checkVis = false ; - - AddModule(R , - Theta , - Phi , - beta_u , - beta_v , - beta_w , - FIRSTSTAGE == 1 , - SECONDSTAGE == 1 , - THIRDSTAGE == 1); - } - - + AddModule(A,B,C,D,first,second,third); } - } + else if(blocks[i]->HasTokenList(token_sphe)){ + // Add module + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + + AddModule(R,Theta,Phi,beta[0],beta[1],beta[2],first,second,third); + } + } + } } // Construct detector and inialise sensitive part. diff --git a/NPSimulation/Detectors/GASPARD/GaspardTrackerRectangle.hh b/NPSimulation/Detectors/GASPARD/GaspardTrackerRectangle.hh index 26e2d58eca9cbe5c1d648a007bb3e2f74ccfdc93..2de82c564b3ba731103c73c82cd3254d19d49b01 100644 --- a/NPSimulation/Detectors/GASPARD/GaspardTrackerRectangle.hh +++ b/NPSimulation/Detectors/GASPARD/GaspardTrackerRectangle.hh @@ -29,7 +29,7 @@ // NPTool header #include "GaspardTrackerModule.hh" #include "TInteractionCoordinates.h" - +#include "NPInputParser.h" using namespace std; using namespace CLHEP; @@ -84,7 +84,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/GASPARD/GaspardTrackerSquare.cc b/NPSimulation/Detectors/GASPARD/GaspardTrackerSquare.cc index 9a960b4de103c118ffe532d3f016e862a6b9aeea..5e1c257059813d6f4c859955afa2cfe45bcd28ec 100644 --- a/NPSimulation/Detectors/GASPARD/GaspardTrackerSquare.cc +++ b/NPSimulation/Detectors/GASPARD/GaspardTrackerSquare.cc @@ -58,7 +58,8 @@ #include "NPSDetectorFactory.hh" #include "RootOutput.h" #include "NPSVDetector.hh" - +#include "NPOptionManager.h" +#include "NPSDetectorFactory.hh" // CLHEP #include "CLHEP/Random/RandGauss.h" @@ -269,231 +270,42 @@ void GaspardTrackerSquare::VolumeMaker(G4int DetectorNumber, // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void GaspardTrackerSquare::ReadConfiguration(string Path) -{ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - G4double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - G4ThreeVector A , B , C , D ; - G4double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ; - int FIRSTSTAGE = 0 , SECONDSTAGE = 0 , THIRDSTAGE = 0 ; - - bool ReadingStatus = false ; - - bool check_A = false ; - bool check_C = false ; - bool check_B = false ; - bool check_D = false ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - - bool check_FirstStage = false ; - bool check_SecondStage = false ; - bool check_ThirdStage = false ; - bool checkVis = false ; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 9, "GPDSquare") == 0) { - G4cout << "///" << G4endl ; - G4cout << "Square element found: " << G4endl ; - ReadingStatus = true ; - } - - while(ReadingStatus){ - - ConfigFile >> DataBuffer; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} +void GaspardTrackerSquare::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("GaspardTracker"); + vector<string> token_cart= {"X1_Y1","X128_Y1","X1_Y128","X128_Y128"}; + vector<string> token_sphe= {"R","THETA","PHI","BETA"}; + + vector<string> token={"FIRSTSTAGE","SECONDSTAGE","THIRDSTAGE"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->GetMainValue() == "Square" && blocks[i]->HasTokenList(token) ){ + + bool first = blocks[i]->GetInt("FIRSTSTAGE"); + bool second = blocks[i]->GetInt("SECONDSTAGE"); + bool third = blocks[i]->GetInt("THIRDSTAGE"); + if(blocks[i]->HasToken("VIS")) + m_non_sensitive_part_visiualisation = blocks[i]->GetInt("VIS"); + + if(blocks[i]->HasTokenList(token_cart)){ + // Add module + G4ThreeVector A = NPS::ConvertVector(blocks[i]->GetTVector3("X1_Y1","mm")); + G4ThreeVector B = NPS::ConvertVector(blocks[i]->GetTVector3("X128_Y1","mm")); + G4ThreeVector C = NPS::ConvertVector(blocks[i]->GetTVector3("X1_Y128","mm")); + G4ThreeVector D = NPS::ConvertVector(blocks[i]->GetTVector3("X128_Y128","mm")); - // Position method - else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax * mm ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay * mm ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az * mm ; - - A = G4ThreeVector(Ax, Ay, Az); - G4cout << "X1 Y1 corner position : " << A << G4endl; - } - - else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx * mm ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By * mm ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz * mm ; - - B = G4ThreeVector(Bx, By, Bz); - G4cout << "X128 Y1 corner position : " << B << G4endl; - } - - else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx * mm ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy * mm ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz * mm ; - - C = G4ThreeVector(Cx, Cy, Cz); - G4cout << "X1 Y128 corner position : " << C << G4endl; - } - - else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx * mm ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy * mm ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz * mm ; - - D = G4ThreeVector(Dx, Dy, Dz); - G4cout << "X128 Y128 corner position : " << D << G4endl; - } - - - // Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R / mm << G4endl; - } - - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; - } - - else if (DataBuffer.compare(0, 11, "FIRSTSTAGE=") == 0) { - check_FirstStage = true ; - ConfigFile >> DataBuffer; - FIRSTSTAGE = atof(DataBuffer.c_str()) ; - } - - else if (DataBuffer.compare(0, 12, "SECONDSTAGE=") == 0) { - check_SecondStage = true ; - ConfigFile >> DataBuffer; - SECONDSTAGE = atof(DataBuffer.c_str()) ; - } - - else if (DataBuffer.compare(0, 11, "THIRDSTAGE=") == 0) { - check_ThirdStage = true ; - ConfigFile >> DataBuffer; - THIRDSTAGE = atof(DataBuffer.c_str()) ; - } - - else if (DataBuffer.compare(0, 4, "VIS=") == 0) { - checkVis = true ; - ConfigFile >> DataBuffer; - if (DataBuffer.compare(0, 3, "all") == 0) m_non_sensitive_part_visiualisation = true; - } - - else G4cout << "WARNING: Wrong Token, GaspardTrackerSquare: Square Element not added" << G4endl; - - //Add The previously define telescope - //With position method - if ((check_A && check_B && check_C && check_D && check_FirstStage && check_SecondStage && check_ThirdStage && checkVis) && !(check_Theta && check_Phi && check_R)) { - - ReadingStatus = false ; - check_A = false ; - check_C = false ; - check_B = false ; - check_D = false ; - check_FirstStage = false ; - check_SecondStage = false ; - check_ThirdStage = false ; - checkVis = false ; - - AddModule(A , - B , - C , - D , - FIRSTSTAGE == 1 , - SECONDSTAGE == 1 , - THIRDSTAGE == 1); - } - - //with angle method - if ((check_Theta && check_Phi && check_R && check_FirstStage && check_SecondStage && check_ThirdStage && checkVis) && !(check_A && check_B && check_C && check_D)) { - ReadingStatus = false ; - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_FirstStage = false ; - check_SecondStage = false ; - check_ThirdStage = false ; - checkVis = false ; - - AddModule(R , - Theta , - Phi , - beta_u , - beta_v , - beta_w , - FIRSTSTAGE == 1 , - SECONDSTAGE == 1 , - THIRDSTAGE == 1); - } - - + AddModule(A,B,C,D,first,second,third); } - } + else if(blocks[i]->HasTokenList(token_sphe)){ + // Add module + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + + AddModule(R,Theta,Phi,beta[0],beta[1],beta[2],first,second,third); + } + } + } } // Construct detector and inialise sensitive part. diff --git a/NPSimulation/Detectors/GASPARD/GaspardTrackerSquare.hh b/NPSimulation/Detectors/GASPARD/GaspardTrackerSquare.hh index 6a0270f3895df4c57c60dbc4025a5c51a8d5322f..955f3f642336a0f5c93980c36d6fc608e610816b 100644 --- a/NPSimulation/Detectors/GASPARD/GaspardTrackerSquare.hh +++ b/NPSimulation/Detectors/GASPARD/GaspardTrackerSquare.hh @@ -27,7 +27,7 @@ // NPTool header #include "GaspardTrackerModule.hh" #include "TInteractionCoordinates.h" - +#include "NPInputParser.h" using namespace std; using namespace CLHEP; @@ -82,7 +82,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/GASPARD/GaspardTrackerTrapezoid.cc b/NPSimulation/Detectors/GASPARD/GaspardTrackerTrapezoid.cc index f9f5cad58923990c201f1216353b698f8056a7d6..f3e93267cdecbaa844d1b5bf9646d6ce098da5c6 100644 --- a/NPSimulation/Detectors/GASPARD/GaspardTrackerTrapezoid.cc +++ b/NPSimulation/Detectors/GASPARD/GaspardTrackerTrapezoid.cc @@ -52,6 +52,9 @@ #include "GaspardScorers.hh" #include "RootOutput.h" #include "NPSVDetector.hh" +#include "NPOptionManager.h" +#include "NPSDetectorFactory.hh" + // CLHEP #include "CLHEP/Random/RandGauss.h" @@ -292,231 +295,42 @@ void GaspardTrackerTrapezoid::VolumeMaker(G4int DetectorNumber, // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void GaspardTrackerTrapezoid::ReadConfiguration(string Path) -{ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - G4double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - G4ThreeVector A , B , C , D ; - G4double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ; - int FIRSTSTAGE = 0 , SECONDSTAGE = 0 , THIRDSTAGE = 0 ; - - bool ReadingStatus = false ; - - bool check_A = false ; - bool check_C = false ; - bool check_B = false ; - bool check_D = false ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - - bool check_FirstStage = false ; - bool check_SecondStage = false ; - bool check_ThirdStage = false ; - bool checkVis = false ; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 12, "GPDTrapezoid") == 0) { - G4cout << "///" << G4endl ; - G4cout << "Trapezoid element found: " << G4endl ; - ReadingStatus = true ; - } - - while(ReadingStatus){ - - ConfigFile >> DataBuffer; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} +void GaspardTrackerTrapezoid::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("GaspardTracker"); + vector<string> token_cart= {"X1_Y1","X128_Y1","X1_Y128","X128_Y128"}; + vector<string> token_sphe= {"R","THETA","PHI","BETA"}; + + vector<string> token={"FIRSTSTAGE","SECONDSTAGE","THIRDSTAGE"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->GetMainValue() == "Trapezoid" && blocks[i]->HasTokenList(token) ){ + + bool first = blocks[i]->GetInt("FIRSTSTAGE"); + bool second = blocks[i]->GetInt("SECONDSTAGE"); + bool third = blocks[i]->GetInt("THIRDSTAGE"); + if(blocks[i]->HasToken("VIS")) + m_non_sensitive_part_visiualisation = blocks[i]->GetInt("VIS"); + + if(blocks[i]->HasTokenList(token_cart)){ + // Add module + G4ThreeVector A = NPS::ConvertVector(blocks[i]->GetTVector3("X1_Y1","mm")); + G4ThreeVector B = NPS::ConvertVector(blocks[i]->GetTVector3("X128_Y1","mm")); + G4ThreeVector C = NPS::ConvertVector(blocks[i]->GetTVector3("X1_Y128","mm")); + G4ThreeVector D = NPS::ConvertVector(blocks[i]->GetTVector3("X128_Y128","mm")); - // Position method - else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax * mm ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay * mm ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az * mm ; - - A = G4ThreeVector(Ax, Ay, Az); - G4cout << "X1 Y1 corner position : " << A << G4endl; - } - - else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx * mm ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By * mm ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz * mm ; - - B = G4ThreeVector(Bx, By, Bz); - G4cout << "X128 Y1 corner position : " << B << G4endl; - } - - else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx * mm ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy * mm ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz * mm ; - - C = G4ThreeVector(Cx, Cy, Cz); - G4cout << "X1 Y128 corner position : " << C << G4endl; - } - - else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx * mm ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy * mm ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz * mm ; - - D = G4ThreeVector(Dx, Dy, Dz); - G4cout << "X128 Y128 corner position : " << D << G4endl; - } - - - // Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R / mm << G4endl; - } - - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; - } - - else if (DataBuffer.compare(0, 11, "FIRSTSTAGE=") == 0) { - check_FirstStage = true ; - ConfigFile >> DataBuffer; - FIRSTSTAGE = atof(DataBuffer.c_str()) ; - } - - else if (DataBuffer.compare(0, 12, "SECONDSTAGE=") == 0) { - check_SecondStage = true ; - ConfigFile >> DataBuffer; - SECONDSTAGE = atof(DataBuffer.c_str()) ; - } - - else if (DataBuffer.compare(0, 11, "THIRDSTAGE=") == 0) { - check_ThirdStage = true ; - ConfigFile >> DataBuffer; - THIRDSTAGE = atof(DataBuffer.c_str()) ; - } - - else if (DataBuffer.compare(0, 4, "VIS=") == 0) { - checkVis = true ; - ConfigFile >> DataBuffer; - if (DataBuffer.compare(0, 3, "all") == 0) m_non_sensitive_part_visiualisation = true; - } - - else G4cout << "WARNING: Wrong Token, GaspardTrackerTrapezoid: Trapezoid Element not added" << G4endl; - - //Add The previously define telescope - //With position method - if ((check_A && check_B && check_C && check_D && check_FirstStage && check_SecondStage && check_ThirdStage && checkVis) && !(check_Theta && check_Phi && check_R)) { - - ReadingStatus = false ; - check_A = false ; - check_C = false ; - check_B = false ; - check_D = false ; - check_FirstStage = false ; - check_SecondStage = false ; - check_ThirdStage = false ; - checkVis = false ; - - AddModule(A , - B , - C , - D , - FIRSTSTAGE == 1 , - SECONDSTAGE == 1 , - THIRDSTAGE == 1); - } - - //with angle method - if ((check_Theta && check_Phi && check_R && check_FirstStage && check_SecondStage && check_ThirdStage && checkVis) && !(check_A && check_B && check_C && check_D)) { - ReadingStatus = false ; - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_FirstStage = false ; - check_SecondStage = false ; - check_ThirdStage = false ; - checkVis = false ; - - AddModule(R , - Theta , - Phi , - beta_u , - beta_v , - beta_w , - FIRSTSTAGE == 1 , - SECONDSTAGE == 1 , - THIRDSTAGE == 1); - } - - + AddModule(A,B,C,D,first,second,third); } - } + else if(blocks[i]->HasTokenList(token_sphe)){ + // Add module + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + + AddModule(R,Theta,Phi,beta[0],beta[1],beta[2],first,second,third); + } + } + } } // Construct detector and inialise sensitive part. diff --git a/NPSimulation/Detectors/GASPARD/GaspardTrackerTrapezoid.hh b/NPSimulation/Detectors/GASPARD/GaspardTrackerTrapezoid.hh index 14d39adf3d9eb15e2d2d083eb3d09096c1e20339..211cf87675d494f39f540c0c36301e791dc44c57 100644 --- a/NPSimulation/Detectors/GASPARD/GaspardTrackerTrapezoid.hh +++ b/NPSimulation/Detectors/GASPARD/GaspardTrackerTrapezoid.hh @@ -29,9 +29,9 @@ // NPTool header #include "GaspardTrackerModule.hh" #include "TInteractionCoordinates.h" - +#include "NPInputParser.h" using namespace std; - using namespace CLHEP; +using namespace CLHEP; @@ -85,7 +85,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/GeTAMU/GeTAMU.cc b/NPSimulation/Detectors/GeTAMU/GeTAMU.cc index 7b3c14878763eeb1be0f8e3c9de93327827f72b3..8a64ec7fcb66b95851beccca08a31a200406aeab 100644 --- a/NPSimulation/Detectors/GeTAMU/GeTAMU.cc +++ b/NPSimulation/Detectors/GeTAMU/GeTAMU.cc @@ -122,268 +122,26 @@ GeTAMU::~GeTAMU(){ // Virtual Method of NPS::VDetector class // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void GeTAMU::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - istringstream LineStream ; - // Standard Case: - bool check_CloverId = false; - - vector<int> CloverId; - int CloverId_Free = 0; - double R = 0; - double Theta = 0; - double Phi = 0; - double BetaX=0; - double BetaY=0; - double BetaZ=0; - - // Free postion case: - bool check_R = false ; - bool check_Theta = false ; - bool check_Phi = false ; - bool check_Beta = false ; - - // Frame Case - bool check_RightFrame = false ; - bool check_LeftFrame = false ; - - bool ReadingStatusStandard = false ; - bool ReadingStatusFree = false ; - bool ReadingStatusFrame = false ; - bool ReadingStatus = false ; - - while (!ConfigFile.eof()){ - int VerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); - - getline(ConfigFile, LineBuffer); - - if (LineBuffer.compare(0, 7, "GeTAMU") == 0) - ReadingStatus = true; - - while (ReadingStatus && !ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // Comment Line - while (LineBuffer.compare(0, 1, "%") == 0) { - // Take the next line - getline(ConfigFile, LineBuffer); - } - - // Standard case - if (LineBuffer.compare(0, 15, "GeTAMUStandard") == 0){ - if(VerboseLevel==1) - G4cout << "/// Clovers in Standard Configuration : ///" << G4endl ; - ReadingStatusStandard = true ; - } - - // Free placing case - else if (LineBuffer.compare(0, 13, "GeTAMUClover") == 0){ - if(VerboseLevel==1) - G4cout << "/// Free placed clover : ///" << G4endl ; - ReadingStatusFree = true ; - } - - // Frame case - else if (LineBuffer.compare(0, 12, "GeTAMUFrame") == 0){ - if(VerboseLevel==1) - G4cout << "/// Support Frame : ///" << G4endl ; - ReadingStatusFrame = true ; - } - - // Reading Block - while(ReadingStatusStandard){ - // Pickup Next Line - getline(ConfigFile, LineBuffer); - // Comment Line - while (LineBuffer.compare(0, 1, "%") == 0) { - // Take the next line - getline(ConfigFile, LineBuffer); - } - - LineStream.clear(); - LineStream.str(LineBuffer); - LineStream >> DataBuffer; - - if ( DataBuffer == "CloverId=" ) { - check_CloverId = true; - - if(VerboseLevel==1) G4cout << "CloverId: " ; - while(LineStream >> DataBuffer){ - CloverId.push_back(atoi(DataBuffer.c_str())); - if(VerboseLevel==1) G4cout << atoi(DataBuffer.c_str()) << " "; - } - if(VerboseLevel==1) G4cout << G4endl << G4endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatusStandard = false; - G4cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - exit(1); - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_CloverId){ - ReadingStatusStandard = false; - AddCloverStandard(CloverId); - CloverId.clear(); - check_CloverId = false ; - } - } - - // Reading Block - while(ReadingStatusFree){ - // Pickup Next Line - getline(ConfigFile, LineBuffer); - // Comment Line - while (LineBuffer.compare(0, 1, "%") == 0) { - // Take the next line - getline(ConfigFile, LineBuffer); - } - - LineStream.clear(); - LineStream.str(LineBuffer); - LineStream >> DataBuffer; - - if ( DataBuffer == "CloverId=" ) { - check_CloverId = true; - LineStream >> DataBuffer; - CloverId_Free = atoi(DataBuffer.c_str()); - if(VerboseLevel==1) - G4cout << "CloverId: " << atoi(DataBuffer.c_str()) << " " << G4endl ; - } - - else if ( DataBuffer == "R=" ) { - check_R = true; - LineStream >> DataBuffer; - R = atof(DataBuffer.c_str())*mm; - if(VerboseLevel==1) - G4cout << "R: " << R/mm << " " << G4endl ; - } - - else if ( DataBuffer == "Theta=" ) { - check_Theta = true; - LineStream >> DataBuffer; - Theta = atof(DataBuffer.c_str())*deg; - if(VerboseLevel==1) - G4cout << "Theta: " << Theta/deg << " " << G4endl ; - } - - else if ( DataBuffer == "Phi=" ) { - check_Phi = true; - LineStream >> DataBuffer; - Phi = atof(DataBuffer.c_str())*deg; - if(VerboseLevel==1) - G4cout << "Phi: " << Phi/deg << " " << G4endl ; - } - - else if ( DataBuffer == "Beta=" ) { - check_Beta = true; - LineStream >> DataBuffer; - BetaX = atof(DataBuffer.c_str())*deg; - if(VerboseLevel==1) - G4cout << "BetaX: " << BetaX/deg << " " << G4endl ; - LineStream >> DataBuffer; - BetaY = atof(DataBuffer.c_str())*deg; - if(VerboseLevel==1) - G4cout << "BetaY: " << BetaY/deg << " " << G4endl ; - LineStream >> DataBuffer; - BetaZ = atof(DataBuffer.c_str())*deg; - if(VerboseLevel==1) - G4cout << "BetaZ: " << BetaZ/deg << " " << G4endl ; - } - - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatusStandard = false; - G4cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - exit(1); - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_CloverId && check_R && check_Theta && check_Phi && check_Beta){ - ReadingStatusFree = false; - AddCloverFreePosition(CloverId_Free,R,Theta,Phi,BetaX,BetaY,BetaZ); - check_CloverId = false ; - check_R = false ; - check_Theta = false ; - check_Phi = false ; - check_Beta = false ; - } - } - - // Reading Block - while(ReadingStatusFrame){ - // Pickup Next Line - getline(ConfigFile, LineBuffer); - // Comment Line - while (LineBuffer.compare(0, 1, "%") == 0) { - // Take the next line - getline(ConfigFile, LineBuffer); - } - - LineStream.clear(); - LineStream.str(LineBuffer); - LineStream >> DataBuffer; - - if ( DataBuffer == "RightFrame=" ) { - check_RightFrame = true; - - LineStream >> DataBuffer; - m_RightFrame=atoi(DataBuffer.c_str()); - - if (VerboseLevel==1) { - if(m_RightFrame) - G4cout << "Right frame: yes" << G4endl; - else - G4cout << "Right frame: no" << G4endl; - } - } - - else if ( DataBuffer == "LeftFrame=" ) { - check_LeftFrame = true; - - LineStream >> DataBuffer; - m_LeftFrame=atoi(DataBuffer.c_str()); - - if (VerboseLevel==1) { - if(m_LeftFrame) - G4cout << "Left frame: yes" << G4endl; - else - G4cout << "Left frame: no" << G4endl; - } - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatusStandard = false; - G4cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - exit(1); - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_RightFrame && check_LeftFrame){ - ReadingStatusFrame = false; - AddCloverStandard(CloverId); - CloverId.clear(); - check_RightFrame = false; - check_LeftFrame = false; - } - } +void GeTAMU::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("GeTAMU"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " clovers found " << endl; + + vector<string> token = {"CloverID","R","Theta","Phi","Beta"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + vector<double> beta = blocks[i]->GetVectorDouble("Beta","deg"); + int id = blocks[i]->GetInt("CloverID"); + AddCloverFreePosition(id,R,Theta,Phi,beta[0],beta[1],beta[2]); + } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } } diff --git a/NPSimulation/Detectors/GeTAMU/GeTAMU.hh b/NPSimulation/Detectors/GeTAMU/GeTAMU.hh index 1939637b5307b64258de7c64f7af591b49166ab8..6224e653444f406c6981e6072ca520c46f0e3ff1 100644 --- a/NPSimulation/Detectors/GeTAMU/GeTAMU.hh +++ b/NPSimulation/Detectors/GeTAMU/GeTAMU.hh @@ -39,6 +39,7 @@ // NPLib #include "TGeTAMUData.h" +#include "NPInputParser.h" using namespace std; using namespace CLHEP; @@ -100,7 +101,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/Helios/Helios.cc b/NPSimulation/Detectors/Helios/Helios.cc index 9b03a40dce3607e31326752893054d2e391df7e5..dcc60478ae26ade0d7c22447bbbe2d2e7be5efe2 100644 --- a/NPSimulation/Detectors/Helios/Helios.cc +++ b/NPSimulation/Detectors/Helios/Helios.cc @@ -30,6 +30,7 @@ #include "Helios.hh" #include "HeliosDetDummyShape.hh" #include "NPSDetectorFactory.hh" +#include "NPOptionManager.h" using namespace std; @@ -47,42 +48,26 @@ Helios::~Helios() // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Helios::ReadConfiguration(string Path) -{ - // open configuration file - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - - bool HeliosDummyShape = false; - - string LineBuffer; - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - if (LineBuffer.compare(0, 16, "HeliosDummyShape") == 0 && HeliosDummyShape == false) { - HeliosDummyShape = true; - - // instantiate a new "detector" corresponding to the Shape elements +void Helios::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("HeliosDummyShape"); + if(blocks.size()>1){ + cout << "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww " << endl; + // instantiate a new "detector" corresponding to the Shape elements // The HeliosSquare class should be replaced by the // HeliosShape class you need to define HeliosModule* myDetector = new HeliosDetDummyShape(); // read part of the configuration file corresponding to shape elements - ConfigFile.close(); - myDetector->ReadConfiguration(Path); - ConfigFile.open(Path.c_str()); + myDetector->ReadConfiguration(parser); // ms_InterCoord comes from NPS::VDetector myDetector->SetInterCoordPointer(ms_InterCoord); // store HeliosShape "detector" m_Modules.push_back(myDetector); - } - } + } } - - // Construct detector and initialize sensitive part. // Called After DetecorConstruction::AddDetector Method void Helios::ConstructDetector(G4LogicalVolume* world) @@ -147,8 +132,8 @@ void Helios::ReadSensitive(const G4Event* event) class proxy{ public: proxy(){ - NPS::DetectorFactory::getInstance()->AddToken("Helios","Helios"); - NPS::DetectorFactory::getInstance()->AddDetector("Helios",Helios::Construct); + NPS::DetectorFactory::getInstance()->AddToken("HeliosDummyShape","Helios"); + NPS::DetectorFactory::getInstance()->AddDetector("HeliosDummyShape",Helios::Construct); } }; diff --git a/NPSimulation/Detectors/Helios/Helios.hh b/NPSimulation/Detectors/Helios/Helios.hh index 0e7df10ca920ec44ac70f3389436e6ba435ac4ea..8bc12698d9ffda8a75c236e621908a53cccda416 100644 --- a/NPSimulation/Detectors/Helios/Helios.hh +++ b/NPSimulation/Detectors/Helios/Helios.hh @@ -29,9 +29,9 @@ // NPTool header #include "NPSVDetector.hh" #include "HeliosModule.hh" - +#include "NPInputParser.h" using namespace std; - using namespace CLHEP; +using namespace CLHEP; @@ -50,7 +50,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/Helios/HeliosDetDummyShape.cc b/NPSimulation/Detectors/Helios/HeliosDetDummyShape.cc index 81e584f6ec64247fed0359ea7e4e524e966dceac..c578cb130b789eb3987a5a92716b681ebfa0b930 100644 --- a/NPSimulation/Detectors/Helios/HeliosDetDummyShape.cc +++ b/NPSimulation/Detectors/Helios/HeliosDetDummyShape.cc @@ -64,7 +64,8 @@ #include "ObsoleteGeneralScorers.hh" #include "HeliosScorers.hh" #include "RootOutput.h" - +#include "NPOptionManager.h" +#include "NPSDetectorFactory.hh" // CLHEP #include "CLHEP/Random/RandGauss.h" @@ -405,268 +406,57 @@ void HeliosDetDummyShape::VolumeMaker(G4int TelescopeNumber, // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void HeliosDetDummyShape::ReadConfiguration(string Path) -{ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer, DataBuffer; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - G4double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - G4ThreeVector A , B , C , D ; - G4double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ; - int FIRSTSTAGE = 0; -// int SECONDSTAGE = 0 , THIRDSTAGE = 0 ; - // int NSTRIP = 128; - - bool ReadingStatus = false; - - bool check_A = false; - bool check_C = false; - bool check_B = false; - bool check_D = false; - - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; -// bool check_beta = false; - - bool check_FirstStage = false; -// bool check_SecondStage = false; -// bool check_ThirdStage = false; -// bool check_NStrip = false; - bool checkVis = false; - - static G4bool fieldIsInitialized = false; - - - while (!ConfigFile.eof()) { - -// -// First Read Magneticfield nominal value -// - if(!fieldIsInitialized) - { - //getline(ConfigFile, LineBuffer); - - ConfigFile >> DataBuffer; - - cout << DataBuffer << endl; - if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} - - // Position method - else if (DataBuffer.compare(0, 7, "MField=") == 0) { - ConfigFile >> DataBuffer ; - - Bz = atof(DataBuffer.c_str()) ; - - G4cout << "/// Magnetic field nominal value " << Bz << G4endl ; - - - //if(!fieldIsInitialized) - // { - MyMagneticField* myField = new MyMagneticField(G4ThreeVector(0.,0.,Bz)); - - G4FieldManager* fieldMgr +void HeliosDetDummyShape::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("HeliosDummyShape"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + // Cartesian Case + vector<string> cart = {"X1_Y1","X1_Y128","X128_Y1","X128_Y128"}; + // Spherical Case + vector<string> sphe= {"R","THETA","PHI","BETA"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + + if(blocks[i]->HasToken("MField")){ + double Bz = blocks[i]->GetDouble("MField","T"); + MyMagneticField* myField = new MyMagneticField(G4ThreeVector(0.,0.,Bz)); + + G4FieldManager* fieldMgr = G4TransportationManager::GetTransportationManager() ->GetFieldManager(); fieldMgr->SetDetectorField(myField); - - - - // G4MagIntegratorStepper *pItsStepper; - // G4ChordFinder* pChordFinder= new G4ChordFinder(myField, - // 1.0e-2*mm, // stepper size - // pItsStepper=0); - // fieldMgr->SetChordFinder(pChordFinder); - - fieldMgr->CreateChordFinder(myField); - - fieldIsInitialized = true; - //} - - } - } - - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 16, "HeliosDummyShape") == 0) { - G4cout << "///" << G4endl ; - G4cout << "DummyShape element found: " << G4endl ; - ReadingStatus = true ; - } - - while (ReadingStatus) { - ConfigFile >> DataBuffer; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} - - // Position method - else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax * mm ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay * mm ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az * mm ; - - A = G4ThreeVector(Ax, Ay, Az); - G4cout << "X1 Y1 corner position : " << A << G4endl; - } - else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx * mm ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By * mm ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz * mm ; - - B = G4ThreeVector(Bx, By, Bz); - G4cout << "X128 Y1 corner position : " << B << G4endl; - } - else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx * mm ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy * mm ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz * mm ; - - C = G4ThreeVector(Cx, Cy, Cz); - G4cout << "X1 Y128 corner position : " << C << G4endl; - } - else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx * mm ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy * mm ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz * mm ; - - D = G4ThreeVector(Dx, Dy, Dz); - G4cout << "X128 Y128 corner position : " << D << G4endl; - } - - // Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R / mm << G4endl; - } - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { -// check_beta = true; - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; - } - - else if (DataBuffer.compare(0, 11, "FIRSTSTAGE=") == 0) { - check_FirstStage = true ; - ConfigFile >> DataBuffer; - FIRSTSTAGE = atoi(DataBuffer.c_str()) ; - } -/* else if (DataBuffer.compare(0, 12, "SECONDSTAGE=") == 0) { -// check_SecondStage = true ; - ConfigFile >> DataBuffer; - SECONDSTAGE = atoi(DataBuffer.c_str()) ; - } - else if (DataBuffer.compare(0, 11, "THIRDSTAGE=") == 0) { -// check_ThirdStage = true ; - ConfigFile >> DataBuffer; - THIRDSTAGE = atoi(DataBuffer.c_str()) ; - } - - else if (DataBuffer.compare(0, 7, "NSTRIP=") == 0) { -// check_NStrip = true ; - ConfigFile >> DataBuffer; - NSTRIP = atoi(DataBuffer.c_str()) ; - }*/ - - else if (DataBuffer.compare(0, 4, "VIS=") == 0) { - checkVis = true ; - ConfigFile >> DataBuffer; - if (DataBuffer.compare(0, 3, "all") == 0) m_non_sensitive_part_visiualisation = true; - } - - else G4cout << "WARNING: Wrong Token, HeliosDummyShape: DummyShape Element not added" << G4endl; - - // Add The previously define telescope - // With position method - if ((check_A && check_B && check_C && check_D && check_FirstStage && checkVis) && - !(check_Theta && check_Phi && check_R)) { - ReadingStatus = false; - check_A = false; - check_C = false; - check_B = false; - check_D = false; - check_FirstStage = false; - checkVis = false; - - AddModule(A, B, C, D, FIRSTSTAGE == 1); - } - - // With angle method - if ((check_Theta && check_Phi && check_R && check_FirstStage && checkVis) && - !(check_A && check_B && check_C && check_D)) { - ReadingStatus = false; - check_Theta = false; - check_Phi = false; - check_R = false; -// check_beta = false; - check_FirstStage = false; - checkVis = false; - - AddModule(R, Theta, Phi, beta_u, beta_v, beta_w, FIRSTSTAGE == 1); - } - } - } + } + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Helios " << i+1 << endl; + + G4ThreeVector A = NPS::ConvertVector(blocks[i]->GetTVector3("X1_Y1","mm")); + G4ThreeVector B = NPS::ConvertVector(blocks[i]->GetTVector3("X128_Y1","mm")); + G4ThreeVector C = NPS::ConvertVector(blocks[i]->GetTVector3("X1_Y128","mm")); + G4ThreeVector D = NPS::ConvertVector(blocks[i]->GetTVector3("X128_Y128","mm")); + AddModule(A,B,C,D,true) ; + } + + else if(blocks[i]->HasTokenList(sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Helios " << i+1 << endl; + + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi= blocks[i]->GetDouble("PHI","deg"); + double R = blocks[i]->GetDouble("R","mm"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + AddModule(Theta,Phi,R,beta[0],beta[1],beta[2],true); + } + + else{ + cout << "ERROR: Missing token for M2Telescope blocks, check your input file" << endl; + exit(1); + } + } } - - // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method void HeliosDetDummyShape::ConstructDetector(G4LogicalVolume* world) diff --git a/NPSimulation/Detectors/Helios/HeliosDetDummyShape.hh b/NPSimulation/Detectors/Helios/HeliosDetDummyShape.hh index c9ad77023c07fbc9a55b7252eeabbdfd7cc140cc..531411866114c3bb65a2a7827495a69f07ad20c0 100644 --- a/NPSimulation/Detectors/Helios/HeliosDetDummyShape.hh +++ b/NPSimulation/Detectors/Helios/HeliosDetDummyShape.hh @@ -30,9 +30,9 @@ // NPTool header #include "HeliosModule.hh" #include "TInteractionCoordinates.h" - +#include "NPInputParser.h" using namespace std; - using namespace CLHEP; +using namespace CLHEP; @@ -80,7 +80,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/Helios/HeliosModule.hh b/NPSimulation/Detectors/Helios/HeliosModule.hh index 5107d9db16f5a6729129f3b4d2aba784a6904b8d..e3d805e851d85262df72cddb7c09da64cc115ab1 100644 --- a/NPSimulation/Detectors/Helios/HeliosModule.hh +++ b/NPSimulation/Detectors/Helios/HeliosModule.hh @@ -34,9 +34,9 @@ // NPTool - ROOT headers #include "TInteractionCoordinates.h" #include "THeliosData.h" - +#include "NPInputParser.h" using namespace std; - using namespace CLHEP; +using namespace CLHEP; @@ -48,7 +48,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) - virtual void ReadConfiguration(string Path) = 0; + virtual void ReadConfiguration(NPL::InputParser) = 0; // Construct detector and inialise sensitive part. virtual void ConstructDetector(G4LogicalVolume* world) = 0; diff --git a/NPSimulation/Detectors/Helios2/Helios2.cc b/NPSimulation/Detectors/Helios2/Helios2.cc index d880bb859a4ce98b69dad43a16421f2842af4eb4..6274b67aa2ba99df2548549a766bd599faf4ab42 100644 --- a/NPSimulation/Detectors/Helios2/Helios2.cc +++ b/NPSimulation/Detectors/Helios2/Helios2.cc @@ -52,6 +52,7 @@ #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" #include "Target.hh" +#include "NPOptionManager.h" // CLHEP header #include "CLHEP/Random/RandGauss.h" @@ -201,94 +202,32 @@ G4LogicalVolume* Helios2::BuildMagnet(){ // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Helios2::ReadConfiguration(string Path){ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()) ; - string LineBuffer; - string DataBuffer; - - double Z = 0 ; - string Face; - - bool check_Z = false ; - bool check_Face = false ; - bool ReadingStatus = false; - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Start Up Helios2 bloc, Reading toggle to true - string name = "Helios2"; - - if (LineBuffer.compare(0, name.length(), name) == 0) { - G4cout << "///" << G4endl ; - G4cout << "Helios2 found: " << G4endl ; - ReadingStatus = true ; +void Helios2::ReadConfiguration(NPL::InputParser parser ){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Helios2"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> token = {"Z","Face"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasToken("MagneticField")) + m_B=blocks[i]->GetDouble("MagneticField","T"); + + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Helios2 " << i+1 << endl; + double Z = blocks[i]->GetDouble("Z","mm"); + string Face = blocks[i]->GetString("Face"); + AddHelios2(Z,Face); } - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, name.length(),name) == 0) { - G4cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << G4endl ; - ReadingStatus = false ; - } - - else if (DataBuffer=="Z=") { - check_Z = true; - ConfigFile >> Z; - Z = Z * mm; - G4cout << "Z: " << Z / mm << G4endl; - } - - - else if (DataBuffer == "Face=") { - check_Face = true; - ConfigFile >> DataBuffer ; - Face = DataBuffer ; - G4cout << "Face: " << Face << G4endl; - } - - else if (DataBuffer == "MagneticField=") { - ConfigFile >> m_B; - m_B*=tesla; - G4cout << "MagneticField: " << m_B/tesla << " Tesla" << G4endl; - } - - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; - G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_Z && check_Face){ - - AddHelios2(Z,Face); - - // Reinitialisation of Check Boolean - check_Z= false ; - check_Face= false; - ReadingStatus = false ; - G4cout << "///"<< G4endl ; - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } } + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Construct detector and inialise sensitive part. diff --git a/NPSimulation/Detectors/Helios2/Helios2.hh b/NPSimulation/Detectors/Helios2/Helios2.hh index b43e8be3e1debe14793d067e830bc4fe731bf9c0..9abb3b49b061989edd34df753f7eb2c1839b3e67 100644 --- a/NPSimulation/Detectors/Helios2/Helios2.hh +++ b/NPSimulation/Detectors/Helios2/Helios2.hh @@ -36,6 +36,7 @@ using namespace std; // NPTool header #include "NPSVDetector.hh" #include "THelios2Data.h" +#include "NPInputParser.h" class Helios2 : public NPS::VDetector{ //////////////////////////////////////////////////// @@ -68,7 +69,7 @@ class Helios2 : public NPS::VDetector{ public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/Hira/Hira.cc b/NPSimulation/Detectors/Hira/Hira.cc index 716de6ad2a1ab7be866eff34fb133f3237575983..a2c83e9ac97d5a9e180e2d3b7e86fa03458036cf 100644 --- a/NPSimulation/Detectors/Hira/Hira.cc +++ b/NPSimulation/Detectors/Hira/Hira.cc @@ -53,6 +53,7 @@ #include "NPOptionManager.h" #include "RootOutput.h" #include "NPSDetectorFactory.hh" + //using namespace OBSOLETEGENERALSCORERS ; using namespace HIRA; @@ -91,226 +92,34 @@ Hira::~Hira(){ // Virtual Method of VDetector class // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Hira::ReadConfiguration(string Path){ - - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - G4double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - G4ThreeVector A , B , C , D ; - //G4double Theta = 0 , Phi = 0 , R = 0 ; - - bool ReadingStatus = false ; - - bool check_A = false ; - bool check_C = false ; - bool check_B = false ; - bool check_D = false ; - bool check_ThinSi = false; - bool check_ThickSi = false; - bool check_CsI = false; - - /*bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ;*/ - - - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 13, "HiraTelescope") == 0) { - G4cout << "///" << G4endl ; - G4cout << "Hira element found: " << G4endl ; - ReadingStatus = true ; - } - - while(ReadingStatus){ - - ConfigFile >> DataBuffer; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} - - // Position method - else if (DataBuffer.compare(0, 2, "A=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax * mm ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay * mm ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az * mm ; - - A = G4ThreeVector(Ax, Ay, Az); - G4cout << "A corner position : " << A << G4endl; - } - - else if (DataBuffer.compare(0, 2, "B=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx * mm ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By * mm ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz * mm ; - - B = G4ThreeVector(Bx, By, Bz); - G4cout << "B corner position : " << B << G4endl; - } - - else if (DataBuffer.compare(0, 2, "C=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx * mm ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy * mm ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz * mm ; - - C = G4ThreeVector(Cx, Cy, Cz); - G4cout << "C corner position : " << C << G4endl; - } - - else if (DataBuffer.compare(0, 2, "D=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx * mm ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy * mm ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz * mm ; - - D = G4ThreeVector(Dx, Dy, Dz); - G4cout << "D corner position : " << D << G4endl; - } - - else if (DataBuffer.compare(0, 10, "ThinSi_DE=") == 0) { - check_ThinSi = true; - ConfigFile >> DataBuffer ; - m_build_ThinSi = atoi(DataBuffer.c_str()) ; - cout << "Build ThinSi : " << m_build_ThinSi << endl; - } - - else if (DataBuffer.compare(0, 10, "ThickSi_E=") == 0) { - check_ThickSi = true; - ConfigFile >> DataBuffer ; - m_build_ThickSi = atoi(DataBuffer.c_str()) ; - cout << "Build ThickSi : " << m_build_ThickSi << endl; - } - - else if (DataBuffer.compare(0, 4, "CsI=") == 0) { - check_CsI = true; - ConfigFile >> DataBuffer ; - m_build_CsI = atoi(DataBuffer.c_str()) ; - cout << "Build CsI : " << m_build_CsI << endl; - } - - - // Angle method - /* else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R / mm << G4endl; - } - - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; - }*/ - - - else G4cout << "WARNING: Wrong Token" << G4endl; - - //Add The previously define telescope - //With position method - if (check_A && check_B && check_C && check_D && check_ThinSi && check_ThickSi && check_CsI) { - - ReadingStatus = false ; - check_A = false ; - check_C = false ; - check_B = false ; - check_D = false ; - - AddTelescope(A , - B , - C , - D); - } - - //with angle method - /*if ((check_Theta && check_Phi && check_R && check_FirstStage && check_SecondStage && check_ThirdStage && checkVis) && !(check_A && check_B && check_C && check_D)) { - ReadingStatus = false ; - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_FirstStage = false ; - check_SecondStage = false ; - check_ThirdStage = false ; - checkVis = false ; - - AddModule(R , - Theta , - Phi , - beta_u , - beta_v , - beta_w , - FIRSTSTAGE == 1 , - SECONDSTAGE == 1 , - THIRDSTAGE == 1); - }*/ - - - } - } -} +void Hira::ReadConfiguration(NPL::InputParser parser ){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("HiraTelescope"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " Telescope found " << endl; + // Cartesian Case + vector<string> cart = {"A","B","C","D","ThickSi_E","ThinSi_DE","CsI"}; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Hira Telescope " << i+1 << endl; + G4ThreeVector A = NPS::ConvertVector(blocks[i]->GetTVector3("A","mm")); + G4ThreeVector B = NPS::ConvertVector(blocks[i]->GetTVector3("B","mm")); + G4ThreeVector C = NPS::ConvertVector(blocks[i]->GetTVector3("C","mm")); + G4ThreeVector D = NPS::ConvertVector(blocks[i]->GetTVector3("D","mm")); + m_build_ThinSi = blocks[i]->GetInt("ThinSi_DE"); + m_build_ThickSi = blocks[i]->GetInt("ThickSi_E"); + m_build_CsI = blocks[i]->GetInt("CsI"); + AddTelescope(A,B,C,D) ; + } + else{ + cout << "ERROR: Missing token for M2Telescope blocks, check your input file" << endl; + exit(1); + } + } +} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Hira::AddTelescope(G4ThreeVector Pos1, G4ThreeVector Pos2, G4ThreeVector Pos3, G4ThreeVector Pos4){ @@ -743,8 +552,8 @@ extern"C" { class proxy_nps_hira{ public: proxy_nps_hira(){ - NPS::DetectorFactory::getInstance()->AddToken("HIRAArray","Hira"); - NPS::DetectorFactory::getInstance()->AddDetector("HIRAArray",Hira::Construct); + NPS::DetectorFactory::getInstance()->AddToken("HiraTelescope","Hira"); + NPS::DetectorFactory::getInstance()->AddDetector("HiraTelescope",Hira::Construct); } }; diff --git a/NPSimulation/Detectors/Hira/Hira.hh b/NPSimulation/Detectors/Hira/Hira.hh index 72b1fe7e292a1c2cecf887c4e0396d8f09c0bfac..e2215f7df2851f484b563172b833dadf3056ffdf 100644 --- a/NPSimulation/Detectors/Hira/Hira.hh +++ b/NPSimulation/Detectors/Hira/Hira.hh @@ -39,6 +39,7 @@ // NPLib #include "THiraData.h" +#include "NPInputParser.h" using namespace std; using namespace CLHEP; @@ -141,7 +142,7 @@ private: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/Lassa/Lassa.cc b/NPSimulation/Detectors/Lassa/Lassa.cc index bd4dde2b4ca7d3e06d8d01f0279efca4eab402b9..0fa2e2e71f2c6827b2e0acf481c4c7002a4913ec 100644 --- a/NPSimulation/Detectors/Lassa/Lassa.cc +++ b/NPSimulation/Detectors/Lassa/Lassa.cc @@ -85,201 +85,30 @@ Lassa::~Lassa(){ // Virtual Method of VDetector class // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Lassa::ReadConfiguration(string Path){ - - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - G4double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - G4ThreeVector A , B , C , D ; - //G4double Theta = 0 , Phi = 0 , R = 0 ; - - bool ReadingStatus = false ; - - bool check_A = false ; - bool check_C = false ; - bool check_B = false ; - bool check_D = false ; - - /*bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ;*/ - - - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 14, "LassaTelescope") == 0) { - G4cout << "///" << G4endl ; - G4cout << "Lassa element found: " << G4endl ; - ReadingStatus = true ; - } - - while(ReadingStatus){ - - ConfigFile >> DataBuffer; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} - - // Position method - else if (DataBuffer.compare(0, 2, "A=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax * mm ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay * mm ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az * mm ; - - A = G4ThreeVector(Ax, Ay, Az); - G4cout << "A corner position : " << A << G4endl; - } - - else if (DataBuffer.compare(0, 2, "B=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx * mm ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By * mm ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz * mm ; - - B = G4ThreeVector(Bx, By, Bz); - G4cout << "B corner position : " << B << G4endl; - } - - else if (DataBuffer.compare(0, 2, "C=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx * mm ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy * mm ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz * mm ; - - C = G4ThreeVector(Cx, Cy, Cz); - G4cout << "C corner position : " << C << G4endl; - } - - else if (DataBuffer.compare(0, 2, "D=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx * mm ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy * mm ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz * mm ; - - D = G4ThreeVector(Dx, Dy, Dz); - G4cout << "D corner position : " << D << G4endl; - } - - - // Angle method - /* else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R / mm << G4endl; - } - - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; - }*/ - - - else G4cout << "WARNING: Wrong Token, GaspardTrackerRectangle: Rectangle Element not added" << G4endl; - - //Add The previously define telescope - //With position method - if (check_A && check_B && check_C && check_D) { - - ReadingStatus = false ; - check_A = false ; - check_C = false ; - check_B = false ; - check_D = false ; - - AddTelescope(A , - B , - C , - D); - } - - //with angle method - /*if ((check_Theta && check_Phi && check_R && check_FirstStage && check_SecondStage && check_ThirdStage && checkVis) && !(check_A && check_B && check_C && check_D)) { - ReadingStatus = false ; - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_FirstStage = false ; - check_SecondStage = false ; - check_ThirdStage = false ; - checkVis = false ; - - AddModule(R , - Theta , - Phi , - beta_u , - beta_v , - beta_w , - FIRSTSTAGE == 1 , - SECONDSTAGE == 1 , - THIRDSTAGE == 1); - }*/ - - - } - } -} - +void Lassa::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("LassaTelescope"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " Telescope found " << endl; + // Cartesian Case + vector<string> cart = {"A","B","C","D"}; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Lassa Telescope " << i+1 << endl; + G4ThreeVector A = NPS::ConvertVector(blocks[i]->GetTVector3("A","mm")); + G4ThreeVector B = NPS::ConvertVector(blocks[i]->GetTVector3("B","mm")); + G4ThreeVector C = NPS::ConvertVector(blocks[i]->GetTVector3("C","mm")); + G4ThreeVector D = NPS::ConvertVector(blocks[i]->GetTVector3("D","mm")); + AddTelescope(A,B,C,D) ; + } + else{ + cout << "ERROR: Missing token for M2Telescope blocks, check your input file" << endl; + exit(1); + } + } +} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Lassa::AddTelescope(G4ThreeVector Pos1, G4ThreeVector Pos2, G4ThreeVector Pos3, G4ThreeVector Pos4){ diff --git a/NPSimulation/Detectors/Lassa/Lassa.hh b/NPSimulation/Detectors/Lassa/Lassa.hh index 1257691ab77b57483af5ba075784a6f209c2877c..8b382518da3e17373345a99776763970af173dd1 100644 --- a/NPSimulation/Detectors/Lassa/Lassa.hh +++ b/NPSimulation/Detectors/Lassa/Lassa.hh @@ -8,13 +8,13 @@ *****************************************************************************/ /***************************************************************************** - * Original Author: Pierre MORFOUACE contact address: * + * Original Author: Pierre MORFOUACE contact address: * * * - * Creation Date : Feb 2015 * + * Creation Date : Feb 2015 * * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class describe the Hira Telescops * + * This class describe the Lassa Telescops * * * *---------------------------------------------------------------------------* * Comment: * @@ -39,6 +39,7 @@ // NPLib #include "TLassaData.h" +#include "NPInputParser.h" using namespace std; using namespace CLHEP; @@ -145,7 +146,7 @@ private: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/MUST2/MUST2Array.cc b/NPSimulation/Detectors/MUST2/MUST2Array.cc index 5055cb8ac53f14c7f97137aae01086b59aa58631..e5b2a9e3d0f2c6eec2b1959dc41c2bae1a33c56b 100644 --- a/NPSimulation/Detectors/MUST2/MUST2Array.cc +++ b/NPSimulation/Detectors/MUST2/MUST2Array.cc @@ -44,6 +44,8 @@ #include "ObsoleteGeneralScorers.hh" #include "MUST2Scorers.hh" +#include "NPOptionManager.h" + //ROOT #include "RootOutput.h" @@ -177,7 +179,7 @@ void MUST2Array::VolumeMaker( G4int TelescopeNumber, new G4PVPlacement(0, positionVacBox, logicVacBox, Name + "_VacBox", logicMM, false, 0); logicVacBox->SetVisAttributes(G4VisAttributes::Invisible); - + G4VisAttributes* SiliconVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3)) ; //////////////////////////////////////////////////////////////// @@ -206,7 +208,7 @@ void MUST2Array::VolumeMaker( G4int TelescopeNumber, ///Set Silicon strip sensible logicSilicon->SetSensitiveDetector(m_StripScorer); - + ///Visualisation of Silicon Strip logicSilicon->SetVisAttributes(SiliconVisAtt) ; } @@ -555,296 +557,49 @@ void MUST2Array::VolumeMaker( G4int TelescopeNumber, // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void MUST2Array::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - // A:X1_Y1 --> X:1 Y:1 - // B:X128_Y1 --> X:128 Y:1 - // C:X1_Y128 --> X:1 Y:128 - // D:X128_Y128 --> X:128 Y:128 - - G4double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - G4ThreeVector A , B , C , D ; - G4double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ; - int SI = 0 , SILI = 0 , CSI = 0 ; - - bool check_A = false ; - bool check_C = false ; - bool check_B = false ; - bool check_D = false ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - // bool check_beta = false ; - - bool check_SI = false ; - bool check_SILI = false ; - bool check_CSI = false ; - bool check_VIS = false ; - - bool ReadingStatus = false ; - - - while (!ConfigFile.eof()) { - - getline(ConfigFile, LineBuffer); - - // If line is a Start Up MUST2 bloc, Reading toggle to true - if (LineBuffer.compare(0, 11, "M2Telescope") == 0) - { - G4cout << "///" << G4endl ; - G4cout << "Telescope found: " << G4endl ; - ReadingStatus = true ; - +void MUST2Array::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("M2Telescope"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " telescope found" << endl; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Must 2 Telecope " << i+1 << endl; + // Cartesian Case + vector<string> cart = {"X1_Y1","X1_Y128","X128_Y1","X128_Y128","SI","SILI","CSI"}; + // Spherical Case + vector<string> sphe= {"R","THETA","PHI","BETA","SI","SILI","CSI"}; + + if(blocks[i]->HasTokenList(cart)){ + G4ThreeVector A = NPS::ConvertVector( blocks[i]->GetTVector3("X1_Y1","mm")); + G4ThreeVector B = NPS::ConvertVector( blocks[i]->GetTVector3("X128_Y1","mm")); + G4ThreeVector C = NPS::ConvertVector( blocks[i]->GetTVector3("X1_Y128","mm")); + G4ThreeVector D = NPS::ConvertVector( blocks[i]->GetTVector3("X128_Y128","mm")); + int SI = blocks[i]->GetInt("SI"); + int SILI = blocks[i]->GetInt("SILI"); + int CSI = blocks[i]->GetInt("CSI"); + AddTelescope(A,B,C,D,SI==1,SILI==1,CSI==1) ; } - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus) - { - - ConfigFile >> DataBuffer ; - // Comment Line - if(DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 11, "M2Telescope") == 0) { - G4cout << "WARNING: Another Telescope is find before standard sequence of Token, Error may occured in Telecope definition" << G4endl ; - ReadingStatus = false ; - } - - // Position method - - else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax * mm ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay * mm ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az * mm ; - - A = G4ThreeVector(Ax, Ay, Az); - G4cout << "X1 Y1 corner position : " << A << G4endl; - - } - - - else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx * mm ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By * mm ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz * mm ; - - B = G4ThreeVector(Bx, By, Bz); - G4cout << "X128 Y1 corner position : " << B << G4endl; - - } - - - else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx * mm ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy * mm ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz * mm ; - - C = G4ThreeVector(Cx, Cy, Cz); - G4cout << "X1 Y128 corner position : " << C << G4endl; - - } - - else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx * mm ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy * mm ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz * mm ; - - D = G4ThreeVector(Dx, Dy, Dz); - G4cout << "X128 Y128 corner position : " << D << G4endl; - - } - - // End Position Method - - // Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - - } - - //Angle method - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; + else if(blocks[i]->HasTokenList(sphe)){ - } - - //Angle method - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R / mm << G4endl; - - } - - //Angle method - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - // check_beta = true; - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; - - } - - // End Angle Method - - - // Common part - else if (DataBuffer.compare(0, 3, "SI=") == 0) { - check_SI = true ; - ConfigFile >> DataBuffer; - SI = atof(DataBuffer.c_str()) ; - G4cout << " SI= " << SI << G4endl ; - - } - - - else if (DataBuffer.compare(0, 5, "SILI=") == 0) { - check_SILI = true ; - ConfigFile >> DataBuffer; - SILI = atof(DataBuffer.c_str()) ; - G4cout << " SILI= " << SILI << G4endl ; - - } - - - else if (DataBuffer.compare(0, 4, "CSI=") == 0) { - check_CSI = true ; - ConfigFile >> DataBuffer; - CSI = atof(DataBuffer.c_str()) ; - G4cout << " CSI= " << CSI << G4endl ; - - } - - - else if (DataBuffer.compare(0, 4, "VIS=") == 0) { - check_VIS = true ; - ConfigFile >> DataBuffer; - if (DataBuffer.compare(0, 3, "all") == 0) - { - m_non_sensitive_part_visiualisation = true; - G4cout << " VIS= all" << G4endl ; - } - - else - G4cout << " VIS= Sensible Only" << G4endl ; - - - } - - // If no MUST2 Token and no comment, toggle out - else - {ReadingStatus = false; G4cout << "other token " << DataBuffer << G4endl ;} - - - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - if ( ( check_SI && check_SILI && check_CSI && check_VIS ) && ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R) ) ) - { - ReadingStatus = false; - - ///Add The previously define telescope - //With position method - if ((check_A && check_B && check_C && check_D) || !(check_Theta && check_Phi && check_R)) - { - AddTelescope( A, - B, - C, - D, - SI == 1, - SILI == 1, - CSI == 1); - } - - //with angle method - else if ((check_Theta && check_Phi && check_R) || !(check_A && check_B && check_C && check_D)) - { - AddTelescope( R, - Theta, - Phi, - beta_u, - beta_v, - beta_w, - SI == 1, - SILI == 1, - CSI == 1); - } - - - check_A = false ; - check_C = false ; - check_B = false ; - check_D = false ; + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi= blocks[i]->GetDouble("PHI","deg"); + double R = blocks[i]->GetDouble("R","mm"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + int SI = blocks[i]->GetInt("SI"); + int SILI = blocks[i]->GetInt("SILI"); + int CSI = blocks[i]->GetInt("CSI"); + AddTelescope( R,Theta,Phi,beta[0],beta[1],beta[2],SI==1,SILI==1,CSI==1); + } - check_Theta = false ; - check_Phi = false ; - check_R = false ; - // check_beta = false ; + else{ + cout << "WARNING: Missing token for M2Telescope blocks, check your input file" << endl; + exit(1); + } - check_SI = false ; - check_SILI = false ; - check_CSI = false ; - check_VIS = false ; + if(blocks[i]->GetString("VIS")=="all") + m_non_sensitive_part_visiualisation = true; - } - } } } @@ -947,7 +702,7 @@ void MUST2Array::InitializeRootOutput(){ if(!pTree->FindBranch("MUST2")){ pTree->Branch("MUST2", "TMust2Data", &m_Event) ; } - pTree->SetBranchAddress("MUST2", &m_Event) ; + pTree->SetBranchAddress("MUST2", &m_Event) ; } // Read sensitive part and fill the Root tree. @@ -1279,8 +1034,8 @@ void MUST2Array::InitializeScorers() { m_SiLiScorer = CheckScorer("MUST2_SiLiScorer",already_exist); m_CsIScorer = CheckScorer("MUST2_CsIScorer",already_exist); - // if the scorer were created previously nothing else need to be made - if(already_exist) return; + // if the scorer were created previously nothing else need to be made + if(already_exist) return; G4VPrimitiveScorer* DetNbr = new OBSOLETEGENERALSCORERS::PSDetectorNumber("DetectorNumber","MUST2Telescope", 0); G4VPrimitiveScorer* Energy = new OBSOLETEGENERALSCORERS::PSEnergy("StripEnergy","MUST2Telescope", 0); @@ -1292,7 +1047,7 @@ void MUST2Array::InitializeScorers() { G4VPrimitiveScorer* InteractionCoordinatesX = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesX("InterCoordX","MUST2Telescope", 0); G4VPrimitiveScorer* InteractionCoordinatesY = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesY("InterCoordY","MUST2Telescope", 0); G4VPrimitiveScorer* InteractionCoordinatesZ = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesZ("InterCoordZ","MUST2Telescope", 0); - + G4VPrimitiveScorer* InteractionCoordinatesAngleTheta = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesAngleTheta("InterCoordAngTheta","MUST2Telescope", 0); G4VPrimitiveScorer* InteractionCoordinatesAnglePhi = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesAnglePhi("InterCoordAngPhi","MUST2Telescope", 0) ; @@ -1310,7 +1065,7 @@ void MUST2Array::InitializeScorers() { m_StripScorer->RegisterPrimitive(InteractionCoordinatesAnglePhi); // SiLi Associate Scorer - G4VPrimitiveScorer* SiLiEnergy = new OBSOLETEGENERALSCORERS::PSEnergy("SiLiEnergy","MUST2Telescope", 0) ; + G4VPrimitiveScorer* SiLiEnergy = new OBSOLETEGENERALSCORERS::PSEnergy("SiLiEnergy","MUST2Telescope", 0) ; G4VPrimitiveScorer* SiLiPadNbr = new PSPadOrCristalNumber("SiLiPadNbr",0) ; m_SiLiScorer->RegisterPrimitive(SiLiEnergy); m_SiLiScorer->RegisterPrimitive(SiLiPadNbr); @@ -1357,24 +1112,24 @@ G4RotationMatrix* Rotation(double tetaX, double tetaY, double tetaZ){ } - //////////////////////////////////////////////////////////////////////////////// - // Construct Method to be pass to the DetectorFactory // - //////////////////////////////////////////////////////////////////////////////// - NPS::VDetector* MUST2Array::Construct(){ +//////////////////////////////////////////////////////////////////////////////// +// Construct Method to be pass to the DetectorFactory // +//////////////////////////////////////////////////////////////////////////////// +NPS::VDetector* MUST2Array::Construct(){ return (NPS::VDetector*) new MUST2Array(); - } - - //////////////////////////////////////////////////////////////////////////////// - // Registering the construct method to the factory // - //////////////////////////////////////////////////////////////////////////////// - extern"C" { - class proxy_nps_must2{ - public: - proxy_nps_must2(){ - NPS::DetectorFactory::getInstance()->AddToken("MUST2Array","MUST2Array"); - NPS::DetectorFactory::getInstance()->AddDetector("MUST2Array",MUST2Array::Construct); - } -}; +} - proxy_nps_must2 p_nps_must2; - } +//////////////////////////////////////////////////////////////////////////////// +// Registering the construct method to the factory // +//////////////////////////////////////////////////////////////////////////////// +extern"C" { + class proxy_nps_must2{ + public: + proxy_nps_must2(){ + NPS::DetectorFactory::getInstance()->AddToken("M2Telescope","MUST2"); + NPS::DetectorFactory::getInstance()->AddDetector("M2Telescope",MUST2Array::Construct); + } + }; + + proxy_nps_must2 p_nps_must2; +} diff --git a/NPSimulation/Detectors/MUST2/MUST2Array.hh b/NPSimulation/Detectors/MUST2/MUST2Array.hh index 291ca3e74fddae476f83aa6c5e5dce5a10c9bca9..ff06606aead1d8659c207fdad7dc337441b541c7 100644 --- a/NPSimulation/Detectors/MUST2/MUST2Array.hh +++ b/NPSimulation/Detectors/MUST2/MUST2Array.hh @@ -28,6 +28,7 @@ #include "TMust2Data.h" #include "G4SDManager.hh" #include "G4MultiFunctionalDetector.hh" +#include "NPInputParser.h" #include <vector> //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -115,7 +116,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/Microball/Microball.cc b/NPSimulation/Detectors/Microball/Microball.cc index 959a2fa5203685c330213d1a6fc6533f7dd3b22f..732504c737cce263fcfc9d7cd28b001d6bbcb073 100644 --- a/NPSimulation/Detectors/Microball/Microball.cc +++ b/NPSimulation/Detectors/Microball/Microball.cc @@ -1,18 +1,18 @@ /***************************************************************************** - * Copyright (C) 2009-2016 this file is part of the NPTool Project * + * Copyright (C) 2009-2016 this file is part of the NPTool Project * * * * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * * For the list of contributors see $NPTOOL/Licence/Contributors * *****************************************************************************/ /***************************************************************************** - * Original Author: Pierre Morfouace contact address: morfouac@nscl.msu.edu * + * Original Author: Pierre Morfouace contact address: morfouac@nscl.msu.edu * * * - * Creation Date : June 2016 * + * Creation Date : June 2016 * * Last update : * *---------------------------------------------------------------------------* * Decription: * - * This class describe Microball simulation * + * This class describe Microball simulation * * * *---------------------------------------------------------------------------* * Comment: * @@ -54,6 +54,7 @@ #include "RootOutput.h" #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" +#include "NPOptionManager.h" // CLHEP header #include "CLHEP/Random/RandGauss.h" @@ -149,195 +150,48 @@ G4LogicalVolume* Microball::BuildCylindricalDetector(){ // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Microball::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - -bool bR1 = false; -bool bR2 = false; -bool bR3 = false; -bool bR4 = false; -bool bR5 = false; -bool bR6 = false; -bool bR7 = false; -bool bR8 = false; -bool bR9 = false; -vector<int> copyNumArray; -bool bFlip = false; -bool bChamber = false; - - bool ReadingStatus = false ; - -bool check_Ring1 = false; -bool check_Ring2 = false; -bool check_Ring3 = false; -bool check_Ring4 = false; -bool check_Ring5 = false; -bool check_Ring6 = false; -bool check_Ring7 = false; -bool check_Ring8 = false; -bool check_Ring9 = false; -bool check_Flip = false; -bool check_Chamber = false; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Start Up Microball bloc, Reading toggle to true - string name = "Microball"; - - if (LineBuffer.compare(0, name.length(), name) == 0) { - G4cout << "///" << G4endl ; - G4cout << "Microball found: " << G4endl ; - ReadingStatus = true ; - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, name.length(),name) == 0) { - G4cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << G4endl ; - ReadingStatus = false ; - } - - //Angle method - else if (DataBuffer.compare(0, 6, "RING1=") == 0) { - check_Ring1 = true; - ConfigFile >> DataBuffer ; - bR1 = atoi(DataBuffer.c_str()) ; - G4cout << "Ring1: " << bR1 << G4endl; - } - - else if (DataBuffer.compare(0, 6, "RING2=") == 0) { - check_Ring2 = true; - ConfigFile >> DataBuffer ; - bR2 = atoi(DataBuffer.c_str()) ; - G4cout << "Ring2: " << bR2 << G4endl; - } - - else if (DataBuffer.compare(0, 6, "RING3=") == 0) { - check_Ring3 = true; - ConfigFile >> DataBuffer ; - bR3 = atoi(DataBuffer.c_str()) ; - G4cout << "Ring3: " << bR3 << G4endl; - } - - else if (DataBuffer.compare(0, 6, "RING4=") == 0) { - check_Ring4 = true; - ConfigFile >> DataBuffer ; - bR4 = atoi(DataBuffer.c_str()) ; - G4cout << "Ring4: " << bR4 << G4endl; - } - - else if (DataBuffer.compare(0, 6, "RING5=") == 0) { - check_Ring5 = true; - ConfigFile >> DataBuffer ; - bR5 = atoi(DataBuffer.c_str()) ; - G4cout << "Ring5: " << bR5 << G4endl; - } - - else if (DataBuffer.compare(0, 6, "RING6=") == 0) { - check_Ring6 = true; - ConfigFile >> DataBuffer ; - bR6 = atoi(DataBuffer.c_str()) ; - G4cout << "Ring6: " << bR6 << G4endl; - } +void Microball::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Microball"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; - else if (DataBuffer.compare(0, 6, "RING7=") == 0) { - check_Ring7 = true; - ConfigFile >> DataBuffer ; - bR7 = atoi(DataBuffer.c_str()) ; - G4cout << "Ring7: " << bR7 << G4endl; - } - - else if (DataBuffer.compare(0, 6, "RING8=") == 0) { - check_Ring8 = true; - ConfigFile >> DataBuffer ; - bR8 = atoi(DataBuffer.c_str()) ; - G4cout << "Ring8: " << bR8 << G4endl; - } - - - else if (DataBuffer.compare(0, 6, "RING9=") == 0) { - check_Ring9 = true; - ConfigFile >> DataBuffer ; - bR9 = atoi(DataBuffer.c_str()) ; - G4cout << "Ring9: " << bR9 << G4endl; - } + vector<string> token = {"RING1","RING2","RING3","RING4","RING5","RING6","RING7","RING8","RING9"}; - else if (DataBuffer.compare(0, 15, "DISABLE_CRYSTAL") == 0) { - ConfigFile >> DataBuffer ; - int item = atoi(DataBuffer.c_str()); - copyNumArray.push_back(item) ; - G4cout << "Disabled crystal: " << item << G4endl; - } + vector<int> copyNumArray; + bool bFlip = false; + bool bChamber = false; - else if (DataBuffer.compare(0, 14, "DETECTOR_FLIP=") == 0) { - check_Flip = true; - ConfigFile >> DataBuffer ; - bFlip = atoi(DataBuffer.c_str()) ; - G4cout << "Flip Detector: " << bFlip << G4endl; - } - - else if (DataBuffer.compare(0, 16, "INCLUDE_CHAMBER=") == 0) { - check_Chamber = true; - ConfigFile >> DataBuffer ; - bChamber = atoi(DataBuffer.c_str()) ; - G4cout << "Include Chamber: " << bChamber << G4endl; - } - - - //General - - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; - G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - } - if(check_Ring1 && check_Ring2 && check_Ring3 && - check_Ring4 && check_Ring5 && check_Ring6 && - check_Ring7 && check_Ring8 && check_Ring9 && - check_Flip && check_Chamber){ - AddMicroball(bR1, bR2, bR3, - bR4, bR5, bR6, - bR7, bR8, bR9, - copyNumArray, bFlip, bChamber); - - // Reinitialisation of Check Boolean - check_Ring1 = false ; - check_Ring2 = false ; - check_Ring3 = false ; - check_Ring4 = false ; - check_Ring5 = false ; - check_Ring6 = false ; - check_Ring7 = false ; - check_Ring8 = false ; - check_Ring9 = false ; - check_Flip = false ; - check_Chamber = false; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Microball " << i+1 << endl; + + bool bR1 = blocks[i]->GetInt("RING1"); + bool bR2 = blocks[i]->GetInt("RING2"); + bool bR3 = blocks[i]->GetInt("RING3"); + bool bR4 = blocks[i]->GetInt("RING4"); + bool bR5 = blocks[i]->GetInt("RING5"); + bool bR6 = blocks[i]->GetInt("RING6"); + bool bR7 = blocks[i]->GetInt("RING7"); + bool bR8 = blocks[i]->GetInt("RING8"); + bool bR9 = blocks[i]->GetInt("RING9"); + if(blocks[i]->HasToken("DISABLE_CRYSTAL")) + copyNumArray.push_back( blocks[i]->GetInt("DISABLE_CRYSTAL")); + if(blocks[i]->HasToken("DETECTOR_FLIP")) + bFlip = blocks[i]->GetInt("DETECTOR_FLIP"); + if(blocks[i]->HasToken("INCLUDE_CHAMBER")) + bChamber = blocks[i]->GetInt("INCLUDE_CHAMBER="); + + AddMicroball(bR1, bR2, bR3,bR4, bR5, bR6, bR7, bR8, bR9, copyNumArray, bFlip, bChamber); + } - ReadingStatus = false ; - G4cout << "///"<< G4endl ; - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } } + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Construct detector and inialise sensitive part. diff --git a/NPSimulation/Detectors/Microball/Microball.hh b/NPSimulation/Detectors/Microball/Microball.hh index 76a981b58794bc610462e6478a5a2a5be9e4ab83..64011090a260055074a942556f180b723408dfb0 100644 --- a/NPSimulation/Detectors/Microball/Microball.hh +++ b/NPSimulation/Detectors/Microball/Microball.hh @@ -35,7 +35,7 @@ using namespace std; // NPTool header #include "NPSVDetector.hh" #include "TMicroballData.h" - +#include "NPInputParser.h" class Microball : public NPS::VDetector{ //////////////////////////////////////////////////// /////// Default Constructor and Destructor ///////// @@ -67,7 +67,7 @@ class Microball : public NPS::VDetector{ public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/Miniball/Miniball.cc b/NPSimulation/Detectors/Miniball/Miniball.cc index 46244b8fe15e334ddab99bf93e95da6484ce2976..f4aa7dd1f5ac671e008cb34315d979bdacbcc05a 100644 --- a/NPSimulation/Detectors/Miniball/Miniball.cc +++ b/NPSimulation/Detectors/Miniball/Miniball.cc @@ -44,6 +44,7 @@ #include "RootOutput.h" #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" +#include "NPOptionManager.h" // CLHEP header #include "CLHEP/Random/RandGauss.h" @@ -150,96 +151,27 @@ G4AssemblyVolume* Miniball::BuildClusterDetector(){ // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Miniball::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double Theta = 0 , Phi = 0 , R = 0 ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool ReadingStatus = false ; - - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Start Up Miniball bloc, Reading toggle to true - string name = "Miniball"; - - if (LineBuffer.compare(0, name.length(), name) == 0) { - G4cout << "///" << G4endl ; - G4cout << "Miniball found: " << G4endl ; - ReadingStatus = true ; +void Miniball::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Miniball"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> token = {"R","Theta","Phi"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Miniball Cluster" << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + + AddMiniball(R,Theta,Phi); } - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, name.length(),name) == 0) { - G4cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << G4endl ; - ReadingStatus = false ; - } - - //Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R/mm << G4endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; - G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_Theta && check_Phi && check_R){ - AddMiniball(R,Theta,Phi); - - // Reinitialisation of Check Boolean - check_Theta = false ; - check_Phi = false ; - check_R = false ; - ReadingStatus = false ; - G4cout << "///"<< G4endl ; - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } } diff --git a/NPSimulation/Detectors/Miniball/Miniball.hh b/NPSimulation/Detectors/Miniball/Miniball.hh index ab3fe1989eaacb14132e56be02b8dc5fd7752965..f9156762ce21be27a78cabc0e20e8237b85b35f7 100644 --- a/NPSimulation/Detectors/Miniball/Miniball.hh +++ b/NPSimulation/Detectors/Miniball/Miniball.hh @@ -37,7 +37,7 @@ using namespace std; // NPTool header #include "NPSVDetector.hh" #include "TMiniballData.h" - +#include "NPInputParser.h" class Miniball : public NPS::VDetector{ //////////////////////////////////////////////////// /////// Default Constructor and Destructor ///////// @@ -67,7 +67,7 @@ class Miniball : public NPS::VDetector{ public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/Nana/Nana.cc b/NPSimulation/Detectors/Nana/Nana.cc index deaa9c066cce2c80a92cefad192d432907e67f15..db1a1b0049ad9ece85e8a35288ffd85172d9d597 100644 --- a/NPSimulation/Detectors/Nana/Nana.cc +++ b/NPSimulation/Detectors/Nana/Nana.cc @@ -118,167 +118,40 @@ void Nana::AddDetector(G4ThreeVector Pos, double beta_u, double beta_v, double b // Virtual Method of NPS::VDetector class // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Nana::ReadConfiguration(string Path){ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer, DataBuffer; - - // A,B,C,D are the four corner of the detector - - G4double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - G4ThreeVector A , B , C , D ; - G4double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ; - - bool ReadingStatus = false; - - bool check_A = false; - bool check_C = false; - bool check_B = false; - bool check_D = false; - - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 12, "NanaDetector") == 0) { - G4cout << "///" << G4endl ; - G4cout << "Detector found: " << G4endl ; - ReadingStatus = true ; +void Nana::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Nana"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + + vector<string> cart = {"A","B","C","D"}; + vector<string> sphe= {"R","Theta","Phi","Beta"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Nana " << i+1 << endl; + G4ThreeVector A = NPS::ConvertVector( blocks[i]->GetTVector3("A","mm")); + G4ThreeVector B = NPS::ConvertVector(blocks[i]->GetTVector3("B","mm")); + G4ThreeVector C = NPS::ConvertVector(blocks[i]->GetTVector3("C","mm")); + G4ThreeVector D = NPS::ConvertVector(blocks[i]->GetTVector3("D","mm")); + AddDetector(A,B,C,D) ; } - - - while (ReadingStatus) { - ConfigFile >> DataBuffer; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} - - // Position method - else if (DataBuffer == "A=") { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax * mm ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay * mm ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az * mm ; - - A = G4ThreeVector(Ax, Ay, Az); - G4cout << "Corner A position : " << A << G4endl; - } - else if (DataBuffer == "B=") { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx * mm ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By * mm ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz * mm ; - - B = G4ThreeVector(Bx, By, Bz); - G4cout << "Corner B position : " << B << G4endl; - } - - else if (DataBuffer == "C=") { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx * mm ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy * mm ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz * mm ; - - C = G4ThreeVector(Cx, Cy, Cz); - G4cout << "Corner C position : " << C << G4endl; - } - else if (DataBuffer == "D=") { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx * mm ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy * mm ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz * mm ; - - D = G4ThreeVector(Dx, Dy, Dz); - G4cout << "Corner D position : " << D << G4endl; - } - - // Angle method - else if (DataBuffer=="Theta=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - else if (DataBuffer=="Phi=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - else if (DataBuffer=="R=") { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R / mm << G4endl; - } - else if (DataBuffer=="Beta=") { - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; - } - - else G4cout << "WARNING: Wrong Token, Nana: Dector not added" << G4endl; - - // Add The previously define telescope - // With position method - if ((check_A && check_B && check_C && check_D) && - !(check_Theta && check_Phi && check_R)) { - ReadingStatus = false; - check_A = false; - check_C = false; - check_B = false; - check_D = false; - - AddDetector(A, B, C, D); - } - - // With angle method - if ((check_Theta && check_Phi && check_R ) && - !(check_A && check_B && check_C && check_D)) { - ReadingStatus = false; - check_Theta = false; - check_Phi = false; - check_R = false; - - R = R + 0.5*Length; - G4ThreeVector Pos(R*sin(Theta)*cos(Phi),R*sin(Theta)*sin(Phi),R*cos(Theta)); - AddDetector(Pos, beta_u, beta_v, beta_w); - } + + else if(blocks[i]->HasTokenList(sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Nana " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + vector<double> Beta = blocks[i]->GetVectorDouble("Beta","def"); + R = R + 0.5*Length; + G4ThreeVector Pos(R*sin(Theta)*cos(Phi),R*sin(Theta)*sin(Phi),R*cos(Theta)); + AddDetector(Pos,Beta[0],Beta[1],Beta[2]) ; + } + else{ + cout << "ERROR: Missing token for M2Telescope blocks, check your input file" << endl; + exit(1); } } } diff --git a/NPSimulation/Detectors/Nana/Nana.hh b/NPSimulation/Detectors/Nana/Nana.hh index 5056e7345a0e49ff51f486ce86c443cc3bdad711..e95bf26e3172dea2431bd97036ad0c271afc708e 100644 --- a/NPSimulation/Detectors/Nana/Nana.hh +++ b/NPSimulation/Detectors/Nana/Nana.hh @@ -39,6 +39,7 @@ // NPLib #include "TNanaData.h" +#include "NPInputParser.h" using namespace std; using namespace CLHEP; @@ -72,7 +73,7 @@ private: // Guarranty that each volume is created only once public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/NeutronWall/NeutronWall.cc b/NPSimulation/Detectors/NeutronWall/NeutronWall.cc index e0c39b758ce1e608cf62595f65a220b19738587a..ca16edf3e97c3af10b69b94435e433a6448fd368 100644 --- a/NPSimulation/Detectors/NeutronWall/NeutronWall.cc +++ b/NPSimulation/Detectors/NeutronWall/NeutronWall.cc @@ -50,6 +50,7 @@ #include "RootOutput.h" #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" +#include "NPOptionManager.h" // CLHEP header #include "CLHEP/Random/RandGauss.h" @@ -180,214 +181,39 @@ void NeutronWall::BuildDetector(){ // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void NeutronWall::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - double Theta = 0 , Phi = 0 , R = 0 ; - double X = 0 , Y = 0 , Z = 0 ; - double Rot =0; - int Bars = 0; - string NWMaterial = "NE213"; - double VWDistance = 0.0; - int VetoWall = 0; - string VWMaterial = "BC400"; - double Overlap = 6; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool check_rotation = false ; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - bool ReadingStatus = false ; - bool check_Bars = false ; - bool check_NWMaterial = false ; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Start Up NeutronWall bloc, Reading toggle to true - string name = "NeutronWall"; - - if (LineBuffer.compare(0, name.length(), name) == 0) { - G4cout << "///" << G4endl ; - G4cout << "NeutronWall found: " << G4endl ; - ReadingStatus = true ; - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, name.length(),name) == 0) { - G4cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << G4endl ; - ReadingStatus = false ; - } - - //Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R/mm << G4endl; - } - - //Position method - else if (DataBuffer.compare(0, 2, "X=") == 0) { - check_X = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - X = X * cm; - G4cout << "X: " << X / cm << G4endl; - } - - else if (DataBuffer.compare(0, 2, "Y=") == 0) { - check_Y = true; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - Y = Y * cm; - G4cout << "Y: " << Y / cm << G4endl; - } - - else if (DataBuffer.compare(0, 2, "Z=") == 0) { - check_Z = true; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - Z = Z * cm; - G4cout << "Z: " << Z / cm << G4endl; - } - - - //General - else if (DataBuffer.compare(0, 4, "Rot=") == 0) { - check_rotation = true; - ConfigFile >> DataBuffer ; - Rot = atof(DataBuffer.c_str()); - Rot = Rot*deg ; - G4cout << "Rotation: " << Rot/deg << G4endl; - } - - //Bar number - else if (DataBuffer.compare(0, 5, "BARS=") == 0){ - check_Bars = true; - ConfigFile >> DataBuffer ; - Bars = atoi(DataBuffer.c_str()) ; - G4cout << "Bars: " << Bars << G4endl; - } - - - //Material type - else if (DataBuffer.compare(0, 11, "NWMATERIAL=") == 0){ - check_NWMaterial = true; - ConfigFile >> DataBuffer ; - NWMaterial = DataBuffer; - G4cout << "NWMaterials: " << NWMaterial << G4endl; - } - - //Distance - else if (DataBuffer.compare(0, 11, "VWDISTANCE=") == 0){ - //check_VWDistance = true; - ConfigFile >> DataBuffer ; - VWDistance = atof(DataBuffer.c_str()); - VWDistance = VWDistance * mm; - G4cout << "VWDistance: " << VWDistance << G4endl; - } - - //Decide whether to add the vetowall or not, 1 means yes, 0 means no - else if (DataBuffer.compare(0, 9, "VETOWALL=") == 0){ - //check_VetoWall = true; - ConfigFile >> DataBuffer ; - VetoWall = atoi(DataBuffer.c_str()); - G4cout << "VetoWall: " << VetoWall << G4endl; - } - - //VetoWall Material - else if (DataBuffer.compare(0, 11, "VWMATERIAL=") == 0){ - //check_VWMaterial = true; - ConfigFile >> DataBuffer ; - VWMaterial = DataBuffer ; - G4cout << "VWMaterial: " << VWMaterial << G4endl; - } - - //Overlap - else if (DataBuffer.compare(0, 8, "OVERLAP=") == 0){ - ConfigFile >> DataBuffer ; - Overlap = atof(DataBuffer.c_str()); - Overlap = Overlap*mm; - G4cout << "Overlap: " << Overlap << G4endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; - G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (( check_Theta && check_Phi && check_R && check_Bars && check_NWMaterial) - || - ( check_X && check_Y && check_Z && check_rotation && check_Bars && check_NWMaterial)){ - - - // Convert Cartesian to Spherical (detector always face the target) - if (check_X){ - R = sqrt (X*X+Y*Y+Z*Z); - Theta = acos(Z / (R) ); - Phi = atan2(Y,X); - } - - AddNeutronWall(R,Theta,Phi,X,Y,Z,Rot, Bars, NWMaterial, VWDistance, VetoWall, VWMaterial, Overlap); +void NeutronWall::ReadConfiguration(NPL::InputParser parser){ + + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("NeutronWall"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> token = {"R","THETA","PHI","BARS","VETOWALL","VWDISTANCE","NWMATERIAL","VWMATERIAL","OVERLAP"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Neutron Wall " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + int Bars = blocks[i]->GetInt("BARS"); + int VetoWall = blocks[i]->GetInt("VETOWALL"); + double VWDistance = blocks[i]->GetDouble("VWDISTANCE","mm"); + string NWMaterial = blocks[i]->GetString("NWMATERIAL"); + string VWMaterial = blocks[i]->GetString("VWMATERIAL"); + + int Overlap = blocks[i]->GetInt("OVERLAP"); + AddNeutronWall(R,Theta,Phi,0,0,0,0, Bars, NWMaterial, VWDistance, VetoWall, VWMaterial, Overlap); - // Reinitialisation of Check Boolean - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_rotation = false ; - check_X = false ; - check_Y = false ; - check_Z = false ; - ReadingStatus = false ; - check_Bars = false ; - check_NWMaterial = false ; - G4cout << "///"<< G4endl ; - } - } } + + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } } + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Construct detector and inialise sensitive part. diff --git a/NPSimulation/Detectors/NeutronWall/NeutronWall.hh b/NPSimulation/Detectors/NeutronWall/NeutronWall.hh index 503077ab2ab25a56bf2461aee588e81345c30a7b..3e1dc9a4bad55b8e5c70bce91114cd52c20df97b 100644 --- a/NPSimulation/Detectors/NeutronWall/NeutronWall.hh +++ b/NPSimulation/Detectors/NeutronWall/NeutronWall.hh @@ -35,7 +35,7 @@ using namespace std; // NPTool header #include "NPSVDetector.hh" #include "TNeutronWallData.h" - +#include "NPInputParser.h" class NeutronWall : public NPS::VDetector{ //////////////////////////////////////////////////// /////// Default Constructor and Destructor ///////// @@ -87,7 +87,7 @@ private: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/Paris/Paris.cc b/NPSimulation/Detectors/Paris/Paris.cc index 5c46953fb8631d32d64e2f7a79299a327859ee22..401c3c4ad11bd067d1718eeb6a6c2b02be0a2c57 100644 --- a/NPSimulation/Detectors/Paris/Paris.cc +++ b/NPSimulation/Detectors/Paris/Paris.cc @@ -166,182 +166,62 @@ void Paris::AddPhoswich(G4ThreeVector Pos, double beta_u, double beta_v, double // Virtual Method of NPS::VDetector class // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Paris::ReadConfiguration(string Path){ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer, DataBuffer; - - // A,B,C,D are the four corner of the detector - - G4double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; - G4ThreeVector A , B , C , D ; - G4double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ; - bool Type = true; - - bool ReadingStatus = false; - - bool check_A = false; - bool check_C = false; - bool check_B = false; - bool check_D = false; - - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - if (LineBuffer.compare(0, 12, "ParisCluster") == 0) { - G4cout << "///" << G4endl ; - G4cout << "Cluster element found: " << G4endl ; - ReadingStatus = true ; - Type = true; +void Paris::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Paris"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> cart = {"A","B","C","D"}; + vector<string> sphe = {"R","THETA","PHI","BETA"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart) && blocks[i]->GetMainValue()=="Cluster"){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Cluster " << i+1 << endl; + G4ThreeVector A = NPS::ConvertVector(blocks[i]->GetTVector3("A","mm")); + G4ThreeVector B = NPS::ConvertVector(blocks[i]->GetTVector3("B","mm")); + G4ThreeVector C = NPS::ConvertVector(blocks[i]->GetTVector3("C","mm")); + G4ThreeVector D = NPS::ConvertVector(blocks[i]->GetTVector3("D","mm")); + + AddCluster(A,B,C,D); } - - else if (LineBuffer.compare(0, 13, "ParisPhoswich") == 0) { - G4cout << "///" << G4endl ; - G4cout << "Phoswich element found: " << G4endl ; - ReadingStatus = true ; - Type = false; + else if(blocks[i]->HasTokenList(sphe)&& blocks[i]->GetMainValue()=="Cluster"){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Cluster " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> Beta = blocks[i]->GetVectorDouble("BETA","deg"); + R = R + 0.5*Length; + G4ThreeVector Pos(R*sin(Theta)*cos(Phi),R*sin(Theta)*sin(Phi),R*cos(Theta)); + AddCluster(Pos,Beta[0],Beta[1],Beta[2]); + } + else if(blocks[i]->HasTokenList(cart)&& blocks[i]->GetMainValue()=="Phoswich"){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Phoswich" << i+1 << endl; + G4ThreeVector A = NPS::ConvertVector(blocks[i]->GetTVector3("A","mm")); + G4ThreeVector B = NPS::ConvertVector(blocks[i]->GetTVector3("B","mm")); + G4ThreeVector C = NPS::ConvertVector(blocks[i]->GetTVector3("C","mm")); + G4ThreeVector D = NPS::ConvertVector(blocks[i]->GetTVector3("D","mm")); + + AddPhoswich(A,B,C,D); } + else if(blocks[i]->HasTokenList(sphe)&& blocks[i]->GetMainValue()=="Phoswich"){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Phoswich " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> Beta = blocks[i]->GetVectorDouble("BETA","deg"); + R = R + 0.5*Length; + G4ThreeVector Pos(R*sin(Theta)*cos(Phi),R*sin(Theta)*sin(Phi),R*cos(Theta)); + AddPhoswich(Pos,Beta[0],Beta[1],Beta[2]); + } - while (ReadingStatus) { - ConfigFile >> DataBuffer; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} - - // Position method - else if (DataBuffer == "A=") { - check_A = true; - ConfigFile >> DataBuffer ; - Ax = atof(DataBuffer.c_str()) ; - Ax = Ax * mm ; - ConfigFile >> DataBuffer ; - Ay = atof(DataBuffer.c_str()) ; - Ay = Ay * mm ; - ConfigFile >> DataBuffer ; - Az = atof(DataBuffer.c_str()) ; - Az = Az * mm ; - - A = G4ThreeVector(Ax, Ay, Az); - G4cout << "Corner A position : " << A << G4endl; - } - else if (DataBuffer == "B=") { - check_B = true; - ConfigFile >> DataBuffer ; - Bx = atof(DataBuffer.c_str()) ; - Bx = Bx * mm ; - ConfigFile >> DataBuffer ; - By = atof(DataBuffer.c_str()) ; - By = By * mm ; - ConfigFile >> DataBuffer ; - Bz = atof(DataBuffer.c_str()) ; - Bz = Bz * mm ; - - B = G4ThreeVector(Bx, By, Bz); - G4cout << "Corner B position : " << B << G4endl; - } - - else if (DataBuffer == "C=") { - check_C = true; - ConfigFile >> DataBuffer ; - Cx = atof(DataBuffer.c_str()) ; - Cx = Cx * mm ; - ConfigFile >> DataBuffer ; - Cy = atof(DataBuffer.c_str()) ; - Cy = Cy * mm ; - ConfigFile >> DataBuffer ; - Cz = atof(DataBuffer.c_str()) ; - Cz = Cz * mm ; - - C = G4ThreeVector(Cx, Cy, Cz); - G4cout << "Corner C position : " << C << G4endl; - } - else if (DataBuffer == "D=") { - check_D = true; - ConfigFile >> DataBuffer ; - Dx = atof(DataBuffer.c_str()) ; - Dx = Dx * mm ; - ConfigFile >> DataBuffer ; - Dy = atof(DataBuffer.c_str()) ; - Dy = Dy * mm ; - ConfigFile >> DataBuffer ; - Dz = atof(DataBuffer.c_str()) ; - Dz = Dz * mm ; - - D = G4ThreeVector(Dx, Dy, Dz); - G4cout << "Corner D position : " << D << G4endl; - } - - // Angle method - else if (DataBuffer=="Theta=") { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - else if (DataBuffer=="Phi=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - else if (DataBuffer=="R=") { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R / mm << G4endl; - } - else if (DataBuffer=="Beta=") { - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; - } - - else G4cout << "WARNING: Wrong Token, ParisCluster: Cluster Element not added" << G4endl; - - // Add The previously define telescope - // With position method - if ((check_A && check_B && check_C && check_D) && - !(check_Theta && check_Phi && check_R)) { - ReadingStatus = false; - check_A = false; - check_C = false; - check_B = false; - check_D = false; - - if(Type) - AddCluster(A, B, C, D); - else - AddPhoswich(A, B, C, D); - } - - // With angle method - if ((check_Theta && check_Phi && check_R ) && - !(check_A && check_B && check_C && check_D)) { - ReadingStatus = false; - check_Theta = false; - check_Phi = false; - check_R = false; - - G4ThreeVector Pos(R*sin(Theta)*cos(Phi),R*sin(Theta)*sin(Phi),R*cos(Theta)); - - if(Type) - AddCluster(Pos, beta_u, beta_v, beta_w); - else - AddPhoswich(Pos, beta_u, beta_v, beta_w); - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } } diff --git a/NPSimulation/Detectors/Paris/Paris.hh b/NPSimulation/Detectors/Paris/Paris.hh index c0ca39594364890ca77d0e21cfe9f7e7ebfdff6e..e8f205543336d172a0aa510f447d7febd7936cea 100644 --- a/NPSimulation/Detectors/Paris/Paris.hh +++ b/NPSimulation/Detectors/Paris/Paris.hh @@ -39,6 +39,7 @@ // NPLib #include "TParisData.h" +#include "NPInputParser.h" using namespace std; using namespace CLHEP; @@ -79,7 +80,7 @@ private: // Guarranty that each volume is created only once public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/Plastic/Plastic.cc b/NPSimulation/Detectors/Plastic/Plastic.cc index e6b7d0fc2125d6c9b5bd0c6d0d66d3e4bf26b212..5108bab8bc9a42768423795f308f5c3f458afdbd 100644 --- a/NPSimulation/Detectors/Plastic/Plastic.cc +++ b/NPSimulation/Detectors/Plastic/Plastic.cc @@ -46,6 +46,7 @@ #include "RootOutput.h" #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" +#include "NPOptionManager.h" using namespace OBSOLETEGENERALSCORERS ; // CLHEP header #include "CLHEP/Random/RandGauss.h" @@ -56,9 +57,9 @@ using namespace CLHEP; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... namespace PLASTIC{ - // Energy and time Resolution - const G4double ResoTime = 1. ;// Resolution in ns // - const G4double ResoEnergy = 0.1 ;// Resolution in % + // Energy and time Resolution + const G4double ResoTime = 1. ;// Resolution in ns // + const G4double ResoEnergy = 0.1 ;// Resolution in % } using namespace PLASTIC ; @@ -67,8 +68,8 @@ using namespace PLASTIC ; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Plastic Specific Method Plastic::Plastic(){ - m_Event = new TPlasticData() ; - m_PlasticScorer = 0; + m_Event = new TPlasticData() ; + m_PlasticScorer = 0; } Plastic::~Plastic(){ @@ -76,45 +77,45 @@ Plastic::~Plastic(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Plastic::AddPlastic( G4double R , - G4double Theta , - G4double Phi , - G4double PlasticThickness , - G4double PlasticRadius , - G4String Scintillator , - G4double LeadThickness ) + G4double Theta , + G4double Phi , + G4double PlasticThickness , + G4double PlasticRadius , + G4String Scintillator , + G4double LeadThickness ) { - - m_R.push_back(R) ; - m_Theta.push_back(Theta) ; - m_Phi.push_back(Phi) ; - m_PlasticThickness.push_back(PlasticThickness) ; - m_LeadThickness.push_back(LeadThickness) ; - m_Scintillator.push_back(Scintillator) ; - m_PlasticRadius.push_back(PlasticRadius) ; // cylindrical shape - m_PlasticHeight.push_back(-1) ; // squared shape - m_PlasticWidth.push_back(-1) ; // squared shape + + m_R.push_back(R) ; + m_Theta.push_back(Theta) ; + m_Phi.push_back(Phi) ; + m_PlasticThickness.push_back(PlasticThickness) ; + m_LeadThickness.push_back(LeadThickness) ; + m_Scintillator.push_back(Scintillator) ; + m_PlasticRadius.push_back(PlasticRadius) ; // cylindrical shape + m_PlasticHeight.push_back(-1) ; // squared shape + m_PlasticWidth.push_back(-1) ; // squared shape } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Plastic::AddPlastic( G4double R , - G4double Theta , - G4double Phi , - G4double Height , - G4double Width , - G4double PlasticThickness , - G4String Scintillator , - G4double LeadThickness ) + G4double Theta , + G4double Phi , + G4double Height , + G4double Width , + G4double PlasticThickness , + G4String Scintillator , + G4double LeadThickness ) { - m_R.push_back(R) ; - m_Theta.push_back(Theta) ; - m_Phi.push_back(Phi) ; - m_PlasticThickness.push_back(PlasticThickness) ; - m_LeadThickness.push_back(LeadThickness) ; - m_Scintillator.push_back(Scintillator) ; - m_PlasticRadius.push_back(-1) ; // cylindrical shape - m_PlasticHeight.push_back(Height) ; // squared shape - m_PlasticWidth.push_back(Width) ; // squared shape - + m_R.push_back(R) ; + m_Theta.push_back(Theta) ; + m_Phi.push_back(Phi) ; + m_PlasticThickness.push_back(PlasticThickness) ; + m_LeadThickness.push_back(LeadThickness) ; + m_Scintillator.push_back(Scintillator) ; + m_PlasticRadius.push_back(-1) ; // cylindrical shape + m_PlasticHeight.push_back(Height) ; // squared shape + m_PlasticWidth.push_back(Width) ; // squared shape + } @@ -126,579 +127,420 @@ void Plastic::AddPlastic( G4double R , // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Plastic::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - G4double Theta = 0 , Phi = 0 , R = 0 , Thickness = 0 , Radius = 0 ; - G4double LeadThickness = 0, X = 0 , Y = 0 , Z = 0 , Width = 0 , Height = 0 ; - G4String Scintillator, Shape ; - - bool check_Theta = false ; - bool check_Phi = false ; - bool check_R = false ; - bool check_Thickness = false ; - bool check_Radius = false ; - bool check_LeadThickness = false ; - bool check_Scintillator = false ; - bool check_Height = false ; - bool check_Width = false ; - bool check_Shape = false ; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - bool ReadingStatus = false ; - - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Start Up Plastic bloc, Reading toggle to true - if (LineBuffer.compare(0, 7, "Plastic") == 0) { - G4cout << "///" << G4endl ; - G4cout << "Platic found: " << G4endl ; - ReadingStatus = true ; - - } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, 6, "Plastic") == 0) { - G4cout << "WARNING: Another Telescope is find before standard sequence of Token, Error may occured in Telecope definition" << G4endl ; - ReadingStatus = false ; - } - - //Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R/mm << G4endl; - } - - //Position method - else if (DataBuffer.compare(0, 2, "X=") == 0) { - check_X = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - X = X * mm; - G4cout << "X: " << X / mm << G4endl; - } - - else if (DataBuffer.compare(0, 2, "Y=") == 0) { - check_Y = true; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - Y = Y * mm; - G4cout << "Y: " << Y / mm << G4endl; - } - - else if (DataBuffer.compare(0, 2, "Z=") == 0) { - check_Z = true; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - Z = Z * mm; - G4cout << "Z: " << Z / mm << G4endl; - } - - - //General - else if (DataBuffer.compare(0, 6, "Shape=") == 0) { - check_Shape = true; - ConfigFile >> DataBuffer ; - Shape = DataBuffer ; - G4cout << "Shape: " << Shape << G4endl; - } - - // Cylindrical shape - else if (DataBuffer.compare(0, 7, "Radius=") == 0) { - check_Radius = true; - ConfigFile >> DataBuffer ; - Radius = atof(DataBuffer.c_str()) ; - Radius = Radius * mm; - G4cout << "Plastic Radius: " << Radius/mm << G4endl; - } - - // Squared shape - else if (DataBuffer.compare(0, 7, "Width=") == 0) { - check_Width = true; - ConfigFile >> DataBuffer ; - Width = atof(DataBuffer.c_str()) ; - Width = Width * mm; - G4cout << "Plastic Width: " << Width/mm << G4endl; - } - - else if (DataBuffer.compare(0, 7, "Height=") == 0) { - check_Height = true; - ConfigFile >> DataBuffer ; - Height = atof(DataBuffer.c_str()) ; - Height = Height * mm; - G4cout << "Plastic Height: " << Height/mm << G4endl; - } - - // Common - else if (DataBuffer.compare(0, 10, "Thickness=") == 0) { - check_Thickness = true; - ConfigFile >> DataBuffer ; - Thickness = atof(DataBuffer.c_str()) ; - Thickness = Thickness * mm; - G4cout << "Plastic Thickness: " << Thickness/mm << G4endl; - } - - else if (DataBuffer.compare(0, 13, "Scintillator=") == 0) { - check_Scintillator = true ; - ConfigFile >> DataBuffer ; - Scintillator = DataBuffer ; - G4cout << "Plastic Scintillator type: " << Scintillator << G4endl; - } - - else if (DataBuffer.compare(0, 14, "LeadThickness=") == 0) { - check_LeadThickness = true; - ConfigFile >> DataBuffer ; - LeadThickness = atof(DataBuffer.c_str()) ; - LeadThickness = LeadThickness * mm; - G4cout << "Lead Thickness : " << LeadThickness/mm << G4endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; - G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (( check_Theta && check_Phi && check_R && check_Thickness - && check_Radius && check_LeadThickness && check_Scintillator - && check_Shape) // Cylindrical case - || - ( check_X && check_Y && check_Z && check_Thickness && check_Radius - && check_LeadThickness && check_Scintillator ) - || - ( check_Theta && check_Phi && check_R && check_Thickness - && check_Width && check_Height && check_LeadThickness - && check_Scintillator && check_Shape ) // Squared case - || - ( check_X && check_Y && check_Z && check_Thickness && check_Width - && check_Height && check_LeadThickness && check_Scintillator )) { - - if (check_X && check_Y && check_Z){ - R = sqrt (X*X+Y*Y+Z*Z); - Theta = acos(Z / (R) ); - Phi = atan2(Y,X); - } - - if (Shape == "Cylinder") - AddPlastic( R , - Theta , - Phi , - Thickness , - Radius , - Scintillator , - LeadThickness ); - - else if (Shape == "Square") - AddPlastic( R , - Theta , - Phi , - Height , - Width , - Thickness , - Scintillator , - LeadThickness ); - - // Reinitialisation of Check Boolean - - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_Thickness = false ; - check_Radius = false ; - check_LeadThickness = false ; - check_Scintillator = false ; - check_Height = false ; - check_Width = false ; - check_Shape = false ; - check_X = false ; - check_Y = false ; - check_Z = false ; - ReadingStatus = false ; - G4cout << "///"<< G4endl ; - } - } +void Plastic::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Plastic"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> cart = {"X","Y","Z"}; + vector<string> sphe = {"R","Theta","Phi"}; + vector<string> square= {"Shape","Height","Width","Thickness","Scintillator","LeadThickness"}; + vector<string> cylind= {"Shape","Radius","Thickness","Scintillator","LeadThickness"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Plastic " << i+1 << endl; + double X = blocks[i]->GetDouble("X","mm"); + double Y = blocks[i]->GetDouble("Y","mm"); + double Z = blocks[i]->GetDouble("Z","mm"); + double R = sqrt (X*X+Y*Y+Z*Z); + double Theta = acos(Z / (R) ); + double Phi = atan2(Y,X); + + if(blocks[i]->HasTokenList(square)){ + string Shape = blocks[i]->GetString("Shape"); + double H = blocks[i]->GetDouble("Height","mm"); + double W = blocks[i]->GetDouble("Width","mm"); + double T = blocks[i]->GetDouble("Thickness","mm"); + string Mat = blocks[i]->GetString("Scintillator"); + double Lead = blocks[i]->GetDouble("LeadThickness","mm"); + AddPlastic(R,Theta,Phi,H,W,T,Mat,Lead); + } + + else if(blocks[i]->HasTokenList(cylind)){ + string Shape = blocks[i]->GetString("Shape"); + double Rd = blocks[i]->GetDouble("Radius","mm"); + double T = blocks[i]->GetDouble("Thickness","mm"); + string Mat = blocks[i]->GetString("Scintillator"); + double Lead = blocks[i]->GetDouble("LeadThickness","mm"); + AddPlastic(R,Theta,Phi,T,Rd,Mat,Lead); + } + } + else if(blocks[i]->HasTokenList(sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Plastic " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + + if(blocks[i]->HasTokenList(square)){ + string Shape = blocks[i]->GetString("Shape"); + double H = blocks[i]->GetDouble("Height","mm"); + double W = blocks[i]->GetDouble("Width","mm"); + double T = blocks[i]->GetDouble("Thickness","mm"); + string Mat = blocks[i]->GetString("Scintillator"); + double Lead = blocks[i]->GetDouble("LeadThickness","mm"); + AddPlastic(R,Theta,Phi,H,W,T,Mat,Lead); + } + + else if(blocks[i]->HasTokenList(cylind)){ + string Shape = blocks[i]->GetString("Shape"); + double Rd = blocks[i]->GetDouble("Radius","mm"); + double T = blocks[i]->GetDouble("Thickness","mm"); + string Mat = blocks[i]->GetString("Scintillator"); + double Lead = blocks[i]->GetDouble("LeadThickness","mm"); + AddPlastic(R,Theta,Phi,T,Rd,Mat,Lead); + } + + } + + + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } } // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method void Plastic::ConstructDetector(G4LogicalVolume* world){ - G4ThreeVector Det_pos = G4ThreeVector(0, 0, 0) ; - - for (unsigned short i = 0 ; i < m_R.size() ; i++) { - G4double wX = m_R[i] * sin(m_Theta[i] ) * cos(m_Phi[i] ) ; - G4double wY = m_R[i] * sin(m_Theta[i] ) * sin(m_Phi[i] ) ; - G4double wZ = m_R[i] * cos(m_Theta[i] ) ; - Det_pos = G4ThreeVector(wX, wY, wZ) ; - VolumeMaker(Det_pos , i+1, world) ; - } - + G4ThreeVector Det_pos = G4ThreeVector(0, 0, 0) ; + + for (unsigned short i = 0 ; i < m_R.size() ; i++) { + G4double wX = m_R[i] * sin(m_Theta[i] ) * cos(m_Phi[i] ) ; + G4double wY = m_R[i] * sin(m_Theta[i] ) * sin(m_Phi[i] ) ; + G4double wZ = m_R[i] * cos(m_Theta[i] ) ; + Det_pos = G4ThreeVector(wX, wY, wZ) ; + VolumeMaker(Det_pos , i+1, world) ; + } + } void Plastic::VolumeMaker(G4ThreeVector Det_pos, int DetNumber, G4LogicalVolume* world){ - //////////////////////////////////////////////////////////////// - ////////////// Starting Volume Definition ////////////////////// - //////////////////////////////////////////////////////////////// - // Name of the module - std::ostringstream DetectorNumber ; - DetectorNumber << DetNumber ; - G4String Name = "Plastic" + DetectorNumber.str() ; - - int i = DetNumber-1; - - G4Material* PlasticMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(m_Scintillator[i]) ; - - // Definition of the volume containing the sensitive detector - - // Cylindrical Case - if(m_PlasticRadius[i]!=-1){ - if(m_PlasticThickness[i]>0 && m_PlasticRadius[i]>0){ - G4Tubs* solidPlastic = new G4Tubs( Name , - 0 , - m_PlasticRadius[i] , - m_PlasticThickness[i]/2 , - 0*deg , - 360*deg); - - G4LogicalVolume* logicPlastic = new G4LogicalVolume(solidPlastic, PlasticMaterial, Name+ "_Scintillator", 0, 0, 0); - logicPlastic->SetSensitiveDetector(m_PlasticScorer); - - G4VisAttributes* PlastVisAtt = new G4VisAttributes(G4Colour(0.0, 0.0, 0.9)) ; - logicPlastic->SetVisAttributes(PlastVisAtt) ; - - - - new G4PVPlacement(0 , - Det_pos , - logicPlastic , - Name + "_Scintillator" , - world , - false , - 0 ); - } - - - if(m_LeadThickness[i]>0&& m_PlasticRadius[i]>0){ - G4Tubs* solidLead = new G4Tubs(Name+"_Lead", - 0, - m_PlasticRadius[i], - m_LeadThickness[i]/2, - 0*deg, - 360*deg); - - G4Material* MaterialLead = MaterialManager::getInstance()->GetMaterialFromLibrary("Al"); - G4LogicalVolume* logicLead = new G4LogicalVolume(solidLead, MaterialLead, Name+"_Al", 0, 0, 0);//AC changed lead to Al - G4VisAttributes* LeadVisAtt = new G4VisAttributes(G4Colour(0.1, 0.1, 0.1)) ; - logicLead->SetVisAttributes(LeadVisAtt) ; - - G4PVPlacement( 0, - Det_pos+(m_PlasticThickness[i]/2+m_LeadThickness[i]/2)*Det_pos.unit(), - logicLead, - Name+"_Al", - world, - false, - 0); - } + //////////////////////////////////////////////////////////////// + ////////////// Starting Volume Definition ////////////////////// + //////////////////////////////////////////////////////////////// + // Name of the module + std::ostringstream DetectorNumber ; + DetectorNumber << DetNumber ; + G4String Name = "Plastic" + DetectorNumber.str() ; + + int i = DetNumber-1; + + G4Material* PlasticMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(m_Scintillator[i]) ; + + // Definition of the volume containing the sensitive detector + + // Cylindrical Case + if(m_PlasticRadius[i]!=-1){ + if(m_PlasticThickness[i]>0 && m_PlasticRadius[i]>0){ + G4Tubs* solidPlastic = new G4Tubs( Name , + 0 , + m_PlasticRadius[i] , + m_PlasticThickness[i]/2 , + 0*deg , + 360*deg); + + G4LogicalVolume* logicPlastic = new G4LogicalVolume(solidPlastic, PlasticMaterial, Name+ "_Scintillator", 0, 0, 0); + logicPlastic->SetSensitiveDetector(m_PlasticScorer); + + G4VisAttributes* PlastVisAtt = new G4VisAttributes(G4Colour(0.0, 0.0, 0.9)) ; + logicPlastic->SetVisAttributes(PlastVisAtt) ; + + + + new G4PVPlacement(0 , + Det_pos , + logicPlastic , + Name + "_Scintillator" , + world , + false , + 0 ); } - - // Squared case - if(m_PlasticHeight[i]!=-1){ - if(m_PlasticThickness[i]>0 && m_PlasticHeight[i]>0 && m_PlasticWidth[i]>0){ - G4Box* solidPlastic = new G4Box(Name, 0.5*m_PlasticWidth[i], 0.5*m_PlasticHeight[i], 0.5*m_PlasticThickness[i]); - G4LogicalVolume* logicPlastic = new G4LogicalVolume(solidPlastic, PlasticMaterial, Name+ "_Scintillator", 0, 0, 0); - logicPlastic->SetSensitiveDetector(m_PlasticScorer); - - G4VisAttributes* PlastVisAtt = new G4VisAttributes(G4Colour(0, 0, 1, 0.5)) ; - logicPlastic->SetVisAttributes(PlastVisAtt) ; - - G4RotationMatrix Rot3D; - Rot3D.set(0, 0, 0); - new G4PVPlacement( G4Transform3D(Rot3D,Det_pos), - logicPlastic, - Name + "_Scintillator" , - world, - false, - 0); - } - - if(m_LeadThickness[i]>0&& m_PlasticHeight[i]>0 && m_PlasticWidth[i]>0){ - G4Box* solidLead = new G4Box(Name+"_Al", 1*m_PlasticWidth[i], 1*m_PlasticHeight[i], 0.5*m_LeadThickness[i]); - - G4Material* MaterialLead = MaterialManager::getInstance()->GetMaterialFromLibrary("Al"); - G4LogicalVolume* logicLead = new G4LogicalVolume(solidLead, MaterialLead, Name+"_Al", 0, 0, 0); - G4VisAttributes* LeadVisAtt = new G4VisAttributes(G4Colour(0.5, 0.5, 0.5)) ; - logicLead->SetVisAttributes(LeadVisAtt) ; - - new G4PVPlacement(0, - Det_pos-(m_PlasticThickness[i]/2+m_LeadThickness[i]/2)*Det_pos.unit() -G4ThreeVector(0,0,1*cm) , - logicLead, - Name+"_Al", - world, - false, - 0); - } + + + if(m_LeadThickness[i]>0&& m_PlasticRadius[i]>0){ + G4Tubs* solidLead = new G4Tubs(Name+"_Lead", + 0, + m_PlasticRadius[i], + m_LeadThickness[i]/2, + 0*deg, + 360*deg); + + G4Material* MaterialLead = MaterialManager::getInstance()->GetMaterialFromLibrary("Al"); + G4LogicalVolume* logicLead = new G4LogicalVolume(solidLead, MaterialLead, Name+"_Al", 0, 0, 0);//AC changed lead to Al + G4VisAttributes* LeadVisAtt = new G4VisAttributes(G4Colour(0.1, 0.1, 0.1)) ; + logicLead->SetVisAttributes(LeadVisAtt) ; + + G4PVPlacement( 0, + Det_pos+(m_PlasticThickness[i]/2+m_LeadThickness[i]/2)*Det_pos.unit(), + logicLead, + Name+"_Al", + world, + false, + 0); } + } + + // Squared case + if(m_PlasticHeight[i]!=-1){ + if(m_PlasticThickness[i]>0 && m_PlasticHeight[i]>0 && m_PlasticWidth[i]>0){ + G4Box* solidPlastic = new G4Box(Name, 0.5*m_PlasticWidth[i], 0.5*m_PlasticHeight[i], 0.5*m_PlasticThickness[i]); + G4LogicalVolume* logicPlastic = new G4LogicalVolume(solidPlastic, PlasticMaterial, Name+ "_Scintillator", 0, 0, 0); + logicPlastic->SetSensitiveDetector(m_PlasticScorer); + + G4VisAttributes* PlastVisAtt = new G4VisAttributes(G4Colour(0, 0, 1, 0.5)) ; + logicPlastic->SetVisAttributes(PlastVisAtt) ; + + G4RotationMatrix Rot3D; + Rot3D.set(0, 0, 0); + new G4PVPlacement( G4Transform3D(Rot3D,Det_pos), + logicPlastic, + Name + "_Scintillator" , + world, + false, + 0); + } + + if(m_LeadThickness[i]>0&& m_PlasticHeight[i]>0 && m_PlasticWidth[i]>0){ + G4Box* solidLead = new G4Box(Name+"_Al", 1*m_PlasticWidth[i], 1*m_PlasticHeight[i], 0.5*m_LeadThickness[i]); + + G4Material* MaterialLead = MaterialManager::getInstance()->GetMaterialFromLibrary("Al"); + G4LogicalVolume* logicLead = new G4LogicalVolume(solidLead, MaterialLead, Name+"_Al", 0, 0, 0); + G4VisAttributes* LeadVisAtt = new G4VisAttributes(G4Colour(0.5, 0.5, 0.5)) ; + logicLead->SetVisAttributes(LeadVisAtt) ; + + new G4PVPlacement(0, + Det_pos-(m_PlasticThickness[i]/2+m_LeadThickness[i]/2)*Det_pos.unit() -G4ThreeVector(0,0,1*cm) , + logicLead, + Name+"_Al", + world, + false, + 0); + } + } } // Add Detector branch to the EventTree. // Called After DetecorConstruction::AddDetector Method void Plastic::InitializeRootOutput(){ - RootOutput *pAnalysis = RootOutput::getInstance(); - TTree *pTree = pAnalysis->GetTree(); - if(!pTree->FindBranch("Plastic")){ - pTree->Branch("Plastic", "TPlasticData", &m_Event) ; - } - pTree->SetBranchAddress("Plastic", &m_Event) ; + RootOutput *pAnalysis = RootOutput::getInstance(); + TTree *pTree = pAnalysis->GetTree(); + if(!pTree->FindBranch("Plastic")){ + pTree->Branch("Plastic", "TPlasticData", &m_Event) ; + } + pTree->SetBranchAddress("Plastic", &m_Event) ; } // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion void Plastic::ReadSensitive(const G4Event* event){ - G4String DetectorNumber; - m_Event->Clear(); - - ////////////////////////////////////////////////////////////////////////////////////// - //////////////////////// Used to Read Event Map of detector ////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - - std::map<G4int, G4int*>::iterator DetectorNumber_itr; - std::map<G4int, G4double*>::iterator Energy_itr; - std::map<G4int, G4double*>::iterator Time_itr; - std::map<G4int, G4double*>::iterator Pos_X_itr; - std::map<G4int, G4double*>::iterator Pos_Y_itr; - std::map<G4int, G4double*>::iterator Pos_Z_itr; - std::map<G4int, G4double*>::iterator Angle_Theta_itr; - - G4THitsMap<G4int>* DetectorNumberHitMap; - G4THitsMap<G4double>* EnergyHitMap; - G4THitsMap<G4double>* TimeHitMap; - G4THitsMap<G4double>* PosXHitMap; - G4THitsMap<G4double>* PosYHitMap; - G4THitsMap<G4double>* PosZHitMap; - G4THitsMap<G4double>* AngleThetaHitMap; - - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - - // Read the Scorer associate to the Silicon Strip - - //Detector Number - G4int StripDetCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/PlasticNumber") ; - DetectorNumberHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripDetCollectionID)) ; - DetectorNumber_itr = DetectorNumberHitMap->GetMap()->begin() ; - - //Energy - G4int StripEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/Energy") ; - EnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripEnergyCollectionID)) ; - Energy_itr = EnergyHitMap->GetMap()->begin() ; - - //Time of Flight - G4int StripTimeCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/Time") ; - TimeHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripTimeCollectionID)) ; - Time_itr = TimeHitMap->GetMap()->begin() ; - - //Interaction Coordinate X - G4int InterCoordXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/InterCoordX"); - PosXHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordXCollectionID)); - Pos_X_itr = PosXHitMap->GetMap()->begin(); - - //Interaction Coordinate Y - G4int InterCoordYCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/InterCoordY"); - PosYHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordYCollectionID)); - Pos_Y_itr = PosYHitMap->GetMap()->begin(); - - //Interaction Coordinate Z - G4int InterCoordZCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/InterCoordZ"); - PosZHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordZCollectionID)); - Pos_Z_itr = PosZHitMap->GetMap()->begin(); - - //Interaction Coordinate Theta - G4int InterCoordThetaCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/InterCoordTheta"); - AngleThetaHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordThetaCollectionID)); - Angle_Theta_itr = AngleThetaHitMap->GetMap()->begin(); - - G4int sizeN = DetectorNumberHitMap->entries() ; - G4int sizeE = EnergyHitMap->entries() ; - G4int sizeT = TimeHitMap->entries() ; - - // Loop on Plastic Number - for (G4int l = 0 ; l < sizeN ; l++) { - G4int N = *(DetectorNumber_itr->second) ; - G4int NTrackID = DetectorNumber_itr->first - N ; - - - if (N > 0) { - m_Event->SetPlasticNumber(N) ; - // Energy - Energy_itr = EnergyHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < sizeE ; h++) { - G4int ETrackID = Energy_itr->first - N ; - G4double E = *(Energy_itr->second) ; - if (ETrackID == NTrackID) { - m_Event->SetEnergy(RandGauss::shoot(E, E*ResoEnergy/100./2.35)) ; - } - Energy_itr++; - } - - - // Time - Time_itr = TimeHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < sizeT ; h++) { - G4int TTrackID = Time_itr->first - N ; - G4double T = *(Time_itr->second) ; - if (TTrackID == NTrackID) { - m_Event->SetTime(RandGauss::shoot(T, ResoTime)) ; - } - Time_itr++; - } - - // Pos X - Pos_X_itr = PosXHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < PosXHitMap->entries() ; h++) { - G4int PosXTrackID = Pos_X_itr->first - N ; - G4double PosX = *(Pos_X_itr->second) ; - if (PosXTrackID == NTrackID) { - ms_InterCoord->SetDetectedPositionX(PosX) ; - } - Pos_X_itr++; - } - - // Pos Y - Pos_Y_itr = PosYHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < PosYHitMap->entries() ; h++) { - G4int PosYTrackID = Pos_Y_itr->first - N ; - G4double PosY = *(Pos_Y_itr->second) ; - if (PosYTrackID == NTrackID) { - ms_InterCoord->SetDetectedPositionY(PosY) ; - } - Pos_Y_itr++; - } - - // Pos Z - Pos_Z_itr = PosZHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < PosZHitMap->entries() ; h++) { - G4int PosZTrackID = Pos_Z_itr->first - N ; - G4double PosZ = *(Pos_Z_itr->second) ; - if (PosZTrackID == NTrackID) { - ms_InterCoord->SetDetectedPositionZ(PosZ) ; - } - Pos_Z_itr++; - } - - // Angle Theta - Angle_Theta_itr = AngleThetaHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < AngleThetaHitMap->entries() ; h++) { - G4int AngleThetaTrackID = Angle_Theta_itr->first - N ; - G4double Theta = *(Angle_Theta_itr->second) ; - if (AngleThetaTrackID == NTrackID) { - ms_InterCoord->SetDetectedAngleTheta(Theta) ; - } - Angle_Theta_itr++; - } - + G4String DetectorNumber; + m_Event->Clear(); + + ////////////////////////////////////////////////////////////////////////////////////// + //////////////////////// Used to Read Event Map of detector ////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + + std::map<G4int, G4int*>::iterator DetectorNumber_itr; + std::map<G4int, G4double*>::iterator Energy_itr; + std::map<G4int, G4double*>::iterator Time_itr; + std::map<G4int, G4double*>::iterator Pos_X_itr; + std::map<G4int, G4double*>::iterator Pos_Y_itr; + std::map<G4int, G4double*>::iterator Pos_Z_itr; + std::map<G4int, G4double*>::iterator Angle_Theta_itr; + + G4THitsMap<G4int>* DetectorNumberHitMap; + G4THitsMap<G4double>* EnergyHitMap; + G4THitsMap<G4double>* TimeHitMap; + G4THitsMap<G4double>* PosXHitMap; + G4THitsMap<G4double>* PosYHitMap; + G4THitsMap<G4double>* PosZHitMap; + G4THitsMap<G4double>* AngleThetaHitMap; + + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + + // Read the Scorer associate to the Silicon Strip + + //Detector Number + G4int StripDetCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/PlasticNumber") ; + DetectorNumberHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripDetCollectionID)) ; + DetectorNumber_itr = DetectorNumberHitMap->GetMap()->begin() ; + + //Energy + G4int StripEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/Energy") ; + EnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripEnergyCollectionID)) ; + Energy_itr = EnergyHitMap->GetMap()->begin() ; + + //Time of Flight + G4int StripTimeCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/Time") ; + TimeHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripTimeCollectionID)) ; + Time_itr = TimeHitMap->GetMap()->begin() ; + + //Interaction Coordinate X + G4int InterCoordXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/InterCoordX"); + PosXHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordXCollectionID)); + Pos_X_itr = PosXHitMap->GetMap()->begin(); + + //Interaction Coordinate Y + G4int InterCoordYCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/InterCoordY"); + PosYHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordYCollectionID)); + Pos_Y_itr = PosYHitMap->GetMap()->begin(); + + //Interaction Coordinate Z + G4int InterCoordZCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/InterCoordZ"); + PosZHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordZCollectionID)); + Pos_Z_itr = PosZHitMap->GetMap()->begin(); + + //Interaction Coordinate Theta + G4int InterCoordThetaCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("PlasticScorer/InterCoordTheta"); + AngleThetaHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordThetaCollectionID)); + Angle_Theta_itr = AngleThetaHitMap->GetMap()->begin(); + + G4int sizeN = DetectorNumberHitMap->entries() ; + G4int sizeE = EnergyHitMap->entries() ; + G4int sizeT = TimeHitMap->entries() ; + + // Loop on Plastic Number + for (G4int l = 0 ; l < sizeN ; l++) { + G4int N = *(DetectorNumber_itr->second) ; + G4int NTrackID = DetectorNumber_itr->first - N ; + + + if (N > 0) { + m_Event->SetPlasticNumber(N) ; + // Energy + Energy_itr = EnergyHitMap->GetMap()->begin(); + for (G4int h = 0 ; h < sizeE ; h++) { + G4int ETrackID = Energy_itr->first - N ; + G4double E = *(Energy_itr->second) ; + if (ETrackID == NTrackID) { + m_Event->SetEnergy(RandGauss::shoot(E, E*ResoEnergy/100./2.35)) ; } - - DetectorNumber_itr++; + Energy_itr++; + } + + + // Time + Time_itr = TimeHitMap->GetMap()->begin(); + for (G4int h = 0 ; h < sizeT ; h++) { + G4int TTrackID = Time_itr->first - N ; + G4double T = *(Time_itr->second) ; + if (TTrackID == NTrackID) { + m_Event->SetTime(RandGauss::shoot(T, ResoTime)) ; + } + Time_itr++; + } + + // Pos X + Pos_X_itr = PosXHitMap->GetMap()->begin(); + for (G4int h = 0 ; h < PosXHitMap->entries() ; h++) { + G4int PosXTrackID = Pos_X_itr->first - N ; + G4double PosX = *(Pos_X_itr->second) ; + if (PosXTrackID == NTrackID) { + ms_InterCoord->SetDetectedPositionX(PosX) ; + } + Pos_X_itr++; + } + + // Pos Y + Pos_Y_itr = PosYHitMap->GetMap()->begin(); + for (G4int h = 0 ; h < PosYHitMap->entries() ; h++) { + G4int PosYTrackID = Pos_Y_itr->first - N ; + G4double PosY = *(Pos_Y_itr->second) ; + if (PosYTrackID == NTrackID) { + ms_InterCoord->SetDetectedPositionY(PosY) ; + } + Pos_Y_itr++; + } + + // Pos Z + Pos_Z_itr = PosZHitMap->GetMap()->begin(); + for (G4int h = 0 ; h < PosZHitMap->entries() ; h++) { + G4int PosZTrackID = Pos_Z_itr->first - N ; + G4double PosZ = *(Pos_Z_itr->second) ; + if (PosZTrackID == NTrackID) { + ms_InterCoord->SetDetectedPositionZ(PosZ) ; + } + Pos_Z_itr++; + } + + // Angle Theta + Angle_Theta_itr = AngleThetaHitMap->GetMap()->begin(); + for (G4int h = 0 ; h < AngleThetaHitMap->entries() ; h++) { + G4int AngleThetaTrackID = Angle_Theta_itr->first - N ; + G4double Theta = *(Angle_Theta_itr->second) ; + if (AngleThetaTrackID == NTrackID) { + ms_InterCoord->SetDetectedAngleTheta(Theta) ; + } + Angle_Theta_itr++; + } + } - - // clear map for next event - TimeHitMap->clear() ; - DetectorNumberHitMap->clear() ; - EnergyHitMap->clear() ; - PosXHitMap->clear() ; - PosYHitMap->clear() ; - PosZHitMap->clear() ; - AngleThetaHitMap->clear(); - + + DetectorNumber_itr++; + } + + // clear map for next event + TimeHitMap->clear() ; + DetectorNumberHitMap->clear() ; + EnergyHitMap->clear() ; + PosXHitMap->clear() ; + PosYHitMap->clear() ; + PosZHitMap->clear() ; + AngleThetaHitMap->clear(); + } //////////////////////////////////////////////////////////////// void Plastic::InitializeScorers() { - bool already_exist = false; - m_PlasticScorer = CheckScorer("PlasticScorer",already_exist) ; - - if(already_exist) return ; - - G4VPrimitiveScorer* DetNbr = new PSDetectorNumber("PlasticNumber","Plastic", 0) ; - G4VPrimitiveScorer* Energy = new PSEnergy("Energy","Plastic", 0) ; - G4VPrimitiveScorer* Time = new PSTOF("Time","Plastic", 0) ; - G4VPrimitiveScorer* InteractionCoordinatesX = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesX("InterCoordX","Plastic", 0); - G4VPrimitiveScorer* InteractionCoordinatesY = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesY("InterCoordY","Plastic", 0); - G4VPrimitiveScorer* InteractionCoordinatesZ = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesZ("InterCoordZ","Plastic", 0); - G4VPrimitiveScorer* InteractionCoordinatesTheta = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesAngleTheta("InterCoordTheta","Plastic", 0); - //and register it to the multifunctionnal detector - m_PlasticScorer->RegisterPrimitive(DetNbr) ; - m_PlasticScorer->RegisterPrimitive(Energy) ; - m_PlasticScorer->RegisterPrimitive(Time) ; - m_PlasticScorer->RegisterPrimitive(InteractionCoordinatesX); - m_PlasticScorer->RegisterPrimitive(InteractionCoordinatesY); - m_PlasticScorer->RegisterPrimitive(InteractionCoordinatesZ); - m_PlasticScorer->RegisterPrimitive(InteractionCoordinatesTheta); - G4SDManager::GetSDMpointer()->AddNewDetector(m_PlasticScorer) ; - + bool already_exist = false; + m_PlasticScorer = CheckScorer("PlasticScorer",already_exist) ; + + if(already_exist) return ; + + G4VPrimitiveScorer* DetNbr = new PSDetectorNumber("PlasticNumber","Plastic", 0) ; + G4VPrimitiveScorer* Energy = new PSEnergy("Energy","Plastic", 0) ; + G4VPrimitiveScorer* Time = new PSTOF("Time","Plastic", 0) ; + G4VPrimitiveScorer* InteractionCoordinatesX = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesX("InterCoordX","Plastic", 0); + G4VPrimitiveScorer* InteractionCoordinatesY = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesY("InterCoordY","Plastic", 0); + G4VPrimitiveScorer* InteractionCoordinatesZ = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesZ("InterCoordZ","Plastic", 0); + G4VPrimitiveScorer* InteractionCoordinatesTheta = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesAngleTheta("InterCoordTheta","Plastic", 0); + //and register it to the multifunctionnal detector + m_PlasticScorer->RegisterPrimitive(DetNbr) ; + m_PlasticScorer->RegisterPrimitive(Energy) ; + m_PlasticScorer->RegisterPrimitive(Time) ; + m_PlasticScorer->RegisterPrimitive(InteractionCoordinatesX); + m_PlasticScorer->RegisterPrimitive(InteractionCoordinatesY); + m_PlasticScorer->RegisterPrimitive(InteractionCoordinatesZ); + m_PlasticScorer->RegisterPrimitive(InteractionCoordinatesTheta); + G4SDManager::GetSDMpointer()->AddNewDetector(m_PlasticScorer) ; + } //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // Construct Method to be pass to the DetectorFactory // //////////////////////////////////////////////////////////////////////////////// NPS::VDetector* Plastic::Construct(){ - return (NPS::VDetector*) new Plastic(); + return (NPS::VDetector*) new Plastic(); } //////////////////////////////////////////////////////////////////////////////// // Registering the construct method to the factory // //////////////////////////////////////////////////////////////////////////////// extern"C" { - class proxy_nps_plastic{ + class proxy_nps_plastic{ public: - proxy_nps_plastic(){ - NPS::DetectorFactory::getInstance()->AddToken("Plastic","Plastic"); - NPS::DetectorFactory::getInstance()->AddDetector("Plastic",Plastic::Construct); - } - }; - - proxy_nps_plastic p_nps_plastic; + proxy_nps_plastic(){ + NPS::DetectorFactory::getInstance()->AddToken("Plastic","Plastic"); + NPS::DetectorFactory::getInstance()->AddDetector("Plastic",Plastic::Construct); + } + }; + + proxy_nps_plastic p_nps_plastic; } diff --git a/NPSimulation/Detectors/Plastic/Plastic.hh b/NPSimulation/Detectors/Plastic/Plastic.hh index 715954b9af366a0b2b1659ca7dd557ca0c09ccde..a654178ffab1ecc6678ebdf9e97c6e87268e5251 100644 --- a/NPSimulation/Detectors/Plastic/Plastic.hh +++ b/NPSimulation/Detectors/Plastic/Plastic.hh @@ -15,7 +15,7 @@ *---------------------------------------------------------------------------* * Decription: * * This class describe a Modular cylindrical Plastic Scintillator * - * Few Material are instantiate and user can choose position and dimension * + * Few Material are instantiate and user can choose position and dimension * * but also the adding of a lead plate on the rear side of the detector * * * *---------------------------------------------------------------------------* @@ -39,9 +39,9 @@ // NPTool header #include "NPSVDetector.hh" #include "TPlasticData.h" - +#include "NPInputParser.h" using namespace std; - using namespace CLHEP; +using namespace CLHEP; class Plastic : public NPS::VDetector { @@ -82,7 +82,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/QQQ/QQQ.cc b/NPSimulation/Detectors/QQQ/QQQ.cc index 2b0926ec833ba93b80b2e91f089a426f2055d48a..4c165adcba11b4a6e0402dab3335e7ef2f236da7 100644 --- a/NPSimulation/Detectors/QQQ/QQQ.cc +++ b/NPSimulation/Detectors/QQQ/QQQ.cc @@ -48,6 +48,7 @@ #include "NPSDetectorFactory.hh" #include "SiliconScorers.hh" #include "RootOutput.h" +#include "NPOptionManager.h" using namespace QQQ_LOCAL; // CLHEP header @@ -261,215 +262,43 @@ void QQQ::VolumeMaker( G4int DetNumber , //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void QQQ::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - G4double TLX , BLX , BRX , TRX , TLY , BLY , BRY , TRY , TLZ , BLZ , BRZ , TRZ; - G4ThreeVector TL , BL , BR , TR ; - G4double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ; - bool check_A = false ; - bool check_B = false ; - bool check_C = false ; - bool check_D = false ; - - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; - bool check_beta = false; - bool ReadingStatus = false; - - while (!ConfigFile.eof()) - { - - getline(ConfigFile, LineBuffer); - - // If line is a Start Up QQQ bloc, Reading toggle to true - if (LineBuffer.compare(0, 3, "QQQ") == 0 && LineBuffer.compare(0, 4, "QQQA") != 0) - { - G4cout << "///" << G4endl ; - G4cout << "Detector found: " << G4endl ; - ReadingStatus = true ; +void QQQ::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("QQQ"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> cart = {"A","B","C","D"}; + vector<string> sphe = {"R","THETA","PHI","BETA"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// QQQ " << i+1 << endl; + G4ThreeVector A = NPS::ConvertVector(blocks[i]->GetTVector3("A","mm")); + G4ThreeVector B = NPS::ConvertVector(blocks[i]->GetTVector3("B","mm")); + G4ThreeVector C = NPS::ConvertVector(blocks[i]->GetTVector3("C","mm")); + G4ThreeVector D = NPS::ConvertVector(blocks[i]->GetTVector3("D","mm")); + AddTelescope(A,B,C,D); } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus) - { - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // Finding another telescope (safety), toggle out - else if (DataBuffer=="QQQ") { - G4cout << "WARNING: Another Telescope is found before standard sequence of Token, Error may occured in detector definition" << G4endl ; - ReadingStatus = false ; - } - - //Position method - else if (DataBuffer.compare(0, 3, "A=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - TLX = atof(DataBuffer.c_str()) ; - TLX = TLX * mm; - ConfigFile >> DataBuffer ; - TLY = atof(DataBuffer.c_str()) ; - TLY = TLY * mm; - ConfigFile >> DataBuffer ; - TLZ = atof(DataBuffer.c_str()) ; - TLZ = TLZ * mm; - - TL = G4ThreeVector(TLX, TLY, TLZ); - G4cout << "Top Left position : (" << TLX << ";" << TLY << ";" << TLZ << ")" << G4endl; - } - - else if (DataBuffer.compare(0, 3, "B=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - BLX = atof(DataBuffer.c_str()) ; - BLX = BLX * mm; - ConfigFile >> DataBuffer ; - BLY = atof(DataBuffer.c_str()) ; - BLY = BLY * mm; - ConfigFile >> DataBuffer ; - BLZ = atof(DataBuffer.c_str()) ; - BLZ = BLZ * mm; - - BL = G4ThreeVector(BLX, BLY, BLZ); - G4cout << "Top Right position : (" << BLX << ";" << BLY << ";" << BLZ << ")" << G4endl; - } - - else if (DataBuffer.compare(0, 3, "C=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - BRX = atof(DataBuffer.c_str()) ; - BRX = BRX * mm; - ConfigFile >> DataBuffer ; - BRY = atof(DataBuffer.c_str()) ; - BRY = BRY * mm; - ConfigFile >> DataBuffer ; - BRZ = atof(DataBuffer.c_str()) ; - BRZ = BRZ * mm; - - BR = G4ThreeVector(BRX, BRY, BRZ); - G4cout << "Bottom Right position : (" << BRX << ";" << BRY << ";" << BRZ << ")" << G4endl; - } - - else if (DataBuffer.compare(0, 3, "D=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - TRX = atof(DataBuffer.c_str()) ; - TRX = TRX * mm; - ConfigFile >> DataBuffer ; - TRY = atof(DataBuffer.c_str()) ; - TRY = TRY * mm; - ConfigFile >> DataBuffer ; - TRZ = atof(DataBuffer.c_str()) ; - TRZ = TRZ * mm; - - TR = G4ThreeVector(TRX, TRY, TRZ); - G4cout << "Center position : (" << TRX << ";" << TRY << ";" << TRZ << ")" << G4endl << G4endl; - } - - - //Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R*mm << G4endl; - } - - - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - check_beta = true; - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else - {ReadingStatus = false; G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl ;} - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) - { - ReadingStatus = false; - - ///Add The previously define telescope - //With position method - if ((check_A && check_B && check_C && check_D) || !(check_Theta && check_Phi && check_R)) { - AddTelescope( TL , - BL , - BR , - TR ); - } - - //with angle method - else if ((check_Theta && check_Phi && check_R) || !(check_A && check_B && check_C && check_D)) { - AddTelescope( R , - Theta , - Phi , - beta_u , - beta_v , - beta_w ); - } - - // Reinitialisation of Check Boolean - - check_A = false ; - check_B = false ; - check_C = false ; - check_D = false ; - - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_beta = false ; - ReadingStatus = false ; - - } - + else if(blocks[i]->HasTokenList(sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// QQQ " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + AddTelescope(R,Theta,Phi,beta[0],beta[1],beta[2]); + } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } - } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method void QQQ::ConstructDetector(G4LogicalVolume* world){ diff --git a/NPSimulation/Detectors/QQQ/QQQ.hh b/NPSimulation/Detectors/QQQ/QQQ.hh index fa18165adfad4c640a9373a8cfdf70eefa2da7fa..0fbc910c547324c959b270014ddc2f7fc82bb805 100644 --- a/NPSimulation/Detectors/QQQ/QQQ.hh +++ b/NPSimulation/Detectors/QQQ/QQQ.hh @@ -37,6 +37,7 @@ // NPLib #include "TQQQData.h" +#include "NPInputParser.h" using namespace std; using namespace CLHEP; @@ -110,7 +111,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/SSSD/SSSD.cc b/NPSimulation/Detectors/SSSD/SSSD.cc index 1245483800c626eb02c5b9ea88344005ef817d2a..6d5471b811ffe229919d85523fbab97f7bab07ad 100644 --- a/NPSimulation/Detectors/SSSD/SSSD.cc +++ b/NPSimulation/Detectors/SSSD/SSSD.cc @@ -47,6 +47,7 @@ #include "NPSDetectorFactory.hh" #include "SiliconScorers.hh" #include "RootOutput.h" +#include "NPOptionManager.h" using namespace SSSD_LOCAL; // CLHEP header @@ -233,214 +234,41 @@ void SSSD::VolumeMaker( G4int DetNumber , //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void SSSD::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - G4double TLX , BLX , BRX , TRX , TLY , BLY , BRY , TRY , TLZ , BLZ , BRZ , TRZ; - G4ThreeVector TL , BL , BR , TR ; - G4double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ; - bool check_A = false ; - bool check_B = false ; - bool check_C = false ; - bool check_D = false ; - - bool check_Theta = false; - bool check_Phi = false; - bool check_R = false; - bool check_beta = false; - bool ReadingStatus = false; - - while (!ConfigFile.eof()) - { - - getline(ConfigFile, LineBuffer); - - // If line is a Start Up SSSD bloc, Reading toggle to true - if (LineBuffer.compare(0, 4, "SSSD") == 0 && LineBuffer.compare(0, 5, "SSSDA") != 0) - { - G4cout << "///" << G4endl ; - G4cout << "Detector found: " << G4endl ; - ReadingStatus = true ; - +void SSSD::ReadConfiguration(NPL::InputParser parser){ +vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("SSSD"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> cart = {"A","B","C","D"}; + vector<string> sphe = {"R","THETA","PHI","BETA"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(cart)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// SSSD " << i+1 << endl; + G4ThreeVector A = NPS::ConvertVector(blocks[i]->GetTVector3("A","mm")); + G4ThreeVector B = NPS::ConvertVector(blocks[i]->GetTVector3("B","mm")); + G4ThreeVector C = NPS::ConvertVector(blocks[i]->GetTVector3("C","mm")); + G4ThreeVector D = NPS::ConvertVector(blocks[i]->GetTVector3("D","mm")); + AddTelescope(A,B,C,D); } - - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus) - { - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // Finding another telescope (safety), toggle out - else if (DataBuffer=="SSSD") { - G4cout << "WARNING: Another Telescope is found before standard sequence of Token, Error may occured in detector definition" << G4endl ; - ReadingStatus = false ; - } - - //Position method - else if (DataBuffer.compare(0, 3, "A=") == 0) { - check_A = true; - ConfigFile >> DataBuffer ; - TLX = atof(DataBuffer.c_str()) ; - TLX = TLX * mm; - ConfigFile >> DataBuffer ; - TLY = atof(DataBuffer.c_str()) ; - TLY = TLY * mm; - ConfigFile >> DataBuffer ; - TLZ = atof(DataBuffer.c_str()) ; - TLZ = TLZ * mm; - - TL = G4ThreeVector(TLX, TLY, TLZ); - G4cout << "Top Left position : (" << TLX << ";" << TLY << ";" << TLZ << ")" << G4endl; - } - - else if (DataBuffer.compare(0, 3, "B=") == 0) { - check_B = true; - ConfigFile >> DataBuffer ; - BLX = atof(DataBuffer.c_str()) ; - BLX = BLX * mm; - ConfigFile >> DataBuffer ; - BLY = atof(DataBuffer.c_str()) ; - BLY = BLY * mm; - ConfigFile >> DataBuffer ; - BLZ = atof(DataBuffer.c_str()) ; - BLZ = BLZ * mm; - - BL = G4ThreeVector(BLX, BLY, BLZ); - G4cout << "Top Right position : (" << BLX << ";" << BLY << ";" << BLZ << ")" << G4endl; - } - - else if (DataBuffer.compare(0, 3, "C=") == 0) { - check_C = true; - ConfigFile >> DataBuffer ; - BRX = atof(DataBuffer.c_str()) ; - BRX = BRX * mm; - ConfigFile >> DataBuffer ; - BRY = atof(DataBuffer.c_str()) ; - BRY = BRY * mm; - ConfigFile >> DataBuffer ; - BRZ = atof(DataBuffer.c_str()) ; - BRZ = BRZ * mm; - - BR = G4ThreeVector(BRX, BRY, BRZ); - G4cout << "Bottom Right position : (" << BRX << ";" << BRY << ";" << BRZ << ")" << G4endl; - } - - else if (DataBuffer.compare(0, 3, "D=") == 0) { - check_D = true; - ConfigFile >> DataBuffer ; - TRX = atof(DataBuffer.c_str()) ; - TRX = TRX * mm; - ConfigFile >> DataBuffer ; - TRY = atof(DataBuffer.c_str()) ; - TRY = TRY * mm; - ConfigFile >> DataBuffer ; - TRZ = atof(DataBuffer.c_str()) ; - TRZ = TRZ * mm; - - TR = G4ThreeVector(TRX, TRY, TRZ); - G4cout << "Center position : (" << TRX << ";" << TRY << ";" << TRZ << ")" << G4endl << G4endl; - } - - - //Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R*mm << G4endl; - } - - - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - check_beta = true; - ConfigFile >> DataBuffer ; - beta_u = atof(DataBuffer.c_str()) ; - beta_u = beta_u * deg ; - ConfigFile >> DataBuffer ; - beta_v = atof(DataBuffer.c_str()) ; - beta_v = beta_v * deg ; - ConfigFile >> DataBuffer ; - beta_w = atof(DataBuffer.c_str()) ; - beta_w = beta_w * deg ; - G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else - {ReadingStatus = false; G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl ;} - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) - { - ReadingStatus = false; - - ///Add The previously define telescope - //With position method - if ((check_A && check_B && check_C && check_D) || !(check_Theta && check_Phi && check_R)) { - AddTelescope( TL , - BL , - BR , - TR ); - } - - //with angle method - else if ((check_Theta && check_Phi && check_R) || !(check_A && check_B && check_C && check_D)) { - AddTelescope( R , - Theta , - Phi , - beta_u , - beta_v , - beta_w ); - } - - // Reinitialisation of Check Boolean - - check_A = false ; - check_B = false ; - check_C = false ; - check_D = false ; - - check_Theta = false ; - check_Phi = false ; - check_R = false ; - check_beta = false ; - ReadingStatus = false ; - - } - + else if(blocks[i]->HasTokenList(sphe)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// SSSD " << i+1 << endl; + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi = blocks[i]->GetDouble("PHI","deg"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + AddTelescope(R,Theta,Phi,beta[0],beta[1],beta[2]); + } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } - } + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/SSSD/SSSD.hh b/NPSimulation/Detectors/SSSD/SSSD.hh index 08ddb06f4ea693e36b3cd123a9361dcd4d9fbba0..772ad2973c5c295078ad55ddc8a54638698e7a06 100644 --- a/NPSimulation/Detectors/SSSD/SSSD.hh +++ b/NPSimulation/Detectors/SSSD/SSSD.hh @@ -37,6 +37,7 @@ // NPLib #include "TSSSDData.h" +#include "NPInputParser.h" using namespace std; using namespace CLHEP; @@ -98,7 +99,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/Sharc/Sharc.cc b/NPSimulation/Detectors/Sharc/Sharc.cc index 31c1fcc8e07f5bc96ea041dc51f6b748ff38cc03..3d5b386033e65790c71403b0588b7926cbd67076 100644 --- a/NPSimulation/Detectors/Sharc/Sharc.cc +++ b/NPSimulation/Detectors/Sharc/Sharc.cc @@ -113,222 +113,44 @@ void Sharc::AddQQQDetector(G4ThreeVector Pos,G4double Thickness){ // Virtual Method of NPS::VDetector class // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Sharc::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - - G4double R,Phi,Thickness,Thickness1,Thickness2,Thickness3,Thickness4,ThicknessPAD1,ThicknessPAD2,ThicknessPAD3,ThicknessPAD4,Z; - R=Phi=Thickness=Thickness1=Thickness2=Thickness3=Thickness4=ThicknessPAD1=ThicknessPAD2=ThicknessPAD3=ThicknessPAD4=Z=0; - - G4ThreeVector Pos; - bool check_R = false ; - bool check_Phi = false ; - bool check_Thickness = false ; - bool check_Thickness1 = false ; - bool check_Thickness2 = false ; - bool check_Thickness3 = false ; - bool check_Thickness4 = false ; - bool check_PAD1 = false ; - bool check_PAD2 = false ; - bool check_PAD3 = false ; - bool check_PAD4 = false ; - bool check_Z = false ; - - bool ReadingStatusQQQ = false ; - bool ReadingStatusBOX = false ; - bool ReadingStatus = false ; - while (!ConfigFile.eof()){ - int VerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); - - getline(ConfigFile, LineBuffer); - // G4cout << LineBuffer << G4endl; - if (LineBuffer.compare(0, 5, "Sharc") == 0) - ReadingStatus = true; - - while (ReadingStatus && !ConfigFile.eof()) { - ConfigFile >> DataBuffer ; - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // CD case - if (DataBuffer=="SharcQQQ"){ - if(VerboseLevel==1) G4cout << "///" << G4endl ; - if(VerboseLevel==1) G4cout << "QQQ Quadrant found: " << G4endl ; - ReadingStatusQQQ = true ; - } - - // Box case - else if (DataBuffer=="SharcBOX"){ - if(VerboseLevel==1) G4cout << "///" << G4endl ; - if(VerboseLevel==1) G4cout << "Box Detector found: " << G4endl ; - ReadingStatusBOX = true ; - } - - // Reading Block - while(ReadingStatusQQQ){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - //Position method - else if (DataBuffer == "Z=") { - check_Z = true; - ConfigFile >> DataBuffer ; - Z= atof(DataBuffer.c_str())*mm; - if(VerboseLevel==1) G4cout << " Z= " << Z/mm << "mm" << G4endl; - } - - else if (DataBuffer == "R=") { - check_R = true; - ConfigFile >> DataBuffer ; - R= atof(DataBuffer.c_str())*mm; - if(VerboseLevel==1) G4cout << " R= " << R/mm << "mm" << G4endl; - } - - else if (DataBuffer == "Phi=") { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi= atof(DataBuffer.c_str())*deg; - if(VerboseLevel==1) G4cout << " Phi= " << Phi/deg << "deg" << G4endl; - } - - else if (DataBuffer == "ThicknessDector=") { - check_Thickness = true; - ConfigFile >> DataBuffer ; - Thickness= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) G4cout << " ThicknessDetector= " << Thickness/um << "um" << G4endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatusQQQ = false; - G4cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - exit(1); - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_R && check_Phi && check_Z && check_Thickness){ - - ReadingStatusQQQ = false; - AddQQQDetector(G4ThreeVector(R,Phi,Z),Thickness); - // Reinitialisation of Check Boolean - check_R = false ; - check_Phi = false ; - check_Thickness = false ; - } - - } - - while(ReadingStatusBOX){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - //Position method - else if (DataBuffer == "Z=") { - check_Z = true; - ConfigFile >> DataBuffer ; - Z= atof(DataBuffer.c_str())*mm; - if(VerboseLevel==1) G4cout << " Z= " << Z/mm << "mm" << G4endl; - } - - else if (DataBuffer == "ThicknessDector1=") { - check_Thickness1 = true; - ConfigFile >> DataBuffer ; - Thickness1= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) G4cout << " ThicknessDetector1= " << Thickness1/um << "um" << G4endl; - } - - else if (DataBuffer == "ThicknessDector2=") { - check_Thickness2 = true; - ConfigFile >> DataBuffer ; - Thickness2= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) G4cout << " ThicknessDetector2= " << Thickness2/um << "um" << G4endl; - } - - else if (DataBuffer == "ThicknessDector3=") { - check_Thickness3 = true; - ConfigFile >> DataBuffer ; - Thickness3= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) G4cout << " ThicknessDetector3= " << Thickness3/um << "um" << G4endl; - } - - else if (DataBuffer == "ThicknessDector4=") { - check_Thickness4 = true; - ConfigFile >> DataBuffer ; - Thickness4= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) G4cout << " ThicknessDetector4= " << Thickness4/um << "um" << G4endl; - } - - else if (DataBuffer == "ThicknessPAD1=") { - check_PAD1 = true; - ConfigFile >> DataBuffer ; - ThicknessPAD1= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) G4cout << " ThicknessPAD1= " << ThicknessPAD1<< "um" << G4endl; - } - - else if (DataBuffer == "ThicknessPAD2=") { - check_PAD2 = true; - ConfigFile >> DataBuffer ; - ThicknessPAD2= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) G4cout << " ThicknessPAD2= " << ThicknessPAD2<< "um" << G4endl; - } - - else if (DataBuffer == "ThicknessPAD3=") { - check_PAD3 = true; - ConfigFile >> DataBuffer ; - ThicknessPAD3= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) G4cout << " ThicknessPAD3= " << ThicknessPAD3<< "um" << G4endl; - } - - else if (DataBuffer == "ThicknessPAD4=") { - check_PAD4 = true; - ConfigFile >> DataBuffer ; - ThicknessPAD4= atof(DataBuffer.c_str())*um; - if(VerboseLevel==1) G4cout << " ThicknessPAD4= " << ThicknessPAD4<< "um" << G4endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatusBOX = false; - G4cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - exit(1); - } +void Sharc::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Sharc"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> tokenQQQ = {"Z","R","Phi","ThicknessDetector"}; + vector<string> tokenBOX = {"Z","ThicknessDetector1","ThicknessDetector2","ThicknessDetector3","ThicknessDetector4","ThicknessPAD1","ThicknessPAD2","ThicknessPAD3","ThicknessPAD4"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + + if(blocks[i]->GetMainValue()=="QQQ" && blocks[i]->HasTokenList(tokenQQQ)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Sharc QQQ " << i+1 << endl; + double Z = blocks[i]->GetDouble("Z","mm"); + double R = blocks[i]->GetDouble("R","mm"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + double Thickness= blocks[i]->GetDouble("ThicknessDetector","micrometer"); + AddQQQDetector(G4ThreeVector(R,Phi,Z),Thickness); + } + else if(blocks[i]->GetMainValue()=="BOX" && blocks[i]->HasTokenList(tokenBOX)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Sharc Box " << i+1 << endl; + double Z = blocks[i]->GetDouble("Z","mm"); + double Thickness1= blocks[i]->GetDouble("ThicknessDetector1","micrometer"); + double Thickness2= blocks[i]->GetDouble("ThicknessDetector2","micrometer"); + double Thickness3= blocks[i]->GetDouble("ThicknessDetector3","micrometer"); + double Thickness4= blocks[i]->GetDouble("ThicknessDetector4","micrometer"); + double ThicknessPAD1 = blocks[i]->GetDouble("ThicknessPAD1","micrometer"); + double ThicknessPAD2 = blocks[i]->GetDouble("ThicknessPAD2","micrometer"); + double ThicknessPAD3 = blocks[i]->GetDouble("ThicknessPAD3","micrometer"); + double ThicknessPAD4 = blocks[i]->GetDouble("ThicknessPAD4","micrometer"); + AddBoxDetector(Z,Thickness1,Thickness2,Thickness3,Thickness4, + ThicknessPAD1,ThicknessPAD2,ThicknessPAD3,ThicknessPAD4); - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_Thickness1 && check_Thickness2 && check_Thickness3 && check_Thickness4 - && check_PAD1 && check_PAD2 && check_PAD3 && check_PAD4 - && check_Z){ - ReadingStatusBOX = false; - AddBoxDetector(Z,Thickness1,Thickness2,Thickness3,Thickness4, - ThicknessPAD1,ThicknessPAD2,ThicknessPAD3,ThicknessPAD4); - // Reinitialisation of Check Boolean - check_R = false ; - check_Phi = false ; - check_Thickness1 = false; - check_Thickness2 = false; - check_Thickness3 = false; - check_Thickness4 = false; - check_PAD1 = false; - check_PAD2 = false; - check_PAD3 = false; - check_PAD4 = false; - check_Z = false ; + } - } - } + else{ + cout << "Warning: check your input file formatting " << endl; } } } diff --git a/NPSimulation/Detectors/Sharc/Sharc.hh b/NPSimulation/Detectors/Sharc/Sharc.hh index 9e2f0d3eae0f9cb001dc85f1d6aaf57dc5974818..3de38133b19f9f16f2476f1c763a4c1fe610b960 100644 --- a/NPSimulation/Detectors/Sharc/Sharc.hh +++ b/NPSimulation/Detectors/Sharc/Sharc.hh @@ -39,6 +39,7 @@ // NPLib #include "TSharcData.h" +#include "NPInputParser.h" using namespace std; using namespace CLHEP; @@ -169,7 +170,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/Spice/Spice.cc b/NPSimulation/Detectors/Spice/Spice.cc index b21b81b19ea872a99a9e89cbae0523c04080a076..86ce150ffc52c32cb3cad22b3b45604c9a3de843 100644 --- a/NPSimulation/Detectors/Spice/Spice.cc +++ b/NPSimulation/Detectors/Spice/Spice.cc @@ -43,7 +43,7 @@ #include "NPSDetectorFactory.hh" #include "SiliconScorers.hh" #include "RootOutput.h" - +#include "NPOptionManager.h" // CLHEP #include "CLHEP/Random/RandGauss.h" @@ -143,8 +143,7 @@ G4LogicalVolume* Spice::ConstructVolume(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Spice::ReadConfiguration(string Path){ - Path =""; +void Spice::ReadConfiguration(NPL::InputParser){ } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/NPSimulation/Detectors/Spice/Spice.hh b/NPSimulation/Detectors/Spice/Spice.hh index 4179a7a612bb8ab1c0ea43412d0db6e2f935e166..a054a7ac28bdfbe37939a73b3f066ac18b019337 100644 --- a/NPSimulation/Detectors/Spice/Spice.hh +++ b/NPSimulation/Detectors/Spice/Spice.hh @@ -29,12 +29,13 @@ using namespace CLHEP; // NPTool header #include "NPSVDetector.hh" - +#include "NPInputParser.h" // Geant4 #include "G4MultiFunctionalDetector.hh" #include "G4LogicalVolume.hh" #include "G4GDMLParser.hh" + class Spice : public NPS::VDetector{ //////////////////////////////////////////////////// /////// Default Constructor and Destructor ///////// @@ -59,7 +60,7 @@ class Spice : public NPS::VDetector{ public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/TRex/TRex.cc b/NPSimulation/Detectors/TRex/TRex.cc index fdcd98196c3c064ab1070374b39f68a1e87f22fc..b2e5152e24a66230fdedf14240978c3bb9646079 100644 --- a/NPSimulation/Detectors/TRex/TRex.cc +++ b/NPSimulation/Detectors/TRex/TRex.cc @@ -43,6 +43,7 @@ #include "RootOutput.h" #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" +#include "NPOptionManager.h" // CLHEP header #include "CLHEP/Random/RandGauss.h" @@ -148,104 +149,31 @@ G4LogicalVolume* TRex::BuildChamber(){ // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void TRex::ReadConfiguration(string Path){ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer; - string DataBuffer; - - double X=0; - double Y=0; - double Z=0; - bool check_X = false ; - bool check_Y = false ; - bool check_Z = false ; - bool ReadingStatus = false ; - - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // If line is a Start Up TRex bloc, Reading toggle to true - string name = "TRex"; - - if (LineBuffer.compare(0, name.length(), name) == 0) { - G4cout << "///" << G4endl ; - G4cout << "TRex found: " << G4endl ; - ReadingStatus = true ; +void TRex::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("TRex"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " Detector found " << endl; + + vector<string> token = {"X","Y","Z"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// TRex " << i+1 << endl; + + + double X = blocks[i]->GetDouble("X","mm"); + double Y = blocks[i]->GetDouble("Y","mm"); + double Z = blocks[i]->GetDouble("Z","mm"); + AddTRex(X,Y,Z); + if(blocks[i]->HasToken("Chamber")) + if(blocks[i]->GetInt("Chamber")) + BuildChamber(); } - // Else don't toggle to Reading Block Status - else ReadingStatus = false ; - - // Reading Block - while(ReadingStatus){ - // Pickup Next Word - ConfigFile >> DataBuffer ; - - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Finding another telescope (safety), toggle out - else if (DataBuffer.compare(0, name.length(),name) == 0) { - G4cout << "WARNING: Another Detector is find before standard sequence of Token, Error may occured in Telecope definition" << G4endl ; - ReadingStatus = false ; - } - - //Position method - else if (DataBuffer.compare(0, 2, "X=") == 0) { - check_X = true; - ConfigFile >> DataBuffer ; - X = atof(DataBuffer.c_str()) ; - X = X * mm; - G4cout << "X: " << X / mm << G4endl; - } - - else if (DataBuffer.compare(0, 2, "Y=") == 0) { - check_Y = true; - ConfigFile >> DataBuffer ; - Y = atof(DataBuffer.c_str()) ; - Y = Y * mm; - G4cout << "Y: " << Y / mm << G4endl; - } - - else if (DataBuffer.compare(0, 2, "Z=") == 0) { - check_Z = true; - ConfigFile >> DataBuffer ; - Z = atof(DataBuffer.c_str()) ; - Z = Z * mm; - G4cout << "Z: " << Z / mm << G4endl; - } - - else if (DataBuffer.compare(0, 8, "Chamber=") == 0) { - ConfigFile >> DataBuffer ; - if(DataBuffer=="1") - BuildChamber(); - G4cout << "Adding TRex Chamber"<< G4endl; - } - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatus = false; - G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_X && check_Y && check_Z){ - // Convert Cartesian to Spherical (detector always face the target) - AddTRex(X,Y,Z); - - // Reinitialisation of Check Boolean - check_X = false ; - check_Y = false ; - check_Z = false ; - ReadingStatus = false ; - G4cout << "///"<< G4endl ; - } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } } diff --git a/NPSimulation/Detectors/TRex/TRex.hh b/NPSimulation/Detectors/TRex/TRex.hh index 4cf8208245a2cf78d7daf28dcdcb1fa84c3f4079..5bf6aa34fe2f62842714aa595235fb86fb399d89 100644 --- a/NPSimulation/Detectors/TRex/TRex.hh +++ b/NPSimulation/Detectors/TRex/TRex.hh @@ -8,7 +8,7 @@ *****************************************************************************/ /***************************************************************************** - * Original Author: Adrien Matta contact address: a.matta@surrey.ac.uk * + * Original Author: Adrien Matta contact address: matta@lpccaen.in2p3.fr * * * * Creation Date : January 2016 * * Last update : * @@ -38,6 +38,7 @@ using namespace std; // NPTool header #include "NPSVDetector.hh" #include "TTRexData.h" +#include "NPInputParser.h" class TRex : public NPS::VDetector{ //////////////////////////////////////////////////// @@ -69,7 +70,7 @@ class TRex : public NPS::VDetector{ public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/Tiara/Tiara.cc b/NPSimulation/Detectors/Tiara/Tiara.cc index 0faa4d262bcf5306b0434df87a7605ff34fb98a8..52d672a6d63ece31a2602c1a26469d5fb7a36d69 100644 --- a/NPSimulation/Detectors/Tiara/Tiara.cc +++ b/NPSimulation/Detectors/Tiara/Tiara.cc @@ -92,92 +92,55 @@ Tiara::~Tiara(){ // Virtual Method of NPS::VDetector class // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Tiara::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - bool ReadingStatus = false ; - - int VerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); - - while (getline(ConfigFile, LineBuffer)){ - - if (LineBuffer.compare(0, 5, "Tiara") == 0) - ReadingStatus = true; - - while (ReadingStatus && ConfigFile >> DataBuffer ) { - // Comment Line - if (DataBuffer.compare(0, 1, "%") == 0) { ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // Tiara Chamber - else if (DataBuffer=="TiaraChamber="){ - if(VerboseLevel==1) G4cout << "Chamber Found " << G4endl ; - ConfigFile >> m_boolChamber; - } - - // Inner Barrel case - else if (DataBuffer=="TiaraInnerBarrel="){ - if(VerboseLevel==1) G4cout << "Inner Barrel found " << G4endl ; - ConfigFile >> m_boolInner; - } - - // Outter Barrel case - else if (DataBuffer=="TiaraOuterBarrel="){ - if(VerboseLevel==1) G4cout << "Outer Barrel found " << G4endl ; - ConfigFile >> m_boolOuter; - } - - // Hyball case - else if (DataBuffer=="TiaraHyballWedge") { - if(VerboseLevel==1) G4cout << "// \n Hyball found: " << G4endl ; - bool ReadingHyball = true; - double Z,R,Phi; - bool boolZ= false; - bool boolR= false; - bool boolPhi= false; - while(ReadingHyball && ConfigFile >> DataBuffer){ - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - else if(DataBuffer == "Z="){ - ConfigFile >> Z ; - boolZ = true; - if(VerboseLevel==1) G4cout << "\t" << DataBuffer << Z << G4endl; - - } - - else if(DataBuffer == "R="){ - ConfigFile >> R ; - boolR = true; - if(VerboseLevel==1) G4cout <<"\t" << DataBuffer << R << G4endl; - } - - else if(DataBuffer == "Phi="){ - ConfigFile >> Phi ; - boolPhi = true; - if(VerboseLevel==1) G4cout <<"\t" << DataBuffer << Phi << G4endl; - } - - else{ - G4cout << "Error: Wrong Token Sequence for Tiara Hyball : Getting out " << DataBuffer << G4endl; - exit(1); - } - - if(boolPhi && boolR && boolZ){ - ReadingHyball = false; - m_HyballZ.push_back(Z*mm); - m_HyballR.push_back(R*mm); - m_HyballPhi.push_back(Phi*deg); - } - } - } +void Tiara::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithTokenAndValue("Tiara","Barrel"); + + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + vector<string> token = {"InnerBarrel","OuterBarrel","Chamber"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Barrel " << i+1 << endl; + m_boolInner = blocks[i]->GetInt("InnerBarrel"); + m_boolOuter = blocks[i]->GetInt("OuterBarrel"); + m_boolChamber = blocks[i]->GetInt("Chamber"); + } + + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); } } - ConfigFile.close(); + blocks.clear(); + blocks = parser.GetAllBlocksWithToken("HyballWedge"); + + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + token.clear(); + token = {"Z","R","Phi"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// Hyball Wedge" << i+1 << endl; + double Z = blocks[i]->GetDouble("Z","mm"); + double R = blocks[i]->GetDouble("R","mm"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + m_HyballZ.push_back(Z); + m_HyballR.push_back(R); + m_HyballPhi.push_back(Phi); + } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -777,8 +740,6 @@ void Tiara::ConstructHyball(G4LogicalVolume* world){ logicAW,"Hyball_ActiveWafer", logicHyball,false,0); - - for(unsigned int i = 0 ; i < m_HyballZ.size() ; i++){ // Place mother volume new G4PVPlacement(new G4RotationMatrix(0,0,m_HyballPhi[i]), diff --git a/NPSimulation/Detectors/Tiara/Tiara.hh b/NPSimulation/Detectors/Tiara/Tiara.hh index f455f64c8ce88e6814b0339ce1e42fb859a90cf4..dd9544f40db9adc0732ea5dc3e4cb708211cc9b2 100644 --- a/NPSimulation/Detectors/Tiara/Tiara.hh +++ b/NPSimulation/Detectors/Tiara/Tiara.hh @@ -40,7 +40,7 @@ // NPLib #include "TTiaraBarrelData.h" #include "TTiaraHyballData.h" - +#include "NPInputParser.h" using namespace std; using namespace CLHEP; @@ -147,7 +147,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/Tigress/Tigress.cc b/NPSimulation/Detectors/Tigress/Tigress.cc index a7db8b7171080ee14ccfd5e2cf540f8925986969..a8be3c9b4393793da939cea3b1cb73776dd076e3 100644 --- a/NPSimulation/Detectors/Tigress/Tigress.cc +++ b/NPSimulation/Detectors/Tigress/Tigress.cc @@ -122,268 +122,46 @@ Tigress::~Tigress(){ // Virtual Method of NPS::VDetector class // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void Tigress::ReadConfiguration(string Path){ - ifstream ConfigFile ; - ConfigFile.open(Path.c_str()) ; - string LineBuffer ; - string DataBuffer ; - istringstream LineStream ; - // Standard Case: - bool check_CloverId = false; - - vector<int> CloverId; - int CloverId_Free = 0; - double R = 0; - double Theta = 0; - double Phi = 0; - double BetaX=0; - double BetaY=0; - double BetaZ=0; - - // Free postion case: - bool check_R = false ; - bool check_Theta = false ; - bool check_Phi = false ; - bool check_Beta = false ; - - // Frame Case - bool check_RightFrame = false ; - bool check_LeftFrame = false ; - - bool ReadingStatusStandard = false ; - bool ReadingStatusFree = false ; - bool ReadingStatusFrame = false ; - bool ReadingStatus = false ; - - while (!ConfigFile.eof()){ - int VerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); - - getline(ConfigFile, LineBuffer); - - if (LineBuffer.compare(0, 7, "Tigress") == 0) - ReadingStatus = true; - - while (ReadingStatus && !ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - // Comment Line - while (LineBuffer.compare(0, 1, "%") == 0) { - // Take the next line - getline(ConfigFile, LineBuffer); - } +void Tigress::ReadConfiguration(NPL::InputParser parser){ - // Standard case - if (LineBuffer.compare(0, 15, "TigressStandard") == 0){ - if(VerboseLevel==1) - G4cout << "/// Clovers in Standard Configuration : ///" << G4endl ; - ReadingStatusStandard = true ; - } + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithTokenAndValue("Tigress","Clover"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << "free clovers found " << endl; - // Free placing case - else if (LineBuffer.compare(0, 13, "TigressClover") == 0){ - if(VerboseLevel==1) - G4cout << "/// Free placed clover : ///" << G4endl ; - ReadingStatusFree = true ; - } + vector<string> token = {"CloverID","R","Theta","Phi","Beta"}; - // Frame case - else if (LineBuffer.compare(0, 12, "TigressFrame") == 0){ - if(VerboseLevel==1) - G4cout << "/// Support Frame : ///" << G4endl ; - ReadingStatusFrame = true ; - } + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + double R = blocks[i]->GetDouble("R","mm"); + double Theta = blocks[i]->GetDouble("Theta","deg"); + double Phi = blocks[i]->GetDouble("Phi","deg"); + int id = blocks[i]->GetInt("CloverID"); + vector<double> beta = blocks[i]->GetVectorDouble("Beta","mm"); - // Reading Block - while(ReadingStatusStandard){ - // Pickup Next Line - getline(ConfigFile, LineBuffer); - // Comment Line - while (LineBuffer.compare(0, 1, "%") == 0) { - // Take the next line - getline(ConfigFile, LineBuffer); - } - - LineStream.clear(); - LineStream.str(LineBuffer); - LineStream >> DataBuffer; - - if ( DataBuffer == "CloverId=" ) { - check_CloverId = true; - - if(VerboseLevel==1) G4cout << "CloverId: " ; - while(LineStream >> DataBuffer){ - CloverId.push_back(atoi(DataBuffer.c_str())); - if(VerboseLevel==1) G4cout << atoi(DataBuffer.c_str()) << " "; - } - if(VerboseLevel==1) G4cout << G4endl << G4endl; - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatusStandard = false; - G4cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - exit(1); - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_CloverId){ - ReadingStatusStandard = false; - AddCloverStandard(CloverId); - CloverId.clear(); - check_CloverId = false ; - } - } + AddCloverFreePosition(id,R,Theta,Phi,beta[0],beta[1],beta[2]); + } - // Reading Block - while(ReadingStatusFree){ - // Pickup Next Line - getline(ConfigFile, LineBuffer); - // Comment Line - while (LineBuffer.compare(0, 1, "%") == 0) { - // Take the next line - getline(ConfigFile, LineBuffer); - } - - LineStream.clear(); - LineStream.str(LineBuffer); - LineStream >> DataBuffer; - - if ( DataBuffer == "CloverId=" ) { - check_CloverId = true; - LineStream >> DataBuffer; - CloverId_Free = atoi(DataBuffer.c_str()); - if(VerboseLevel==1) - G4cout << "CloverId: " << atoi(DataBuffer.c_str()) << " " << G4endl ; - } - - else if ( DataBuffer == "R=" ) { - check_R = true; - LineStream >> DataBuffer; - R = atof(DataBuffer.c_str())*mm; - if(VerboseLevel==1) - G4cout << "R: " << R/mm << " " << G4endl ; - } - - else if ( DataBuffer == "Theta=" ) { - check_Theta = true; - LineStream >> DataBuffer; - Theta = atof(DataBuffer.c_str())*deg; - if(VerboseLevel==1) - G4cout << "Theta: " << Theta/deg << " " << G4endl ; - } - - else if ( DataBuffer == "Phi=" ) { - check_Phi = true; - LineStream >> DataBuffer; - Phi = atof(DataBuffer.c_str())*deg; - if(VerboseLevel==1) - G4cout << "Phi: " << Phi/deg << " " << G4endl ; - } - - else if ( DataBuffer == "Beta=" ) { - check_Beta = true; - LineStream >> DataBuffer; - BetaX = atof(DataBuffer.c_str())*deg; - if(VerboseLevel==1) - G4cout << "BetaX: " << BetaX/deg << " " << G4endl ; - LineStream >> DataBuffer; - BetaY = atof(DataBuffer.c_str())*deg; - if(VerboseLevel==1) - G4cout << "BetaY: " << BetaY/deg << " " << G4endl ; - LineStream >> DataBuffer; - BetaZ = atof(DataBuffer.c_str())*deg; - if(VerboseLevel==1) - G4cout << "BetaZ: " << BetaZ/deg << " " << G4endl ; - } - - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatusStandard = false; - G4cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - exit(1); - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_CloverId && check_R && check_Theta && check_Phi && check_Beta){ - ReadingStatusFree = false; - AddCloverFreePosition(CloverId_Free,R,Theta,Phi,BetaX,BetaY,BetaZ); - check_CloverId = false ; - check_R = false ; - check_Theta = false ; - check_Phi = false ; - check_Beta = false ; - } - } + else{ + cout << "Warning: check your input file formatting " << endl; + } + } - // Reading Block - while(ReadingStatusFrame){ - // Pickup Next Line - getline(ConfigFile, LineBuffer); - // Comment Line - while (LineBuffer.compare(0, 1, "%") == 0) { - // Take the next line - getline(ConfigFile, LineBuffer); - } - - LineStream.clear(); - LineStream.str(LineBuffer); - LineStream >> DataBuffer; - - if ( DataBuffer == "RightFrame=" ) { - check_RightFrame = true; - - LineStream >> DataBuffer; - m_RightFrame=atoi(DataBuffer.c_str()); - - if (VerboseLevel==1) { - if(m_RightFrame) - G4cout << "Right frame: yes" << G4endl; - else - G4cout << "Right frame: no" << G4endl; - } - } - - else if ( DataBuffer == "LeftFrame=" ) { - check_LeftFrame = true; - - LineStream >> DataBuffer; - m_LeftFrame=atoi(DataBuffer.c_str()); - - if (VerboseLevel==1) { - if(m_LeftFrame) - G4cout << "Left frame: yes" << G4endl; - else - G4cout << "Left frame: no" << G4endl; - } - } - - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - else{ - ReadingStatusStandard = false; - G4cout << "Error: Wrong Token Sequence: Getting out " << DataBuffer << G4endl ; - exit(1); - } - - ///////////////////////////////////////////////// - // If All necessary information there, toggle out - - if (check_RightFrame && check_LeftFrame){ - ReadingStatusFrame = false; - AddCloverStandard(CloverId); - CloverId.clear(); - check_RightFrame = false; - check_LeftFrame = false; - } - } + blocks.clear(); + blocks = parser.GetAllBlocksWithTokenAndValue("Tigress","Standard"); + token.clear(); + token = {"CloverID"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// Standard clovers found " << endl; + vector<int> id = blocks[i]->GetVectorInt("CloverID"); + + AddCloverStandard(id); + } + else{ + cout << "Warning: check your input file formatting " << endl; } } } diff --git a/NPSimulation/Detectors/Tigress/Tigress.hh b/NPSimulation/Detectors/Tigress/Tigress.hh index 89469d0134f930b300e1ad11b97298305d91f2e7..824f951a51b82b40a805d96ddc01dd497afac3ce 100644 --- a/NPSimulation/Detectors/Tigress/Tigress.hh +++ b/NPSimulation/Detectors/Tigress/Tigress.hh @@ -39,6 +39,7 @@ // NPLib #include "TTigressData.h" +#include "NPInputParser.h" using namespace std; using namespace CLHEP; @@ -100,7 +101,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path) ; + void ReadConfiguration(NPL::InputParser) ; // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/NPSimulation/Detectors/W1/W1.cc b/NPSimulation/Detectors/W1/W1.cc index 6db21d06c7526bce3585d38ccbb6ac8e53800c2e..51263f29e0a780d2cd1496399d726f14b0801f2c 100644 --- a/NPSimulation/Detectors/W1/W1.cc +++ b/NPSimulation/Detectors/W1/W1.cc @@ -49,6 +49,7 @@ #include "W1Scorers.hh" #include "TW1Data.h" #include "RootOutput.h" +#include "NPOptionManager.h" // CLHEP #include "CLHEP/Random/RandGauss.h" @@ -175,196 +176,47 @@ void W1::VolumeMaker(G4int DetecNumber, // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method -void W1::ReadConfiguration(string Path) -{ - ifstream ConfigFile; - ConfigFile.open(Path.c_str()); - string LineBuffer, DataBuffer; - - // A:X1_Y1 --> X:1 Y:1 - // B:X16_Y1 --> X:16 Y:1 - // C:X1_Y16 --> X:1 Y:16 - // D:X16_Y16 --> X:16 Y:16 - - G4double Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, Az, Bz, Cz, Dz; - G4ThreeVector A, B, C, D; - G4double Theta = 0, Phi = 0, R = 0, beta_u = 0, beta_v = 0, beta_w = 0; - - bool ReadingStatus = false; - - bool check_A = false; - bool check_C = false; - bool check_B = false; - bool check_D = false; - bool check_R = false; - bool check_Theta = false; - bool check_Phi = false; - bool checkVis = false ; - - while (!ConfigFile.eof()) { - getline(ConfigFile, LineBuffer); - - if (LineBuffer.compare(0, 2, "W1") == 0) { - G4cout << "///" << G4endl; - G4cout << "W1 element found: " << G4endl; - ReadingStatus = true; - } - else ReadingStatus = false; - - while (ReadingStatus) { - ConfigFile >> DataBuffer; - - // Search for comment Symbol % - if (DataBuffer.compare(0, 1, "%") == 0) { - ConfigFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' ); - } - - // Position method - else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { - check_A = true; - ConfigFile >> DataBuffer; - Ax = atof(DataBuffer.c_str()); - Ax = Ax * mm; - ConfigFile >> DataBuffer; - Ay = atof(DataBuffer.c_str()); - Ay = Ay * mm; - ConfigFile >> DataBuffer; - Az = atof(DataBuffer.c_str()); - Az = Az * mm; - - A = G4ThreeVector(Ax, Ay, Az); - G4cout << "X1 Y1 corner position : " << A << G4endl; - } - - else if (DataBuffer.compare(0, 7, "X16_Y1=") == 0) { - check_B = true; - ConfigFile >> DataBuffer; - Bx = atof(DataBuffer.c_str()); - Bx = Bx * mm; - ConfigFile >> DataBuffer; - By = atof(DataBuffer.c_str()); - By = By * mm; - ConfigFile >> DataBuffer; - Bz = atof(DataBuffer.c_str()); - Bz = Bz * mm ; - - B = G4ThreeVector(Bx, By, Bz); - G4cout << "X16 Y1 corner position : " << B << G4endl; - } - - else if (DataBuffer.compare(0, 7, "X1_Y16=") == 0) { - check_C = true; - ConfigFile >> DataBuffer; - Cx = atof(DataBuffer.c_str()); - Cx = Cx * mm; - ConfigFile >> DataBuffer; - Cy = atof(DataBuffer.c_str()); - Cy = Cy * mm; - ConfigFile >> DataBuffer; - Cz = atof(DataBuffer.c_str()); - Cz = Cz * mm; - - C = G4ThreeVector(Cx, Cy, Cz); - G4cout << "X1 Y16 corner position : " << C << G4endl; - } - - else if (DataBuffer.compare(0, 8, "X16_Y16=") == 0) { - check_D = true; - ConfigFile >> DataBuffer; - Dx = atof(DataBuffer.c_str()); - Dx = Dx * mm; - ConfigFile >> DataBuffer; - Dy = atof(DataBuffer.c_str()); - Dy = Dy * mm; - ConfigFile >> DataBuffer; - Dz = atof(DataBuffer.c_str()); - Dz = Dz * mm; - - D = G4ThreeVector(Dx, Dy, Dz); - G4cout << "X16 Y16 corner position : " << D << G4endl; - } - - - // Angle method - else if (DataBuffer.compare(0, 6, "THETA=") == 0) { - check_Theta = true; - ConfigFile >> DataBuffer ; - Theta = atof(DataBuffer.c_str()) ; - Theta = Theta * deg; - G4cout << "Theta: " << Theta / deg << G4endl; - } - - else if (DataBuffer.compare(0, 4, "PHI=") == 0) { - check_Phi = true; - ConfigFile >> DataBuffer ; - Phi = atof(DataBuffer.c_str()) ; - Phi = Phi * deg; - G4cout << "Phi: " << Phi / deg << G4endl; - } - - else if (DataBuffer.compare(0, 2, "R=") == 0) { - check_R = true; - ConfigFile >> DataBuffer ; - R = atof(DataBuffer.c_str()) ; - R = R * mm; - G4cout << "R: " << R / mm << G4endl; - } - - else if (DataBuffer.compare(0, 5, "BETA=") == 0) { - ConfigFile >> DataBuffer; - beta_u = atof(DataBuffer.c_str()); - beta_u = beta_u * deg; - ConfigFile >> DataBuffer; - beta_v = atof(DataBuffer.c_str()); - beta_v = beta_v * deg; - ConfigFile >> DataBuffer; - beta_w = atof(DataBuffer.c_str()); - beta_w = beta_w * deg; - G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; - } +void W1::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("W1"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + // Cartesian Case + vector<string> cart = {"X1_Y1","X1_Y16","X16_Y1","X16_Y16","VIS"}; + // Spherical Case + vector<string> sphe= {"R","THETA","PHI","BETA","VIS"}; + + if(blocks[i]->HasTokenList(cart)){ + cout << endl << "//// W1 " << i+1 << endl; + G4ThreeVector A = NPS::ConvertVector(blocks[i]->GetTVector3("X1_Y1","mm")); + G4ThreeVector B = NPS::ConvertVector(blocks[i]->GetTVector3("X16_Y1","mm")); + G4ThreeVector C = NPS::ConvertVector(blocks[i]->GetTVector3("X1_Y16","mm")); + G4ThreeVector D = NPS::ConvertVector(blocks[i]->GetTVector3("X16_Y16","mm")); + if(blocks[i]->GetInt("VIS")) + m_non_sensitive_part_visiualisation = true; + AddDetector(A,B,C,D) ; + } - else if (DataBuffer.compare(0, 4, "VIS=") == 0) { - checkVis = true; - ConfigFile >> DataBuffer; - if (DataBuffer.compare(0, 3, "all") == 0) m_non_sensitive_part_visiualisation = true; - } + else if(blocks[i]->HasTokenList(sphe)){ + cout << endl << "//// W1 " << i+1 << endl; + double Theta = blocks[i]->GetDouble("THETA","deg"); + double Phi= blocks[i]->GetDouble("PHI","deg"); + double R = blocks[i]->GetDouble("R","mm"); + vector<double> beta = blocks[i]->GetVectorDouble("BETA","deg"); + if(blocks[i]->GetInt("VIS")) + m_non_sensitive_part_visiualisation = true; - else { - /////////////////////////////////////////////////// - // If no Detector Token and no comment, toggle out - ReadingStatus = false; - G4cout << "Wrong Token Sequence: Getting out " << DataBuffer << G4endl; - } + AddDetector(Theta,Phi,R,beta[0],beta[1],beta[2]); - // Add The previously define detector - // With position method - if ((check_A && check_B && check_C && check_D && checkVis) && !(check_Theta && check_Phi && check_R)) { - ReadingStatus = false; - check_A = false; - check_C = false; - check_B = false; - check_D = false; - checkVis = false; - - AddDetector(A, B, C, D); - } - - // with angle method - if ((check_Theta && check_Phi && check_R && checkVis) && !(check_A && check_B && check_C && check_D)) { - ReadingStatus = false; - check_R = false; - check_Theta = false; - check_Phi = false; - checkVis = false; + } - AddDetector(R, Theta, Phi, beta_u, beta_v, beta_w); - } - } - } + else{ + cout << "ERROR: Missing token for W1 blocks, check your input file" << endl; + exit(1); + } + } } - - // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method void W1::ConstructDetector(G4LogicalVolume* world) diff --git a/NPSimulation/Detectors/W1/W1.hh b/NPSimulation/Detectors/W1/W1.hh index 4229c7feaf2ca87703586048103a24aad572f44a..7ffbc4cf09654f25f2719720a6d089650c3f8fca 100644 --- a/NPSimulation/Detectors/W1/W1.hh +++ b/NPSimulation/Detectors/W1/W1.hh @@ -34,9 +34,9 @@ // NPTool - ROOT headers #include "TW1Data.h" - +#include "NPInputParser.h" using namespace std; - using namespace CLHEP; +using namespace CLHEP; @@ -75,7 +75,7 @@ public: public: // Read stream at Configfile to pick-up parameters of detector (Position,...) // Called in DetecorConstruction::ReadDetextorConfiguration Method - void ReadConfiguration(string Path); + void ReadConfiguration(NPL::InputParser); // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method diff --git a/Inputs/DetectorConfiguration/gaspardParis.detector b/Projects/Gaspard/DetectorConfiguration/gaspardParis.detector similarity index 67% rename from Inputs/DetectorConfiguration/gaspardParis.detector rename to Projects/Gaspard/DetectorConfiguration/gaspardParis.detector index fe52e1f969c7e4877a1a1b1b51b0b722d4691cc1..0283bef51e7f0ec0b7835fe72807f74f278a16b0 100644 --- a/Inputs/DetectorConfiguration/gaspardParis.detector +++ b/Projects/Gaspard/DetectorConfiguration/gaspardParis.detector @@ -9,14 +9,14 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2l - NBLAYERS= 50 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 10.3 + ANGLE= 0 + RADIUS= 12 + MATERIAL= CD2l + NBLAYERS= 50 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% %%Position and R given in mm %%Angle given in degree @@ -27,224 +27,224 @@ Target Paris %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 ParisCluster - X1_Y1= -63.142 -111.96 235.7938 - X1_Y128= 5.6268 -230.775 137.2298 - X128_Y1= -201.3545 -111.28 138.5418 - X128_Y128= -132.58 -230.095 39.9778 - VIS= all + X1_Y1= -63.142 -111.96 235.7938 + X1_Y128= 5.6268 -230.775 137.2298 + X128_Y1= -201.3545 -111.28 138.5418 + X128_Y128= -132.58 -230.095 39.9778 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 ParisCluster - X1_Y1= -218.111 -103.574 117.561 - X1_Y128= -149.342 -222.389 18.997 - X128_Y1= -267.215 -18.112 -19.72 - X128_Y128= -198.446 -136.927 -118.284 - VIS= all + X1_Y1= -218.111 -103.574 117.561 + X1_Y128= -149.342 -222.389 18.997 + X128_Y1= -267.215 -18.112 -19.72 + X128_Y128= -198.446 -136.927 -118.284 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 ParisCluster - X1_Y1= -265.456 0.2844 -40.6687 - X1_Y128= -196.6865 -118.53 -139.233 - X128_Y1= -196.6865 120.4659 -137.5614 - X128_Y128= -127.9173 1.6512 -236.1254 - VIS= all + X1_Y1= -265.456 0.2844 -40.6687 + X1_Y128= -196.6865 -118.53 -139.233 + X128_Y1= -196.6865 120.4659 -137.5614 + X128_Y128= -127.9173 1.6512 -236.1254 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 ParisCluster - X1_Y1= -177.4417 138.7763 -146.2065 - X1_Y128= -108.6725 19.9616 -244.7704 - X128_Y1= -31.0838 233.2766 -145.9525 - X128_Y128= 37.6854 104.4618 -244.5164 - VIS= all + X1_Y1= -177.4417 138.7763 -146.2065 + X1_Y128= -108.6725 19.9616 -244.7704 + X128_Y1= -31.0838 233.2766 -145.9525 + X128_Y128= 37.6854 104.4618 -244.5164 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 ParisCluster - X1_Y1= -5.6268 230.7749 -137.2298 - X1_Y128= 63.1424 111.9602 -235.7938 - X128_Y1= 132.5853 230.0949 -39.9678 - X128_Y128= 201.3545 111.2801 -138.5418 - VIS= all + X1_Y1= -5.6268 230.7749 -137.2298 + X1_Y128= 63.1424 111.9602 -235.7938 + X128_Y1= 132.5853 230.0949 -39.9678 + X128_Y128= 201.3545 111.2801 -138.5418 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 ParisCluster - X1_Y1= 149.3422 222.3888 -18.9970 - X1_Y128= 218.1114 103.5741 -117.5610 - X128_Y1= 198.4457 136.9268 118.2839 - X128_Y128= 267.2149 18.1120 19.7200 - VIS= all + X1_Y1= 149.3422 222.3888 -18.9970 + X1_Y128= 218.1114 103.5741 -117.5610 + X128_Y1= 198.4457 136.9268 118.2839 + X128_Y128= 267.2149 18.1120 19.7200 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 ParisCluster - X1_Y1= 196.6865 118.5303 139.2326 - X1_Y128= 265.4567 -0.2839 40.6887 - X128_Y1= 127.9173 -1.6512 236.1254 - X128_Y128= 196.6865 -120.463 137.5614 - VIS= all + X1_Y1= 196.6865 118.5303 139.2326 + X1_Y128= 265.4567 -0.2839 40.6887 + X128_Y1= 127.9173 -1.6512 236.1254 + X128_Y128= 196.6865 -120.463 137.5614 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 ParisCluster - X1_Y1= 108.6725 -19.9616 244.7705 - X1_Y128= 177.4417 -138.776 146.2065 - X128_Y1= -37.6854 -104.462 244.6154 - X128_Y128= 31.0838 -223.277 145.9525 - VIS= all + X1_Y1= 108.6725 -19.9616 244.7705 + X1_Y128= 177.4417 -138.776 146.2065 + X128_Y1= -37.6854 -104.462 244.6154 + X128_Y128= 31.0838 -223.277 145.9525 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 ParisCluster - X1_Y1= 63.1424 -108.652 -237.3365 - X1_Y128= -5.6268 -228.833 -140.4337 - X128_Y1= 201.3545 -109.332 -140.0845 - X128_Y128= 132.5853 -229.513 -43.1918 - VIS= all + X1_Y1= 63.1424 -108.652 -237.3365 + X1_Y128= -5.6268 -228.833 -140.4337 + X128_Y1= 201.3545 -109.332 -140.0845 + X128_Y128= 132.5853 -229.513 -43.1918 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 ParisCluster - X1_Y1= 218.1114 -101.92 -118.7980 - X1_Y128= 149.3422 -222.101 -22.10526 - X128_Y1= 267.2149 -18.386 19.4647 - X128_Y128= 198.4457 -138.568 116.3575 - VIS= all + X1_Y1= 218.1114 -101.92 -118.7980 + X1_Y128= 149.3422 -222.101 -22.10526 + X128_Y1= 267.2149 -18.386 19.4647 + X128_Y128= 198.4457 -138.568 116.3575 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 ParisCluster - X1_Y1= 177.4417 136.718 148.1329 - X1_Y128= 108.6725 16.5365 245.0257 - X128_Y1= 31.08380 221.2136 149.0607 - X128_Y128= -37.6854 101.0321 245.9534 - VIS= all + X1_Y1= 177.4417 136.718 148.1329 + X1_Y128= 108.6725 16.5365 245.0257 + X128_Y1= 31.08380 221.2136 149.0607 + X128_Y128= -37.6854 101.0321 245.9534 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 ParisCluster - X1_Y1= 5.6268 228.8332 140.4337 - X1_Y128= -63.1424 108.6517 237.3365 - X128_Y1= -132.5853 229.5133 43.1918 - X128_Y128= -201.3545 109.3318 140.0845 - VIS= all + X1_Y1= 5.6268 228.8332 140.4337 + X1_Y128= -63.1424 108.6517 237.3365 + X128_Y1= -132.5853 229.5133 43.1918 + X128_Y128= -201.3545 109.3318 140.0845 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 ParisCluster - X1_Y1= -149.3422 222.1014 22.1053 - X1_Y128= -218.1114 101.9199 118.9980 - X128_Y1= -198.4457 138.5676 -116.3575 - X128_Y128= -267.21494 18.38604 -19.4647 - VIS= all + X1_Y1= -149.3422 222.1014 22.1053 + X1_Y128= -218.1114 101.9199 118.9980 + X128_Y1= -198.4457 138.5676 -116.3575 + X128_Y128= -267.21494 18.38604 -19.4647 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 ParisCluster - X1_Y1= -108.6725 -16.5365 -245.025 - X1_Y128= -177.44171 -136.718 -148.1329 - X128_Y1= 37.6854 -101.032 -245.9534 - X128_Y128= -31.0838 -221.214 -149.0607 - VIS= all + X1_Y1= -108.6725 -16.5365 -245.025 + X1_Y128= -177.44171 -136.718 -148.1329 + X128_Y1= 37.6854 -101.032 -245.9534 + X128_Y128= -31.0838 -221.214 -149.0607 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 ParisCluster - X1_Y1= 207.506468 -83.4626 -148.646587 - X1_Y128= 207.506468 85.53326 -147.464835 - X128_Y1= 69.2943359 -82.7826 -245.898545 - X128_Y128= 69.2943359 86.21332 -244.716793 - VIS= all + X1_Y1= 207.506468 -83.4626 -148.646587 + X1_Y128= 207.506468 85.53326 -147.464835 + X128_Y1= 69.2943359 -82.7826 -245.898545 + X128_Y128= 69.2943359 86.21332 -244.716793 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 ParisCluster - X1_Y1= 117.733235 240.6373 -18.7966735 - X1_Y128= 20.4788977 239.6709 119.4120787 - X128_Y1= -20.478898 241.3174 -116.048635 - X128_Y128= -117.73323 240.3509 22.16012052 - VIS= all + X1_Y1= 117.733235 240.6373 -18.7966735 + X1_Y128= 20.4788977 239.6709 119.4120787 + X128_Y1= -20.478898 241.3174 -116.048635 + X128_Y128= -117.73323 240.3509 22.16012052 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 ParisCluster - X1_Y1= -69.294336 82.78255 245.8985453 - X1_Y128= -69.294336 -86.2133 244.7167929 - X128_Y1= -207.50647 83.46261 148.6465871 - X128_Y128= -207.50647 -85.5333 147.4648347 - VIS= all + X1_Y1= -69.294336 82.78255 245.8985453 + X1_Y128= -69.294336 -86.2133 244.7167929 + X128_Y1= -207.50647 83.46261 148.6465871 + X128_Y128= -207.50647 -85.5333 147.4648347 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18 ParisCluster - X1_Y1= 20.4788977 -241.317 116.0486339 - X1_Y128= 117.733235 -240.351 -22.1601217 - X128_Y1= -117.73323 -240.637 18.79667235 - X128_Y128= -20.478898 -239.671 -119.41208 - VIS= all + X1_Y1= 20.4788977 -241.317 116.0486339 + X1_Y128= 117.733235 -240.351 -22.1601217 + X128_Y1= -117.73323 -240.637 18.79667235 + X128_Y128= -20.478898 -239.671 -119.41208 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% GaspardTracker %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 Central Barrel GPDDummyShape - THETA= 90 - PHI= 90 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 90 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 GPDDummyShape - THETA= 90 - PHI= 120 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 120 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 GPDDummyShape - THETA= 90 - PHI= 150 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 150 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 GPDDummyShape - THETA= 90 - PHI= 180 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 180 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 GPDDummyShape - THETA= 90 - PHI= 210 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 210 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 GPDDummyShape - THETA= 90 - PHI= 240 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 240 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 GPDDummyShape - THETA= 90 - PHI= 270 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 270 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 GPDDummyShape - THETA= 90 - PHI= 300 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 300 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 GPDDummyShape - THETA= 90 - PHI= 330 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 330 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 GPDDummyShape THETA= 90 diff --git a/Projects/Gaspard/DetectorConfiguration/gaspardParisAll.detector b/Projects/Gaspard/DetectorConfiguration/gaspardParisAll.detector new file mode 100644 index 0000000000000000000000000000000000000000..cdac08e92768e1932677a9b4061be9d938733008 --- /dev/null +++ b/Projects/Gaspard/DetectorConfiguration/gaspardParisAll.detector @@ -0,0 +1,731 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 10.3 micrometer + ANGLE= 0 deg + RADIUS= 12 mm + MATERIAL= CD2 + NBLAYERS= 50 + X= 0 mm + Y= 0 mm + Z= 0 mm + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GeneralChamber +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Chamber + Rmin= 200 + Rmax= 202 + PhiMin= 0. + PhiMax= 6.14318 + ThetaMin= 0. + ThetaMax= 3.14159 + MATERIAL= Alu + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and R given in mm +%%Angle given in degree +%%Option: 0,1 for Si SiLi and CsI +%%Option: all or sensible for VISualisation + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +Paris Cluster + A= -84.5 -235 84.5 + C= 84.5 -235 84.5 + B= -84.5 -235 -84.5 + D= 84.5 -235 -84.5 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Paris Cluster + A= -225.920617 -106.419571 84.5 + C= -106.419571 -225.920617 84.5 + B= -225.920617 -106.419571 -84.5 + D= -106.419571 -225.920617 -84.5 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Paris Cluster + A= -235 84.5 84.5 + C= -235 -84.5 84.5 + B= -235 84.5 -84.5 + D= -235 -84.5 -84.5 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +Paris Cluster + A= -106.419571 225.920617 84.5 + C= -225.920617 106.419571 84.5 + B= -106.419571 225.920617 -84.5 + D= -225.920617 106.419571 -84.5 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Paris Cluster + A= 84.5 235 84.5 + C= -84.5 235 84.5 + B= 84.5 235 -84.5 + D= -84.5 235 -84.5 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Paris Cluster + A= 225.920617 106.419571 84.5 + C= 106.419571 225.920617 84.5 + B= 225.920617 106.419571 -84.5 + D= 106.419571 225.920617 -84.5 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Paris Cluster + A= 235 -84.5 84.5 + C= 235 84.5 84.5 + B= 235 -84.5 -84.5 + D= 235 84.5 -84.5 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Paris Cluster + A= 106.419571 -225.920617 84.5 + C= 225.920617 -106.419571 84.5 + B= 106.419571 -225.920617 -84.5 + D= 225.920617 -106.419571 -84.5 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Paris Cluster + A= 84.5 84.5 -235 + C= -84.5 84.5 -235 + B= 84.5 -84.5 -235 + D= -84.5 -84.5 -235 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Paris Cluster + A= 225.920617 84.5 -106.419571 + C= 106.419571 84.5 -225.920617 + B= 225.920617 -84.5 -106.419571 + D= 106.419571 -84.5 -225.920617 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Paris Cluster + A= 106.419571 84.5 225.920617 + C= 225.920617 84.5 106.419571 + B= 106.419571 -84.5 225.920617 + D= 225.920617 -84.5 106.419571 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Paris Cluster + A= -84.5 84.5 235 + C= 84.5 84.5 235 + B= -84.5 -84.5 235 + D= 84.5 -84.5 235 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Paris Cluster + A= -225.920617 84.5 106.419571 + C= -106.419571 84.5 225.920617 + B= -225.920617 -84.5 106.419571 + D= -106.419571 -84.5 225.920617 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Paris Cluster + A= -106.419571 84.5 -225.920617 + C= -225.920617 84.5 -106.419571 + B= -106.419571 -84.5 -225.920617 + D= -225.920617 -84.5 -106.419571 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Paris Cluster + A= -84.5 106.419571 -225.920617 + C= 84.5 106.419571 -225.920617 + B= -84.5 225.920617 -106.419571 + D= 84.5 225.920617 -106.419571 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Paris Cluster + A= -84.5 225.920617 106.419571 + C= 84.5 225.920617 106.419571 + B= -84.5 106.419571 225.920617 + D= 84.5 106.419571 225.920617 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Paris Cluster + A= -84.5 -106.419571 225.920617 + C= 84.5 -106.419571 225.920617 + B= -84.5 -225.920617 106.419571 + D= 84.5 -225.920617 106.419571 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Paris Cluster + A= -84.5 -225.920617 -106.419571 + C= 84.5 -225.920617 -106.419571 + B= -84.5 -106.419571 -225.920617 + D= 84.5 -106.419571 -225.920617 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= -175.9824 135.677313 -95.372227 + C= -199.252552 89.137008 -118.642379 + B= -135.677313 135.677313 -135.677313 + D= -158.947466 89.137008 -158.947466 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= -135.677313 135.677313 -135.677313 + C= -158.947466 89.137008 -158.947466 + B= -95.372227 135.677313 -175.9824 + D= -118.642379 89.137008 -199.252552 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= -132.559704 182.217618 -92.254617 + C= -155.829857 135.677313 -115.52477 + B= -92.254617 182.217618 -132.559704 + D= -115.52477 135.677313 -155.829857 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= -95.372227 135.677313 175.9824 + C= -118.642379 89.137008 199.252552 + B= -135.677313 135.677313 135.677313 + D= -158.947466 89.137008 158.947466 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= -135.677313 135.677313 135.677313 + C= -158.947466 89.137008 158.947466 + B= -175.9824 135.677313 95.372227 + D= -199.252552 89.137008 118.642379 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= -92.254617 182.217618 132.559704 + C= -115.52477 135.677313 155.829857 + B= -132.559704 182.217618 92.254617 + D= -155.829857 135.677313 115.52477 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= 175.9824 135.677313 95.372227 + C= 199.252552 89.137008 118.642379 + B= 135.677313 135.677313 135.677313 + D= 158.947466 89.137008 158.947466 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= 135.677313 135.677313 135.677313 + C= 158.947466 89.137008 158.947466 + B= 95.372227 135.677313 175.9824 + D= 118.642379 89.137008 199.252552 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= 132.559704 182.217618 92.254617 + C= 155.829857 135.677313 115.52477 + B= 92.254617 182.217618 132.559704 + D= 115.52477 135.677313 155.829857 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= 95.372227 135.677313 -175.9824 + C= 118.642379 89.137008 -199.252552 + B= 135.677313 135.677313 -135.677313 + D= 158.947466 89.137008 -158.947466 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= 135.677313 135.677313 -135.677313 + C= 158.947466 89.137008 -158.947466 + B= 175.9824 135.677313 -95.372227 + D= 199.252552 89.137008 -118.642379 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= 92.254617 182.217618 -132.559704 + C= 115.52477 135.677313 -155.829857 + B= 132.559704 182.217618 -92.254617 + D= 155.829857 135.677313 -115.52477 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= -95.372227 -135.677313 -175.9824 + C= -118.642379 -89.137008 -199.252552 + B= -135.677313 -135.677313 -135.677313 + D= -158.947466 -89.137008 -158.947466 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= -135.677313 -135.677313 -135.677313 + C= -158.947466 -89.137008 -158.947466 + B= -175.9824 -135.677313 -95.372227 + D= -199.252552 -89.137008 -118.642379 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= -92.254617 -182.217618 -132.559704 + C= -115.52477 -135.677313 -155.829857 + B= -132.559704 -182.217618 -92.254617 + D= -155.829857 -135.677313 -115.52477 + + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Paris Phoswich +% A= 175.9824 -135.677313 -95.372227 +% C= 199.252552 -89.137008 -118.642379 +% B= 135.677313 -135.677313 -135.677313 +% D= 158.947466 -89.137008 -158.947466 +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Paris Phoswich +% A= 135.677313 -135.677313 -135.677313 +% C= 158.947466 -89.137008 -158.947466 +% B= 95.372227 -135.677313 -175.9824 +% D= 118.642379 -89.137008 -199.252552 +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Paris Phoswich +% A= 132.559704 -182.217618 -92.254617 +% C= 155.829857 -135.677313 -115.52477 +% B= 92.254617 -182.217618 -132.559704 +% D= 115.52477 -135.677313 -155.829857 +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= 95.372227 -135.677313 175.9824 + C= 118.642379 -89.137008 199.252552 + B= 135.677313 -135.677313 135.677313 + D= 158.947466 -89.137008 158.947466 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= 135.677313 -135.677313 135.677313 + C= 158.947466 -89.137008 158.947466 + B= 175.9824 -135.677313 95.372227 + D= 199.252552 -89.137008 118.642379 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris Phoswich + A= 92.254617 -182.217618 132.559704 + C= 115.52477 -135.677313 155.829857 + B= 132.559704 -182.217618 92.254617 + D= 155.829857 -135.677313 115.52477 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Paris Phoswich +% A= -175.9824 -135.677313 95.372227 +% C= -199.252552 -89.137008 118.642379 +% B= -135.677313 -135.677313 135.677313 +% D= -158.947466 -89.137008 158.947466 +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Paris Phoswich +% A= -135.677313 -135.677313 135.677313 +% C= -158.947466 -89.137008 158.947466 +% B= -95.372227 -135.677313 175.9824 +% D= -118.642379 -89.137008 199.252552 +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Paris Phoswich +% A= -132.559704 -182.217618 92.254617 +% C= -155.829857 -135.677313 115.52477 +% B= -92.254617 -182.217618 132.559704 +% D= -115.52477 -135.677313 155.829857 +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GaspardTracker +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 Central Barrel +GaspardTracker DummyShape + THETA= 90 + PHI= 90 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GaspardTracker DummyShape + THETA= 90 + PHI= 120 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GaspardTracker DummyShape + THETA= 90 + PHI= 150 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +GaspardTracker DummyShape + THETA= 90 + PHI= 180 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +GaspardTracker DummyShape + THETA= 90 + PHI= 210 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +GaspardTracker DummyShape + THETA= 90 + PHI= 240 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +GaspardTracker DummyShape + THETA= 90 + PHI= 270 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +GaspardTracker DummyShape + THETA= 90 + PHI= 300 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 +GaspardTracker DummyShape + THETA= 90 + PHI= 330 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 +GaspardTracker DummyShape + THETA= 90 + PHI= 360 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 +GaspardTracker DummyShape + THETA= 90 + PHI= 30 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 +GaspardTracker DummyShape + THETA= 90 + PHI= 60 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 First Cone (forward) +GaspardTracker DummyShape + THETA= 60 + PHI= 90 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 +GaspardTracker DummyShape + THETA= 60 + PHI= 130 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 +GaspardTracker DummyShape + THETA= 60 + PHI= 170 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 +GaspardTracker DummyShape + THETA= 60 + PHI= 210 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 +GaspardTracker DummyShape + THETA= 60 + PHI= 250 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 +GaspardTracker DummyShape + THETA= 60 + PHI= 290 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18 +GaspardTracker DummyShape + THETA= 60 + PHI= 330 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%19 +GaspardTracker DummyShape + THETA= 60 + PHI= 10 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%20 +GaspardTracker DummyShape + THETA= 60 + PHI= 50 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%21 Second Cone (forward) +GaspardTracker DummyShape + THETA= 30 + PHI= 90 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22 +GaspardTracker DummyShape + THETA= 30 + PHI= 180 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%23 +GaspardTracker DummyShape + THETA= 30 + PHI= 270 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24 +GaspardTracker DummyShape + THETA= 30 + PHI= 360 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%25 First Cone (backward) +GaspardTracker DummyShape + THETA= 120 + PHI= 90 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%26 +GaspardTracker DummyShape + THETA= 120 + PHI= 130 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%27 +GaspardTracker DummyShape + THETA= 120 + PHI= 170 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%28 +GaspardTracker DummyShape + THETA= 120 + PHI= 210 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%29 +GaspardTracker DummyShape + THETA= 120 + PHI= 250 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%30 +GaspardTracker DummyShape + THETA= 120 + PHI= 290 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%31 +GaspardTracker DummyShape + THETA= 120 + PHI= 330 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%32 +GaspardTracker DummyShape + THETA= 120 + PHI= 10 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%33 +GaspardTracker DummyShape + THETA= 120 + PHI= 50 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%34 Second Cone (backward) +GaspardTracker DummyShape + THETA= 150 + PHI= 90 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%35 +GaspardTracker DummyShape + THETA= 150 + PHI= 180 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%36 +GaspardTracker DummyShape + THETA= 150 + PHI= 270 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%37 +GaspardTracker DummyShape + THETA= 150 + PHI= 360 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%38 End Cap (forward) +GaspardTracker DummyShape + THETA= 0 + PHI= 0 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%39 End Cap (backward) +GaspardTracker DummyShape + THETA= 180 + PHI= 0 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all + diff --git a/Inputs/DetectorConfiguration/gaspardTestSpheric.detector b/Projects/Gaspard/DetectorConfiguration/gaspardTestSpheric.detector similarity index 86% rename from Inputs/DetectorConfiguration/gaspardTestSpheric.detector rename to Projects/Gaspard/DetectorConfiguration/gaspardTestSpheric.detector index f1270bae0eef9b53dc134ea85f380dc1730201d8..31acb79fd64b2b760e3830b3b8ec9b6537b45e08 100644 --- a/Inputs/DetectorConfiguration/gaspardTestSpheric.detector +++ b/Projects/Gaspard/DetectorConfiguration/gaspardTestSpheric.detector @@ -8,14 +8,14 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 10.0 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2 - NBLAYERS= 50 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 10.0 + ANGLE= 0 + RADIUS= 12 + MATERIAL= CD2 + NBLAYERS= 50 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% @@ -28,112 +28,112 @@ Target GaspardTracker %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 Central Barrel %GPDAnnular - Z= 200 - RMIN= 16 - RMAX= 52 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + Z= 200 + RMIN= 16 + RMAX= 52 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %GPDTrapezoid - THETA= 90 - PHI= 90 - R= 300 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 90 + R= 300 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 Central Barrel GPDDummyShape - THETA= 90 - PHI= 90 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 90 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 GPDDummyShape - THETA= 90 - PHI= 120 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 120 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 GPDDummyShape - THETA= 90 - PHI= 150 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 150 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 GPDDummyShape - THETA= 90 - PHI= 180 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 180 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 GPDDummyShape - THETA= 90 - PHI= 210 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 210 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 GPDDummyShape - THETA= 90 - PHI= 240 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 240 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 GPDDummyShape - THETA= 90 - PHI= 270 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 270 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 GPDDummyShape - THETA= 90 - PHI= 300 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 300 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 GPDDummyShape - THETA= 90 - PHI= 330 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 330 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 GPDDummyShape THETA= 90 diff --git a/Inputs/DetectorConfiguration/gaspardTestSphericParis.detector b/Projects/Gaspard/DetectorConfiguration/gaspardTestSphericParis.detector similarity index 88% rename from Inputs/DetectorConfiguration/gaspardTestSphericParis.detector rename to Projects/Gaspard/DetectorConfiguration/gaspardTestSphericParis.detector index 08289fedb698e89601625ae7b5ae2ac4e836169f..2a0102fd20ba5f159cfc2734a67c7ebaaa8c4ecb 100644 --- a/Inputs/DetectorConfiguration/gaspardTestSphericParis.detector +++ b/Projects/Gaspard/DetectorConfiguration/gaspardTestSphericParis.detector @@ -9,14 +9,14 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2 - NBLAYERS= 50 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 10.3 + ANGLE= 0 + RADIUS= 12 + MATERIAL= CD2 + NBLAYERS= 50 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% %%Position and R given in mm %%Angle given in degree @@ -27,104 +27,104 @@ Target Paris %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ParisPhoswitch - THETA= 0 - PHI= 0 - R= 230 - BETA= 0 0 0 - VIS= all + THETA= 0 + PHI= 0 + R= 230 + BETA= 0 0 0 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% GaspardTracker %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 Central Barrel GPDDummyShape - THETA= 90 - PHI= 90 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 90 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 GPDDummyShape - THETA= 90 - PHI= 120 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 120 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 GPDDummyShape - THETA= 90 - PHI= 150 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 150 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 GPDDummyShape - THETA= 90 - PHI= 180 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 180 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 GPDDummyShape - THETA= 90 - PHI= 210 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 210 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 GPDDummyShape - THETA= 90 - PHI= 240 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 240 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 GPDDummyShape - THETA= 90 - PHI= 270 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 270 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 GPDDummyShape - THETA= 90 - PHI= 300 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 300 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 GPDDummyShape - THETA= 90 - PHI= 330 - R= 100 - BETA= 0 0 0 - FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 - VIS= all + THETA= 90 + PHI= 330 + R= 100 + BETA= 0 0 0 + FIRSTSTAGE= 1 + SECONDSTAGE= 1 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 GPDDummyShape THETA= 90 diff --git a/Projects/Gaspard/DetectorConfiguration/gaspardV1Barrel.detector b/Projects/Gaspard/DetectorConfiguration/gaspardV1Barrel.detector new file mode 100644 index 0000000000000000000000000000000000000000..a62040c81ea93ece6d62420333d6cbf8beeefd09 --- /dev/null +++ b/Projects/Gaspard/DetectorConfiguration/gaspardV1Barrel.detector @@ -0,0 +1,110 @@ +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and distance given in mm +%%Angle given in degree +%% using the data from the experimental mesurement +%% special care is given for the X Y direction +%% NOTATTION USED IN THE FOLLOWING: +%% +%% X1_Y1 --> X:1 Y:1 +%% X128_Y1 --> X:128 Y:1 +%% X1_Y128 --> X:1 Y:128 +%% X128_Y128 --> X:128 Y:128 +%%Option: 0,1 for Si SiLi and CSI +%%Option: all or sensible for VISualisation +% 1.2 12.371134021 +% 2 20.618556701 +% 30 309.278350515 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Target + THICKNESS= 309.278350515 + RADIUS= 7.5 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GaspardTracker +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 49.1 66.08 -135.41 + X128_Y1= -48.9 66.22 -135.41 + X1_Y128= -48.8 135.51 -66.1 + X128_Y128= 49.2 135.36 -66.1 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -66.04 61.23 -130.4 + X128_Y1= -135.4 12.32 -81.4 + X1_Y128= -65.94 130.51 -61.09 + X128_Y128= -135.3 81.6 -12.1 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +GPDSquare + X1_Y1= -142.52 0.22 -69.3 + X128_Y1= -142.62 -69.09 -0.01 + X1_Y128= -142.42 69.5 0.01 + X128_Y128= -142.52 0.19 69.3 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +GPDSquare + X1_Y1= -135.54 -81.21 12.1 + X128_Y1= -66.31 -130.32 61.09 + X1_Y128= -135.44 -11.93 81.4 + X128_Y128= -66.21 -61.04 130.4 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +GPDSquare + X1_Y1= -49.2 -135.36 66.1 + X128_Y1= 48.8 -135.51 66.1 + X1_Y128= 48.9 -66.22 135.41 + X128_Y128= -49.1 -66.08 135.41 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +GPDSquare + X1_Y1= 65.94 -130.51 61.09 + X128_Y1= 135.3 -81.6 12.1 + X1_Y128= 135.4 -12.32 81.4 + X128_Y128= 66.04 -61.23 130.4 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +GPDSquare + X1_Y1= 142.42 -69.5 -0.01 + X128_Y1= 142.52 -0.19 -69.3 + X1_Y128= 142.52 -0.22 69.3 + X128_Y128= 142.62 69.09 0.01 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 +GPDSquare + X1_Y1= 135.44 11.93 -81.4 + X128_Y1= 66.21 61.04 -130.4 + X1_Y128= 66.31 130.32 -61.09 + X128_Y128= 135.54 81.21 -12.1 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 diff --git a/Projects/Gaspard/DetectorConfiguration/gaspardV1EndCapBack.detector b/Projects/Gaspard/DetectorConfiguration/gaspardV1EndCapBack.detector new file mode 100644 index 0000000000000000000000000000000000000000..459d1e7b8d32d5eebebc17bce3c3641c94e57e72 --- /dev/null +++ b/Projects/Gaspard/DetectorConfiguration/gaspardV1EndCapBack.detector @@ -0,0 +1,79 @@ +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and distance given in mm +%%Angle given in degree +%% using the data from the experimental mesurement +%% special care is given for the X Y direction +%% NOTATTION USED IN THE FOLLOWING: +%% +%% X1_Y1 --> X:1 Y:1 +%% X128_Y1 --> X:128 Y:1 +%% X1_Y128 --> X:1 Y:128 +%% X128_Y128 --> X:128 Y:128 +%%Option: 0,1 for Si SiLi and CSI +%%Option: all or sensible for VISualisation +% 1.2 12.371134021 +% 2 20.618556701 +% 30 309.278350515 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +%Target + THICKNESS= 0 + RADIUS= 7.5 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Gaspard +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -12.17 -38.15 -153.33 + X128_Y1= -81.53 -87.06 -104.34 + X1_Y128= -61.04 45.57 -138.96 + X128_Y128= -130.41 -3.34 -89.97 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -12.33 -153.3 -38.22 + X128_Y1= -61.31 -138.89 45.43 + X1_Y128= -130.54 -89.78 -3.56 + X128_Y128= -81.56 -104.19 -87.21 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +GPDSquare + X1_Y1= 11.89 -153.33 -38.22 + X128_Y1= 81.26 -104.42 -87.21 + X1_Y128= 60.91 -139.07 45.43 + X128_Y128= 130.28 -130.28 -3.56 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +GPDSquare + X1_Y1= 130.4 -3.72 -89.97 + X128_Y1= 81.28 -87.29 -104.34 + X1_Y128= 12.06 -38.18 -153.33 + X128_Y128= 61.18 45.39 -138.96 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +GPDSquare + X1_Y1= 69.15 -100.86 -100.79 + X128_Y1= -0.22 -149.76 -51.8 + X1_Y128= -0.08 -51.75 -149.78 + X128_Y128= -69.44 -100.66 -100.79 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all diff --git a/Projects/Gaspard/DetectorConfiguration/gaspardV1EndCapFront.detector b/Projects/Gaspard/DetectorConfiguration/gaspardV1EndCapFront.detector new file mode 100644 index 0000000000000000000000000000000000000000..4a256cf4a58834414f0b7ce1d623f54c49600805 --- /dev/null +++ b/Projects/Gaspard/DetectorConfiguration/gaspardV1EndCapFront.detector @@ -0,0 +1,79 @@ +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and distance given in mm +%%Angle given in degree +%% using the data from the experimental mesurement +%% special care is given for the X Y direction +%% NOTATTION USED IN THE FOLLOWING: +%% +%% X1_Y1 --> X:1 Y:1 +%% X128_Y1 --> X:128 Y:1 +%% X1_Y128 --> X:1 Y:128 +%% X128_Y128 --> X:128 Y:128 +%%Option: 0,1 for Si SiLi and CSI +%%Option: all or sensible for VISualisation +% 1.2 12.371134021 +% 2 20.618556701 +% 30 309.278350515 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Target + THICKNESS= 309.278350515 + RADIUS= 7.5 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Gaspard +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Cap Front +GPDSquare + X1_Y1= -60.91 139.07 -45.43 + X128_Y1= -130.28 90.16 3.6 + X1_Y128= -81.26 104.42 87.21 + X128_Y128= -11.89 153.33 38.22 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -81.28 87.29 104.34 + X128_Y1= -130.40 3.72 89.97 + X1_Y128= -12.06 38.18 153.33 + X128_Y128= -61.18 -45.39 138.96 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +GPDSquare + X1_Y1= 81.53 87.06 104.34 + X128_Y1= 12.17 38.15 153.33 + X1_Y128= 61.04 -45.57 138.96 + X128_Y128= 130.411 3.34 89.97 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +GPDSquare + X1_Y1= 61.31 138.89 -45.43 + X128_Y1= 12.33 153.30 38.22 + X1_Y128= 81.56 104.19 87.21 + X128_Y128= 130.54 89.78 3.56 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +GPDSquare + X1_Y1= 0.22 149.76 51.80 + X128_Y1= -69.15 100.86 100.79 + X1_Y128= 0.08 51.75 149.78 + X128_Y128= 69.44 100.66 100.79 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all diff --git a/Inputs/DetectorConfiguration/gaspardV1Full.detector b/Projects/Gaspard/DetectorConfiguration/gaspardV1Full.detector similarity index 71% rename from Inputs/DetectorConfiguration/gaspardV1Full.detector rename to Projects/Gaspard/DetectorConfiguration/gaspardV1Full.detector index 220f695cbae27d3df1f297fe89484453ef8e3732..bf69150ab82da7ee618d919fa03613a09b2299c8 100644 --- a/Inputs/DetectorConfiguration/gaspardV1Full.detector +++ b/Projects/Gaspard/DetectorConfiguration/gaspardV1Full.detector @@ -5,10 +5,10 @@ %% special care is given for the X Y direction %% NOTATTION USED IN THE FOLLOWING: %% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 +%% X1_Y1 --> X:1 Y:1 +%% X128_Y1 --> X:128 Y:1 +%% X1_Y128 --> X:1 Y:128 +%% X128_Y128 --> X:128 Y:128 %%Option: 0,1 for Si SiLi and CSI %%Option: all or sensible for VISualisation % 1.2 12.371134021 @@ -19,94 +19,94 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Target - THICKNESS= 0.001 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + THICKNESS= 0.001 + RADIUS= 7.5 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% GaspardTracker %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Barrel GPDSquare - X1_Y1= 49.1 66.08 -135.41 - X128_Y1= -48.9 66.22 -135.41 - X1_Y128= -48.8 135.51 -66.1 - X128_Y128= 49.2 135.36 -66.1 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all + X1_Y1= 49.1 66.08 -135.41 + X128_Y1= -48.9 66.22 -135.41 + X1_Y128= -48.8 135.51 -66.1 + X128_Y128= 49.2 135.36 -66.1 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 GPDSquare - X1_Y1= -66.04 61.23 -130.4 - X128_Y1= -135.4 12.32 -81.4 - X1_Y128= -65.94 130.51 -61.09 - X128_Y128= -135.3 81.6 -12.1 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all + X1_Y1= -66.04 61.23 -130.4 + X128_Y1= -135.4 12.32 -81.4 + X1_Y128= -65.94 130.51 -61.09 + X128_Y128= -135.3 81.6 -12.1 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 GPDSquare - X1_Y1= -142.52 0.22 -69.3 - X128_Y1= -142.62 -69.09 -0.01 - X1_Y128= -142.42 69.5 0.01 - X128_Y128= -142.52 0.19 69.3 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all + X1_Y1= -142.52 0.22 -69.3 + X128_Y1= -142.62 -69.09 -0.01 + X1_Y128= -142.42 69.5 0.01 + X128_Y128= -142.52 0.19 69.3 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 GPDSquare - X1_Y1= -135.54 -81.21 12.1 - X128_Y1= -66.31 -130.32 61.09 - X1_Y128= -135.44 -11.93 81.4 - X128_Y128= -66.21 -61.04 130.4 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all + X1_Y1= -135.54 -81.21 12.1 + X128_Y1= -66.31 -130.32 61.09 + X1_Y128= -135.44 -11.93 81.4 + X128_Y128= -66.21 -61.04 130.4 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 GPDSquare - X1_Y1= -49.2 -135.36 66.1 - X128_Y1= 48.8 -135.51 66.1 - X1_Y128= 48.9 -66.22 135.41 - X128_Y128= -49.1 -66.08 135.41 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all + X1_Y1= -49.2 -135.36 66.1 + X128_Y1= 48.8 -135.51 66.1 + X1_Y128= 48.9 -66.22 135.41 + X128_Y128= -49.1 -66.08 135.41 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 GPDSquare - X1_Y1= 65.94 -130.51 61.09 - X128_Y1= 135.3 -81.6 12.1 - X1_Y128= 135.4 -12.32 81.4 - X128_Y128= 66.04 -61.23 130.4 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all + X1_Y1= 65.94 -130.51 61.09 + X128_Y1= 135.3 -81.6 12.1 + X1_Y128= 135.4 -12.32 81.4 + X128_Y128= 66.04 -61.23 130.4 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 GPDSquare - X1_Y1= 142.42 -69.5 -0.01 - X128_Y1= 142.52 -0.19 -69.3 - X1_Y128= 142.52 -0.22 69.3 - X128_Y128= 142.62 69.09 0.01 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all + X1_Y1= 142.42 -69.5 -0.01 + X128_Y1= 142.52 -0.19 -69.3 + X1_Y128= 142.52 -0.22 69.3 + X128_Y128= 142.62 69.09 0.01 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 GPDSquare - X1_Y1= 135.44 11.93 -81.4 - X128_Y1= 66.21 61.04 -130.4 - X1_Y128= 66.31 130.32 -61.09 - X128_Y128= 135.54 81.21 -12.1 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all + X1_Y1= 135.44 11.93 -81.4 + X128_Y1= 66.21 61.04 -130.4 + X1_Y128= 66.31 130.32 -61.09 + X128_Y128= 135.54 81.21 -12.1 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Cap Back GPDSquare X1_Y1= -12.17 -38.15 -153.33 diff --git a/Projects/Gaspard/DetectorConfiguration/gaspardV1_r150.detector b/Projects/Gaspard/DetectorConfiguration/gaspardV1_r150.detector new file mode 100644 index 0000000000000000000000000000000000000000..f2b5d92676d2abec2d47747bb41657cde80b5baa --- /dev/null +++ b/Projects/Gaspard/DetectorConfiguration/gaspardV1_r150.detector @@ -0,0 +1,672 @@ +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and distance given in mm +%%Angle given in degree +%% using the data from the experimental mesurement +%% special care is given for the X Y direction +%% NOTATTION USED IN THE FOLLOWING: +%% +%% X1_Y1 --> X:1 Y:1 +%% X128_Y1 --> X:128 Y:1 +%% X1_Y128 --> X:1 Y:128 +%% X128_Y128 --> X:128 Y:128 +%%Option: 0,1 for Si SiLi and CSI +%%Option: all or sensible for VISualisation +% 1.2 12.371134021 +% 2 20.618556701 +% 30 309.278350515 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Target + THICKNESS= 0.001 + RADIUS= 7.5 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GaspardTracker +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 // central ring +GPDSquare + X1_Y1= 25 150 25 + X128_Y1= -25 150 25 + X1_Y128= 25 150 -25 + X128_Y128= -25 150 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -34.3055 148.149 25 + X128_Y1= -80.4995 129.0149 25 + X1_Y128= -34.3055 148.149 -25 + X128_Y128= -80.4995 129.0149 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -88.3883 123.7437 25 + X128_Y1= -123.744 88.388 25 + X1_Y128= -88.3883 123.7437 -25 + X128_Y128= -123.744 88.388 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +GPDSquare + X1_Y1= -129.015 80.49963 25 + X128_Y1= -148.149 34.30567 25 + X1_Y128= -129.015 80.49963 -25 + X128_Y128= -148.149 34.30567 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +GPDSquare + X1_Y1= -150. 25 25 + X128_Y1= -150. -25 25 + X1_Y128= -150. 25 -25 + X128_Y128= -150. -25 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +GPDSquare + X1_Y1= -148.1490726 -34.30528084 25 + X128_Y1= -129.0149776 -80.4992892 25 + X1_Y128= -148.1490726 -34.30528084 -25 + X128_Y128= -129.0149776 -80.4992892 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +GPDSquare + X1_Y1= -123.7438626 -88.38810137 25 + X128_Y1= -88.38859392 -123.7435108 25 + X1_Y128= -123.7438626 -88.38810137 -25 + X128_Y128= -88.38859392 -123.7435108 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +GPDSquare + X1_Y1= -80.49980273 -129.0146572 25 + X128_Y1= -34.30587053 -148.148936 25 + X1_Y128= -80.49980273 -129.0146572 -25 + X128_Y128= -34.30587053 -148.148936 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 +GPDSquare + X1_Y1= -25.00039804 -149.9999337 25 + X128_Y1= 24.99960196 -150.0000663 25 + X1_Y128= -25.00039804 -149.9999337 -25 + X128_Y128= 24.99960196 -150.0000663 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 +GPDSquare + X1_Y1= 34.30508427 -148.1491181 25 + X128_Y1= 80.49911802 -129.0150844 25 + X1_Y128= 34.30508427 -148.1491181 -25 + X128_Y128= 80.49911802 -129.0150844 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 +GPDSquare + X1_Y1= 88.38793719 -123.7439799 25 + X128_Y1= 123.7433935 -88.3887581 25 + X1_Y128= 88.38793719 -123.7439799 -25 + X128_Y128= 123.7433935 -88.3887581 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 +GPDSquare + X1_Y1= 129.0145503 -80.4999739 25 + X128_Y1= 148.1488905 -34.30606709 25 + X1_Y128= 129.0145503 -80.4999739 -25 + X128_Y128= 148.1488905 -34.30606709 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 +GPDSquare + X1_Y1= 149.9999005 -25.00059706 25 + X128_Y1= 150.0000995 24.99940294 25 + X1_Y128= 149.9999005 -25.00059706 -25 + X128_Y128= 150.0000995 24.99940294 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 +GPDSquare + X1_Y1= 148.1491636 34.30488771 25 + X128_Y1= 129.0151912 80.49894684 25 + X1_Y128= 148.1491636 34.30488771 -25 + X128_Y128= 129.0151912 80.49894684 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 +GPDSquare + X1_Y1= 123.7440972 88.38777301 25 + X128_Y1= 88.38892229 123.7432763 25 + X1_Y128= 123.7440972 88.38777301 -25 + X128_Y128= 88.38892229 123.7432763 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 +GPDSquare + X1_Y1= 80.50014508 129.0144435 25 + X128_Y1= 34.30626365 148.148845 25 + X1_Y128= 80.50014508 129.0144435 -25 + X128_Y128= 34.30626365 148.148845 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 // Forward 1 +GPDSquare + X1_Y1= 25 129.0149 80.49946 + X128_Y1= -25 129.0149 80.49946 + X1_Y128= 25 148.149 34.30548 + X128_Y128= -25 148.149 34.30548 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 // Forward 1 +GPDSquare + X1_Y1= -42.85674535 124.2301745 80.49946037 + X128_Y1= -86.15802659 99.23019366 80.49946037 + X1_Y128= -52.42381617 140.8008442 34.3054774 + X128_Y128= -95.72509741 115.8008633 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18 // Forward 1 +GPDSquare + X1_Y1= -99.23007934 86.15815825 80.49946037 + X128_Y1= -124.2301176 42.85691018 80.49946037 + X1_Y128= -115.8007363 95.72525106 34.3054774 + X128_Y128= -140.8007746 52.42400298 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%19 // Forward 1 +GPDSquare + X1_Y1= -129.0148376 25.00017118 80.49946037 + X128_Y1= -129.0149039 -24.99982882 80.49946037 + X1_Y128= -148.1489939 25.00019656 34.3054774 + X128_Y128= -148.1490602 -24.99980344 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%20 // Forward 1 +GPDSquare + X1_Y1= -124.2302314 -42.85658052 80.49946037 + X128_Y1= -99.23030797 -86.15789493 80.49946037 + X1_Y128= -140.8009137 -52.42362935 34.3054774 + X128_Y128= -115.8009903 -95.72494377 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%21 // Forward 1 +GPDSquare + X1_Y1= -86.15828991 -99.22996503 80.49946037 + X128_Y1= -42.857075 -124.2300608 80.49946037 + X1_Y128= -95.7254047 -115.8006093 34.3054774 + X128_Y128= -52.42418979 -140.8007051 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22 // Forward 1 +GPDSquare + X1_Y1= -25.00034235 -129.0148044 80.49946037 + X128_Y1= 24.99965765 -129.0149371 80.49946037 + X1_Y128= -25.00039313 -148.1489607 34.3054774 + X128_Y128= 24.99960687 -148.1490934 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%23 // Forward 1 +GPDSquare + X1_Y1= 42.85641569 -124.2302882 80.49946037 + X128_Y1= 86.15776328 -99.23042228 80.49946037 + X1_Y128= 52.42344254 -140.8009833 34.3054774 + X128_Y128= 95.72479012 -115.8011173 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24 // Forward 1 +GPDSquare + X1_Y1= 99.22985071 -86.15842157 80.49946037 + X128_Y1= 124.2300039 -42.85723983 80.49946037 + X1_Y128= 115.8004823 -95.72555834 34.3054774 + X128_Y128= 140.8006355 -52.42437661 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%25 // Forward 1 +GPDSquare + X1_Y1= 129.0147713 -25.00051353 80.49946037 + X128_Y1= 129.0149703 24.99948647 80.49946037 + X1_Y128= 148.1489276 -25.00058969 34.3054774 + X128_Y128= 148.1491266 24.99941031 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%26 // Forward 1 +GPDSquare + X1_Y1= 124.2303451 42.85625086 80.49946037 + X128_Y1= 99.2305366 86.15763162 80.49946037 + X1_Y128= 140.8010528 52.42325572 34.3054774 + X128_Y128= 115.8012443 95.72463648 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%27 // Forward 1 +GPDSquare + X1_Y1= 86.15855322 99.2297364 80.49946037 + X128_Y1= 42.85740466 124.2299471 80.49946037 + X1_Y128= 95.72571199 115.8003553 34.3054774 + X128_Y128= 52.42456342 140.8005659 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%28 // Forward 2 +GPDSquare + X1_Y1= 25 88.38843 123.7436 + X128_Y1= -25 88.38843 123.7436 + X1_Y128= 25 123.7436 88.38843 + X128_Y128= -25 123.7436 88.38843 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%29 // Forward 2 +GPDSquare + X1_Y1= -44.82233533 80.17775731 123.7436281 + X128_Y1= -80.17769784 44.82244171 123.7436281 + X1_Y128= -69.82230216 105.1777573 88.38826556 + X128_Y128= -105.1776647 69.82244171 88.38826556 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%30 // Forward 2 +GPDSquare + X1_Y1= -88.38839657 25.00011727 123.7436281 + X128_Y1= -88.38846291 -24.99988273 123.7436281 + X1_Y128= -123.7437122 25.00016418 88.38826556 + X128_Y128= -123.7437785 -24.99983582 88.38826556 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%31 // Forward 2 +GPDSquare + + X1_Y1= -80.17781678 -44.82222895 123.7436281 + X128_Y1= -44.82254809 -80.17763837 123.7436281 + X1_Y128= -105.17785 -69.82216261 88.38826556 + X128_Y128= -69.82258126 -105.177572 88.38826556 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%32 // Forward 2 +GPDSquare + X1_Y1= -25.00023455 -88.3883634 123.7436281 + X128_Y1= 24.99976545 -88.38849608 123.7436281 + X1_Y128= -25.00032837 -123.743679 88.38826556 + X128_Y128= 24.99967163 -123.7438117 88.38826556 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%33 // Forward 2 +GPDSquare + X1_Y1= 44.82212257 -80.17787625 123.7436281 + X128_Y1= 80.1775789 -44.82265447 123.7436281 + X1_Y128= 69.82202306 -105.1779426 88.38826556 + X128_Y128= 105.1774794 -69.82272081 88.38826556 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%34 // Forward 2 +GPDSquare + X1_Y1= 88.38833023 -25.00035182 123.7436281 + X128_Y1= 88.38852925 24.99964818 123.7436281 + X1_Y128= 123.7436458 -25.00049255 88.38826556 + X128_Y128= 123.7438449 24.99950745 88.38826556 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%35 // Forward 2 +GPDSquare + X1_Y1= 80.17793572 44.82201619 123.7436281 + X128_Y1= 44.82276085 80.17751943 123.7436281 + X1_Y128= 105.1780352 69.82188351 88.38826556 + X128_Y128= 69.82286035 105.1773868 88.38826556 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%36 // Forward 3 +GPDSquare + X1_Y1= 25 34.30548 148.149 + X128_Y1= -25 34.30548 148.149 + X1_Y128= 25 80.49946 129.0149 + X128_Y128= -25 80.49946 129.0149 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%37 +GPDSquare + X1_Y1= -34.30548 25 148.149 + X128_Y1= -34.30548 -25 148.149 + X1_Y128= -80.49946 25 129.0149 + X128_Y128= -80.49946 -25 129.0149 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%38 +GPDSquare + X1_Y1= -25 -34.30548 148.149 + X128_Y1= 25 -34.30548 148.149 + X1_Y128= -25 -80.49946 129.0149 + X128_Y128= 25 -80.49946 129.0149 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%39 +GPDSquare + X1_Y1= 34.30548 -25 148.149 + X128_Y1= 34.30548 25 148.149 + X1_Y128= 80.49946 -25 129.0149 + X128_Y128= 80.49946 25 129.0149 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40 // Backward 1 +GPDSquare + X1_Y1= 25 148.1490271 -34.3054774 + X128_Y1= -25 148.1490271 -34.3054774 + X1_Y128= 25 129.0148708 -80.49946037 + X128_Y128= -25 129.0148708 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%41 // Backward 1 +GPDSquare + X1_Y1= 95.72509741 115.8008633 -34.3054774 + X128_Y1= 52.42381617 140.8008442 -34.3054774 + X1_Y128= 86.15802659 99.23019366 -80.49946037 + X128_Y128= 42.85674535 124.2301745 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%42 // Backward 1 +GPDSquare + X1_Y1= 140.8007746 52.42400298 -34.3054774 + X128_Y1= 115.8007363 95.72525106 -34.3054774 + X1_Y128= 124.2301176 42.85691018 -80.49946037 + X128_Y128= 99.23007934 86.15815825 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%43 // Backward 1 +GPDSquare + X1_Y1= 148.1490602 -24.99980344 -34.3054774 + X128_Y1= 148.1489939 25.00019656 -34.3054774 + X1_Y128= 129.0149039 -24.99982882 -80.49946037 + X128_Y128= 129.0148376 25.00017118 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%44 // Backward 1 +GPDSquare + X1_Y1= 115.8009903 -95.72494377 -34.3054774 + X128_Y1= 140.8009137 -52.42362935 -34.3054774 + X1_Y128= 99.23030797 -86.15789493 -80.49946037 + X128_Y128= 124.2302314 -42.85658052 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%45 // Backward 1 +GPDSquare + X1_Y1= 52.42418979 -140.8007051 -34.3054774 + X128_Y1= 95.7254047 -115.8006093 -34.3054774 + X1_Y128= 42.857075 -124.2300608 -80.49946037 + X128_Y128= 86.15828991 -99.22996503 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%46 // Backward 1 +GPDSquare + X1_Y1= -24.99960687 -148.1490934 -34.3054774 + X128_Y1= 25.00039313 -148.1489607 -34.3054774 + X1_Y128= -24.99965765 -129.0149371 -80.49946037 + X128_Y128= 25.00034235 -129.0148044 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%47 // Backward 1 +GPDSquare + X1_Y1= -95.72479012 -115.8011173 -34.3054774 + X128_Y1= -52.42344254 -140.8009833 -34.3054774 + X1_Y128= -86.15776328 -99.23042228 -80.49946037 + X128_Y128= -42.85641569 -124.2302882 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%48 // Backward 1 +GPDSquare + X1_Y1= -140.8006355 -52.42437661 -34.3054774 + X128_Y1= -115.8004823 -95.72555834 -34.3054774 + X1_Y128= -124.2300039 -42.85723983 -80.49946037 + X128_Y128= -99.22985071 -86.15842157 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%49 // Backward 1 +GPDSquare + X1_Y1= -148.1491266 24.99941031 -34.3054774 + X128_Y1= -148.1489276 -25.00058969 -34.3054774 + X1_Y128= -129.0149703 24.99948647 -80.49946037 + X128_Y128= -129.0147713 -25.00051353 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%50 // Backward 1 +GPDSquare + X1_Y1= -115.8012443 95.72463648 -34.3054774 + X128_Y1= -140.8010528 52.42325572 -34.3054774 + X1_Y128= -99.2305366 86.15763162 -80.49946037 + X128_Y128= -124.2303451 42.85625086 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%51 // Backward 1 +GPDSquare + X1_Y1= -52.42456342 140.8005659 -34.3054774 + X128_Y1= -95.72571199 115.8003553 -34.3054774 + X1_Y128= -42.85740466 124.2299471 -80.49946037 + X128_Y128= -86.15855322 99.2297364 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%52 // Backward 2 +GPDSquare + X1_Y1= 25 123.7437453 -88.38826556 + X128_Y1= -25 123.7437453 -88.38826556 + X1_Y128= 25 88.38842974 -123.7436281 + X128_Y128= -25 88.38842974 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%53 // Backward 2 +GPDSquare + X1_Y1= 105.1776647 69.82244171 -88.38826556 + X128_Y1= 69.82230216 105.1777573 -88.38826556 + X1_Y128= 80.17769784 44.82244171 -123.7436281 + X128_Y128= 44.82233533 80.17775731 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%54 // Backward 2 +GPDSquare + X1_Y1= 123.7437785 -24.99983582 -88.38826556 + X128_Y1= 123.7437122 25.00016418 -88.38826556 + X1_Y128= 88.38846291 -24.99988273 -123.7436281 + X128_Y128= 88.38839657 25.00011727 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%55 // Backward 2 +GPDSquare + X1_Y1= 69.82258126 -105.177572 -88.38826556 + X128_Y1= 105.17785 -69.82216261 -88.38826556 + X1_Y128= 44.82254809 -80.17763837 -123.7436281 + X128_Y128= 80.17781678 -44.82222895 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%56 // Backward 2 +GPDSquare + X1_Y1= -24.99967163 -123.7438117 -88.38826556 + X128_Y1= 25.00032837 -123.743679 -88.38826556 + X1_Y128= -24.99976545 -88.38849608 -123.7436281 + X128_Y128= 25.00023455 -88.3883634 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%57 // Backward 2 +GPDSquare + X1_Y1= -105.1774794 -69.82272081 -88.38826556 + X128_Y1= -69.82202306 -105.1779426 -88.38826556 + X1_Y128= -80.1775789 -44.82265447 -123.7436281 + X128_Y128= -44.82212257 -80.17787625 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%58 // Backward 2 +GPDSquare + X1_Y1= -123.7438449 24.99950745 -88.38826556 + X128_Y1= -123.7436458 -25.00049255 -88.38826556 + X1_Y128= -88.38852925 24.99964818 -123.7436281 + X128_Y128= -88.38833023 -25.00035182 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%59 // Backward 2 +GPDSquare + X1_Y1= -69.82286035 105.1773868 -88.38826556 + X128_Y1= -105.1780352 69.82188351 -88.38826556 + X1_Y128= -44.82276085 80.17751943 -123.7436281 + X128_Y128= -80.17793572 44.82201619 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%60 // Backward 3 +GPDSquare + X1_Y1= 25. 80.49963 -129.014764 + X128_Y1= -25. 80.49963 -129.014764 + X1_Y128= 25. 34.30567 -148.1489815 + X128_Y128= -25. 34.30567 -148.1489815 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%61 // Backward 3 +GPDSquare + X1_Y1= -80.49959838 25.00010681 -129.014764 + X128_Y1= -80.49966472 -24.99989319 -129.014764 + X1_Y128= -34.30564079 25.00004552 -148.1489815 + X128_Y128= -34.30570713 -24.99995448 -148.1489815 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%62 // Backward 3 +GPDSquare + X1_Y1= -25.00021361 -80.49956521 -129.014764 + X128_Y1= 24.99978639 -80.49969789 -129.014764 + X1_Y128= -25.00009103 -34.30560762 -148.1489815 + X128_Y128= 24.99990897 -34.3057403 -148.1489815 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%63 // Backward 3 +GPDSquare + X1_Y1= 80.49953204 -25.00032042 -129.014764 + X128_Y1= 80.49973106 24.99967958 -129.014764 + X1_Y128= 34.30557445 -25.00013655 -148.1489815 + X128_Y128= 34.30577347 24.99986345 -148.1489815 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all + + diff --git a/Projects/Gaspard/DetectorConfiguration/gaspardV1_r150_69det.detector b/Projects/Gaspard/DetectorConfiguration/gaspardV1_r150_69det.detector new file mode 100644 index 0000000000000000000000000000000000000000..e7389270ca1c026741ed12885df9a64c07bb84b7 --- /dev/null +++ b/Projects/Gaspard/DetectorConfiguration/gaspardV1_r150_69det.detector @@ -0,0 +1,711 @@ +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and distance given in mm +%%Angle given in degree +%% using the data from the experimental mesurement +%% special care is given for the X Y direction +%% NOTATTION USED IN THE FOLLOWING: +%% +%% X1_Y1 --> X:1 Y:1 +%% X128_Y1 --> X:128 Y:1 +%% X1_Y128 --> X:1 Y:128 +%% X128_Y128 --> X:128 Y:128 +%%Option: 0,1 for Si SiLi and CSI +%%Option: all or sensible for VISualisation +% 1.2 12.371134021 +% 2 20.618556701 +% 30 309.278350515 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Target + THICKNESS= 0.001 + RADIUS= 7.5 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GaspardTracker +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 // central ring +GPDSquare + X1_Y1= 25 150 25 + X128_Y1= -25 150 25 + X1_Y128= 25 150 -25 + X128_Y128= -25 150 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -34.3055 148.149 25 + X128_Y1= -80.4995 129.0149 25 + X1_Y128= -34.3055 148.148 -25 + X128_Y128= -80.4995 129.0149 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -88.3883 123.7437 25 + X128_Y1= -123.744 88.388 25 + X1_Y128= -88.3883 123.7437 -25 + X128_Y128= -123.744 88.388 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +GPDSquare + X1_Y1= -129.015 80.49963 25 + X128_Y1= -148.149 34.30567 25 + X1_Y128= -129.015 80.49963 -25 + X128_Y128= -148.149 34.30567 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +GPDSquare + X1_Y1= -150. 25 25 + X128_Y1= -150. -25 25 + X1_Y128= -150. 25 -25 + X128_Y128= -150. -25 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +GPDSquare + X1_Y1= -148.1490726 -34.30528084 25 + X128_Y1= -129.0149776 -80.4992892 25 + X1_Y128= -148.1490726 -34.30528084 -25 + X128_Y128= -129.0149776 -80.4992892 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +GPDSquare + X1_Y1= -123.7438626 -88.38810137 25 + X128_Y1= -88.38859392 -123.7435108 25 + X1_Y128= -123.7438626 -88.38810137 -25 + X128_Y128= -88.38859392 -123.7435108 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +GPDSquare + X1_Y1= -80.49980273 -129.0146572 25 + X128_Y1= -34.30587053 -148.148936 25 + X1_Y128= -80.49980273 -129.0146572 -25 + X128_Y128= -34.30587053 -148.148936 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 +GPDSquare + X1_Y1= -25.00039804 -149.9999337 25 + X128_Y1= 24.99960196 -150.0000663 25 + X1_Y128= -25.00039804 -149.9999337 -25 + X128_Y128= 24.99960196 -150.0000663 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 +GPDSquare + X1_Y1= 34.30508427 -148.1491181 25 + X128_Y1= 80.49911802 -129.0150844 25 + X1_Y128= 34.30508427 -148.1491181 -25 + X128_Y128= 80.49911802 -129.0150844 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 +GPDSquare + X1_Y1= 88.38793719 -123.7439799 25 + X128_Y1= 123.7433935 -88.3887581 25 + X1_Y128= 88.38793719 -123.7439799 -25 + X128_Y128= 123.7433935 -88.3887581 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 +GPDSquare + X1_Y1= 129.0145503 -80.4999739 25 + X128_Y1= 148.1488905 -34.30606709 25 + X1_Y128= 129.0145503 -80.4999739 -25 + X128_Y128= 148.1488905 -34.30606709 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 +GPDSquare + X1_Y1= 149.9999005 -25.00059706 25 + X128_Y1= 150.0000995 24.99940294 25 + X1_Y128= 149.9999005 -25.00059706 -25 + X128_Y128= 150.0000995 24.99940294 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 +GPDSquare + X1_Y1= 148.1491636 34.30488771 25 + X128_Y1= 129.0151912 80.49894684 25 + X1_Y128= 148.1491636 34.30488771 -25 + X128_Y128= 129.0151912 80.49894684 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 +GPDSquare + X1_Y1= 123.7440972 88.38777301 25 + X128_Y1= 88.38892229 123.7432763 25 + X1_Y128= 123.7440972 88.38777301 -25 + X128_Y128= 88.38892229 123.7432763 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 +GPDSquare + X1_Y1= 80.50014508 129.0144435 25 + X128_Y1= 34.30626365 148.148845 25 + X1_Y128= 80.50014508 129.0144435 -25 + X128_Y128= 34.30626365 148.148845 -25 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 // Forward 1 +GPDSquare + X1_Y1= 25 129.0149 80.49946 + X128_Y1= -25 129.0149 80.49946 + X1_Y128= 25 148.149 34.30548 + X128_Y128= -25 148.149 34.30548 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 // Forward 1 +GPDSquare + X1_Y1= -37.81974796 125.8550895 80.49946037 + X128_Y1= -82.09255873 102.6189489 80.49946037 + X1_Y128= -46.71182686 142.7975471 34.3054774 + X128_Y128= -90.98463762 119.5614066 34.305477 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18 // Forward 1 +GPDSquare + X1_Y1= -91.9754618 93.86347163 80.49946037 + X128_Y1= -120.3787327 52.71430153 80.49946037 + X1_Y128= -107.7225548 104.7329241 34.3054774 + X128_Y128= -136.1258258 63.58375404 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%19 // Forward 1 +GPDSquare + X1_Y1= -125.0607407 40.36889924 80.49946037 + X128_Y1= -131.0876355 -9.266537079 80.49946037 + X1_Y128= -144.0553846 42.67529019 34.3054774 + X128_Y128= -150.0822794 -6.960146136 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%20 // Forward 1 +GPDSquare + X1_Y1= -129.4961584 -22.37368614 80.49946037 + X128_Y1= -111.7659904 -69.12452723 80.49946037 + X1_Y128= -147.3869164 -29.15872226 34.3054774 + X128_Y128= -129.6567484 -75.90956335 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%21 // Forward 1 +GPDSquare + X1_Y1= -104.265616 -79.99073816 80.49946037 + X128_Y1= -66.84014631 -113.1469475 80.49946037 + X1_Y128= -116.9539379 -94.3128339 34.3054774 + X128_Y128= -79.52846813 -127.4690432 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22 // Forward 1 +GPDSquare + X1_Y1= -55.14911712 -119.2829064 80.49946037 + X128_Y1= -6.602055555 -131.2488085 80.49946037 + X1_Y128= -59.72826595 -137.8610477 34.3054774 + X128_Y128= -11.18120439 -149.8269498 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%23 // Forward 1 +GPDSquare + X1_Y1= 6.601358994 -131.2488436 80.49946037 + X128_Y1= 55.14848406 -119.2831991 80.49946037 + X1_Y128= 11.18040923 -149.8270091 34.3054774 + X128_Y128= 59.72753429 -137.8613647 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24 // Forward 1 +GPDSquare + X1_Y1= 66.83954582 -113.1473022 80.49946037 + X128_Y1= 104.2651915 -79.99129151 80.49946037 + X1_Y128= 79.52779163 -127.4694653 34.3054774 + X128_Y128= 116.9534373 -94.3134546 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%25 // Forward 1 +GPDSquare + X1_Y1= 111.7656236 -69.12512039 80.49946037 + X128_Y1= 129.4960397 -22.3743734 80.49946037 + X1_Y128= 129.6563456 -75.91025146 34.3054774 + X128_Y128= 147.3867617 -29.15950447 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%26 // Forward 1 +GPDSquare + X1_Y1= 131.0875863 -9.267232784 80.49946037 + X128_Y1= 125.0609549 40.36823552 80.49946037 + X1_Y128= 150.0822424 -6.96094265 34.3054774 + X128_Y128= 144.0556111 42.67452566 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%27 // Forward 1 +GPDSquare + X1_Y1= 120.3790125 52.71366266 80.49946037 + X128_Y1= 91.97595995 93.8629835 80.49946037 + X1_Y128= 136.1261632 63.58303159 34.3054774 + X128_Y128= 107.7231107 104.7323524 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%28 // Forward 1 +GPDSquare + X1_Y1= 82.09310335 102.6185133 80.49946037 + X128_Y1= 37.8204159 125.8548887 80.49946037 + X1_Y128= 90.98527216 119.5609237 34.3054774 + X128_Y128= 46.71258471 142.7972992 34.3054774 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%29 // Forward 2 +GPDSquare + X1_Y1= 25 88.38843 123.7436 + X128_Y1= -25 88.38843 123.7436 + X1_Y128= 25 123.7436 88.38843 + X128_Y128= -25 123.7436 88.38843 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%30 +GPDSquare + X1_Y1= -37.66382699 83.77917789 123.7436281 + X128_Y1= -75.9660681 51.63981999 123.7436281 + X1_Y128= -60.38976983 110.8629343 88.38826556 + X128_Y128= -98.69201094 78.72357645 88.38826556 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%31 +GPDSquare + X1_Y1= -82.7043593 39.96878112 123.7436281 + X128_Y1= -91.38682626 -9.271596295 123.7436281 + X1_Y128= -117.522541 46.1082083 88.38826556 + X128_Y128= -126.2050079 -3.132169106 88.38826556 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%32 +GPDSquare + X1_Y1= -89.04666544 -22.54342225 123.7436281 + X128_Y1= -64.04674204 -65.84473666 123.7436281 + X1_Y128= -119.6652982 -40.22102588 88.38826556 + X128_Y128= -94.66537478 -83.5223403 88.38826556 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%33 +GPDSquare + X1_Y1= -53.72311467 -74.50732489 123.7436281 + X128_Y1= -6.738523969 -91.60844288 123.7436281 + X1_Y128= -65.81542315 -107.7304255 88.38826556 + X128_Y128= -18.83083244 -124.8315435 88.38826556 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%34 +GPDSquare + X1_Y1= 6.738037787 -91.60847864 123.7436281 + X128_Y1= 53.72271925 -74.50761 123.7436281 + X1_Y128= 18.83016994 -124.8316435 88.38826556 + X128_Y128= 65.8148514 -107.7307748 88.38826556 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%35 +GPDSquare + X1_Y1= 64.04639259 -65.84507657 123.7436281 + X128_Y1= 89.04654579 -22.54389483 123.7436281 + X1_Y128= 94.66493151 -83.5228427 88.38826556 + X128_Y128= 119.6650847 -40.22166097 88.38826556 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%36 +GPDSquare + X1_Y1= 91.38677705 -9.272081301 123.7436281 + X128_Y1= 82.70457142 39.96834219 123.7436281 + X1_Y128= 126.2049913 -3.132838898 88.38826556 + X128_Y128= 117.5227857 46.10758459 88.38826556 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%37 +GPDSquare + X1_Y1= 75.96634216 51.63941683 123.7436281 + X128_Y1= 37.66427163 83.778978 123.7436281 + X1_Y128= 98.69242874 78.72305267 88.38826556 + X128_Y128= 60.3903582 110.8626138 88.38826556 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%38 // Forward 3 +GPDSquare + X1_Y1= 25 34.30548 148.149 + X128_Y1= -25 34.30548 148.149 + X1_Y128= 25 80.49946 129.0149 + X128_Y128= -25 80.49946 129.0149 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%39 +GPDSquare + X1_Y1= -34.30548 25 148.149 + X128_Y1= -34.30548 -25 148.149 + X1_Y128= -80.49946 25 129.0149 + X128_Y128= -80.49946 -25 129.0149 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40 +GPDSquare + X1_Y1= -25 -34.30548 148.149 + X128_Y1= 25 -34.30548 148.149 + X1_Y128= -25 -80.49946 129.0149 + X128_Y128= 25 -80.49946 129.0149 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%41 +GPDSquare + X1_Y1= 34.30548 -25 148.149 + X128_Y1= 34.30548 25 148.149 + X1_Y128= 80.49946 -25 129.0149 + X128_Y128= 80.49946 25 129.0149 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%42 // Backward 1 +GPDSquare + X1_Y1= 25 148.1490271 -34.3054774 + X128_Y1= -25 148.1490271 -34.3054774 + X1_Y128= 25 129.0148708 -80.49946037 + X128_Y128= -25 129.0148708 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%43 // Backward 1 +GPDSquare + X1_Y1= 90.98463762 119.5614066 -34.3054774 + X128_Y1= 46.71182686 142.7975471 -34.3054774 + X1_Y128= 82.09255873 102.6189489 -80.49946037 + X128_Y128= 37.81974796 125.8550895 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%44 // Backward 1 +GPDSquare + X1_Y1= 136.1258258 63.58375404 -34.3054774 + X128_Y1= 107.7225548 104.7329241 -34.3054774 + X1_Y128= 120.3787327 52.71430153 -80.49946037 + X128_Y128= 91.9754618 93.86347163 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%45 // Backward 1 +GPDSquare + X1_Y1= 150.0822794 -6.960146136 -34.3054774 + X128_Y1= 144.0553846 42.67529019 -34.3054774 + X1_Y128= 131.0876355 -9.266537079 -80.49946037 + X128_Y128= 125.0607407 40.36889924 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%46 // Backward 1 +GPDSquare + X1_Y1= 129.6567484 -75.90956335 -34.3054774 + X128_Y1= 147.3869164 -29.15872226 -34.3054774 + X1_Y128= 111.7659904 -69.12452723 -80.49946037 + X128_Y128= 129.4961584 -22.37368614 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%47 // Backward 1 +GPDSquare + X1_Y1= 79.52846813 -127.4690432 -34.3054774 + X128_Y1= 116.9539379 -94.3128339 -34.3054774 + X1_Y128= 66.84014631 -113.1469475 -80.49946037 + X128_Y128= 104.265616 -79.99073816 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%48 // Backward 1 +GPDSquare + X1_Y1= 11.18120439 -149.8269498 -34.3054774 + X128_Y1= 59.72826595 -137.8610477 -34.3054774 + X1_Y128= 6.602055555 -131.2488085 -80.49946037 + X128_Y128= 55.14911712 -119.2829064 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%49 // Backward 1 +GPDSquare + X1_Y1= -59.72753429 -137.8613647 -34.3054774 + X128_Y1= -11.18040923 -149.8270091 -34.3054774 + X1_Y128= -55.14848406 -119.2831991 -80.49946037 + X128_Y128= -6.601358994 -131.2488436 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%50 // Backward 1 +GPDSquare + X1_Y1= -116.9534373 -94.3134546 -34.3054774 + X128_Y1= -79.52779163 -127.4694653 -34.3054774 + X1_Y128= -104.2651915 -79.99129151 -80.49946037 + X128_Y128= -66.83954582 -113.1473022 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%51 // Backward 1 +GPDSquare + X1_Y1= -147.3867617 -29.15950447 -34.3054774 + X128_Y1= -129.6563456 -75.91025146 -34.3054774 + X1_Y128= -129.4960397 -22.3743734 -80.49946037 + X128_Y128= -111.7656236 -69.12512039 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%52 // Backward 1 +GPDSquare + X1_Y1= -144.0556111 42.67452566 -34.3054774 + X128_Y1= -150.0822424 -6.96094265 -34.3054774 + X1_Y128= -125.0609549 40.36823552 -80.49946037 + X128_Y128= -131.0875863 -9.267232784 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%53 // Backward 1 +GPDSquare + X1_Y1= -107.7231107 104.7323524 -34.3054774 + X128_Y1= -136.1261632 63.58303159 -34.3054774 + X1_Y128= -91.97595995 93.8629835 -80.49946037 + X128_Y128= -120.3790125 52.71366266 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%54 // Backward 1 +GPDSquare + X1_Y1= -46.71258471 142.7972992 -34.3054774 + X128_Y1= -90.98527216 119.5609237 -34.3054774 + X1_Y128= -37.8204159 125.8548887 -80.49946037 + X128_Y128= -82.09310335 102.6185133 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%55 // Backward 2 +GPDSquare + X1_Y1= 25 123.7437453 -88.38826556 + X128_Y1= -25 123.7437453 -88.38826556 + X1_Y128= 25 88.38842974 -123.7436281 + X128_Y128= -25 88.38842974 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%56 // Backward 2 +GPDSquare + X1_Y1= 98.69201094 78.72357645 -88.38826556 + X128_Y1= 60.38976983 110.8629343 -88.38826556 + X1_Y128= 75.9660681 51.63981999 -123.7436281 + X128_Y128= 37.66382699 83.77917789 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%57 // Backward 2 +GPDSquare + X1_Y1= 126.2050079 -3.132169106 -88.38826556 + X128_Y1= 117.522541 46.1082083 -88.38826556 + X1_Y128= 91.38682626 -9.271596295 -123.7436281 + X128_Y128= 82.7043593 39.96878112 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%58 // Backward 2 +GPDSquare + X1_Y1= 94.66537478 -83.5223403 -88.38826556 + X128_Y1= 119.6652982 -40.22102588 -88.38826556 + X1_Y128= 64.04674204 -65.84473666 -123.7436281 + X128_Y128= 89.04666544 -22.54342225 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%59 // Backward 2 +GPDSquare + X1_Y1= 18.83083244 -124.8315435 -88.38826556 + X128_Y1= 65.81542315 -107.7304255 -88.38826556 + X1_Y128= 6.738523969 -91.60844288 -123.7436281 + X128_Y128= 53.72311467 -74.50732489 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%60 // Backward 2 +GPDSquare + X1_Y1= -65.8148514 -107.7307748 -88.38826556 + X128_Y1= -18.83016994 -124.8316435 -88.38826556 + X1_Y128= -53.72271925 -74.50761 -123.7436281 + X128_Y128= -6.738037787 -91.60847864 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%61 // Backward 2 +GPDSquare + X1_Y1= -119.6650847 -40.22166097 -88.38826556 + X128_Y1= -94.66493151 -83.5228427 -88.38826556 + X1_Y128= -89.04654579 -22.54389483 -123.7436281 + X128_Y128= -64.04639259 -65.84507657 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%62 // Backward 2 +GPDSquare + X1_Y1= -117.5227857 46.10758459 -88.38826556 + X128_Y1= -126.2049913 -3.132838898 -88.38826556 + X1_Y128= -82.70457142 39.96834219 -123.7436281 + X128_Y128= -91.38677705 -9.272081301 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%63 // Backward 2 +GPDSquare + X1_Y1= -60.3903582 110.8626138 -88.38826556 + X128_Y1= -98.69242874 78.72305267 -88.38826556 + X1_Y128= -37.66427163 83.778978 -123.7436281 + X128_Y128= -75.96634216 51.63941683 -123.7436281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%64 // Backward 2 +GPDSquare + X1_Y1= 25 80.49963155 -129.014764 + X128_Y1= -25 80.49963155 -129.014764 + X1_Y128= 25 34.30567396 -148.1489815 + X128_Y128= -25 34.30567396 -148.1489815 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%65 // Backward 3 +GPDSquare + X1_Y1= -80.49959838 25.00010681 -129.014764 + X128_Y1= -80.49966472 -24.99989319 -129.014764 + X1_Y128= -34.30564079 25.00004552 -148.1489815 + X128_Y128= -34.30570713 -24.99995448 -148.1489815 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%66 // Backward 3 +GPDSquare + X1_Y1= -25.00021361 -80.49956521 -129.014764 + X128_Y1= 24.99978639 -80.49969789 -129.014764 + X1_Y128= -25.00009103 -34.30560762 -148.1489815 + X128_Y128= 24.99990897 -34.3057403 -148.1489815 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%67 // Backward 3 +GPDSquare + X1_Y1= 80.49953204 -25.00032042 -129.014764 + X128_Y1= 80.49973106 24.99967958 -129.014764 + X1_Y128= 34.30557445 -25.00013655 -148.1489815 + X128_Y128= 34.30577347 24.99986345 -148.1489815 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%68 // Backward 3 + diff --git a/Projects/Gaspard/DetectorConfiguration/gaspardV1_r150asy.detector b/Projects/Gaspard/DetectorConfiguration/gaspardV1_r150asy.detector new file mode 100644 index 0000000000000000000000000000000000000000..814b966f4999dae1c983c4bd550d877e3ec35981 --- /dev/null +++ b/Projects/Gaspard/DetectorConfiguration/gaspardV1_r150asy.detector @@ -0,0 +1,690 @@ +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and distance given in mm +%%Angle given in degree +%% using the data from the experimental mesurement +%% special care is given for the X Y direction +%% NOTATTION USED IN THE FOLLOWING: +%% +%% X1_Y1 --> X:1 Y:1 +%% X128_Y1 --> X:128 Y:1 +%% X1_Y128 --> X:1 Y:128 +%% X128_Y128 --> X:128 Y:128 +%%Option: 0,1 for Si SiLi and CSI +%%Option: all or sensible for VISualisation +% 1.2 12.371134021 +% 2 20.618556701 +% 30 309.278350515 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Target + THICKNESS= 0.001 + RADIUS= 7.5 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GaspardTracker +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 // central ring +GPDSquare + X1_Y1= -88.38826556 100.2608923 76.71550028 + X128_Y1= -123.7436281 68.48373921 61.21676222 + X1_Y128= -88.38826556 122.1794324 31.77578957 + X128_Y128= -123.7436281 90.40227932 16.2770515 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -129.014764 61.39333304 57.75854342 + X128_Y1= -148.1489815 19.87447122 37.50846118 + X1_Y128= -129.014764 83.31187315 12.81883271 + X128_Y128= -148.1489815 41.79301133 -7.431249539 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -149.9999668 11.51076418 33.42921266 + X128_Y1= -150.0000332 -33.42894654 11.51067255 + X1_Y128= -149.9999668 33.42930429 -11.51049806 + X128_Y128= -150.0000332 -11.51040642 -33.42903817 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -148.1490726 -41.79265799 7.431421875 + X128_Y1= -129.0149776 -83.31156544 -12.81868263 + X1_Y128= -148.1490726 -19.87411788 -37.50828884 + X128_Y128= -129.0149776 -61.39302533 -57.75839335 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -123.7438626 -90.40198419 -16.27690755 + X128_Y1= -88.38859392 -122.1792216 -31.77568675 + X1_Y128= -123.7438626 -68.48344407 -61.21661827 + X128_Y128= -88.38859392 -100.2606815 -76.71539746 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -80.49980273 -126.9168975 -34.08640341 + X128_Y1= -34.30587053 -144.1146766 -42.47431259 + X1_Y128= -80.49980273 -104.9983574 -79.02611412 + X128_Y128= -34.30587053 -122.1961365 -87.4140233 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -25.00039804 -145.7783426 -43.2857359 + X128_Y1= 24.99960196 -145.7784618 -43.28579407 + X1_Y128= -25.00039804 -123.8598025 -88.22544662 + X128_Y128= 24.99960196 -123.8599217 -88.22550478 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 34.30508427 -144.1148403 -42.4743924 + X128_Y1= 80.49911802 -126.9172815 -34.08659069 + X1_Y128= 34.30508427 -122.1963001 -87.41410312 + X128_Y128= 80.49911802 -104.9987413 -79.02630141 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 88.38793719 -122.1796432 -31.77589238 + X128_Y1= 123.7433935 -90.40257445 -16.27719544 + X1_Y128= 88.38793719 -100.2611031 -76.7156031 + X128_Y128= 123.7433935 -68.48403434 -61.21690616 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 129.0145503 -83.31218085 -12.81898279 + X128_Y1= 148.1488905 -41.79336467 7.431077204 + X1_Y128= 129.0145503 -61.39364074 -57.7586935 + X128_Y128= 148.1488905 -19.87482456 -37.50863351 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 149.9999005 -33.42966205 11.51032357 + X128_Y1= 150.0000995 11.51004867 33.42886368 + X1_Y128= 149.9999005 -11.51112193 -33.42938715 + X128_Y128= 150.0000995 33.42858878 -11.51084703 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 148.1491636 19.87376454 37.50811651 + X128_Y1= 129.0151912 61.39271763 57.75824327 + X1_Y128= 148.1491636 41.79230465 -7.43159421 + X128_Y128= 129.0151912 83.31125774 12.81853255 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 123.7440972 68.48314894 61.21647432 + X128_Y1= 88.38892229 100.2604707 76.71529465 + X1_Y128= 123.7440972 90.40168905 16.27676361 + X128_Y128= 88.38892229 122.1790108 31.77558393 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 80.50014508 104.9981654 79.02602048 + X128_Y1= 34.30626365 122.1960547 87.4139834 + X1_Y128= 80.50014508 126.9167055 34.08630976 + X128_Y128= 34.30626365 144.1145948 42.47427268 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 25.00079608 123.8597428 88.22541754 + X128_Y1= -24.99920392 123.8599813 88.22553386 + X1_Y128= 25.00079608 145.778283 43.28570682 + X128_Y128= -24.99920392 145.7785215 43.28582315 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -34.30469115 122.196382 87.41414302 + X128_Y1= -80.49877567 104.9989333 79.02639505 + X1_Y128= -34.30469115 144.1149221 42.47443231 + X128_Y128= -80.49877567 126.9174735 34.08668433 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -73.54954822 62.59457836 120.0932251 + X128_Y1= -108.9049107 30.81742525 104.594487 + X1_Y128= -87.07943091 95.00526816 84.50545388 + X128_Y128= -122.4347934 63.22811504 69.00671581 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -118.1482559 16.42781008 97.57620961 + X128_Y1= -131.0892616 -26.98060427 76.40453192 + X1_Y128= -136.6304262 41.12900608 58.22827068 + X128_Y128= -149.5714318 -2.279408262 37.05659298 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -131.0892861 -43.59630914 68.30051905 + X128_Y1= -118.1484086 -87.00475435 47.1288263 + X1_Y128= -149.5714695 -27.79727431 24.61071023 + X128_Y128= -136.630592 -71.20571952 3.439017474 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -108.9051059 -101.3943916 40.11053812 + X128_Y1= -73.54983721 -133.171629 24.61175893 + X1_Y128= -122.4350245 -93.30486234 -7.339444172 + X128_Y128= -87.0797558 -125.0820998 -22.83822337 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -57.5399387 -141.4795132 20.55973698 + X128_Y1= -9.243678868 -153.1108719 14.88674986 + X1_Y128= -62.49226772 -137.8410817 -29.06118858 + X128_Y128= -14.19600789 -149.4724403 -34.7341757 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 9.242983154 -153.1109159 14.88672835 + X128_Y1= 57.53931167 -141.4797877 20.55960311 + X1_Y128= 14.19521408 -149.472508 -34.73420872 + X128_Y128= 62.4915426 -137.8413798 -29.06133396 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 73.54925923 -133.1719798 24.61158781 + X128_Y1= 108.9047156 -101.394911 40.11028475 + X1_Y128= 87.07910602 -125.0825151 -22.83842596 + X128_Y128= 122.4345624 -93.30544636 -7.339729018 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 118.1481032 -87.00531792 47.12855143 + X128_Y1= 131.089237 -43.59693444 68.30021407 + X1_Y128= 136.6302603 -71.20637125 3.438699602 + X128_Y128= 149.5713941 -27.79798777 24.61036225 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 131.0893106 -26.98122957 76.40422694 + X128_Y1= 118.1485613 16.4272465 97.57593474 + X1_Y128= 149.5715072 -2.280121727 37.056245 + X128_Y128= 136.6307578 41.12835435 58.22795281 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 108.9053011 30.81690576 104.5942337 + X128_Y1= 73.5501262 62.59422752 120.093054 + X1_Y128= 122.4352556 63.22753102 69.00643096 + X128_Y128= 87.08008069 95.00485278 84.50525128 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 57.54025222 70.90214996 124.1450946 + X128_Y1= 9.244026725 82.53362375 129.8181379 + X1_Y128= 62.49263028 107.7638933 90.7282451 + X128_Y128= 14.19640479 119.3953671 96.4012884 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -9.242635297 82.53371193 129.8181809 + X128_Y1= -57.53899815 70.90269889 124.1453623 + X1_Y128= -14.19481718 119.3955025 96.40135445 + X128_Y128= -62.49118004 107.7644895 90.72853587 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -44.82233533 17.81771087 146.3676448 + X128_Y1= -80.17769784 -13.95944224 130.8689067 + X1_Y128= -69.82230216 55.78632486 125.5497196 + X128_Y128= -105.1776647 24.00917175 110.0509815 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -88.38839657 -31.77563275 122.1793784 + X128_Y1= -88.38846291 -76.71534347 100.2608383 + X1_Y128= -123.7437122 -16.27683196 90.40220373 + X128_Y128= -123.7437785 -61.21654268 68.48366361 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -80.17781678 -94.53155357 91.57130051 + X128_Y1= -44.82254809 -126.308791 76.07252131 + X1_Y128= -105.17785 -101.5025907 48.83486426 + X128_Y128= -69.82258126 -133.2798281 33.33608506 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -25.00023455 -133.6885432 72.47317919 + X128_Y1= 24.99976545 -133.6886624 72.47312103 + X1_Y128= -25.00032837 -149.9669376 25.19724585 + X128_Y128= 24.99967163 -149.9670569 25.19718769 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 44.82212257 -126.3090048 76.07241703 + X128_Y1= 80.1775789 -94.53193602 91.57111397 + X1_Y128= 69.82202306 -133.2801612 33.33592262 + X128_Y128= 105.1774794 -101.5030924 48.83461956 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 88.38833023 -76.71576509 100.2606327 + X128_Y1= 88.38852925 -31.77605437 122.1791728 + X1_Y128= 123.7436458 -61.21713294 68.48337572 + X128_Y128= 123.7438449 -16.27742223 90.40191584 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 80.17793572 -13.95982469 130.8687202 + X128_Y1= 44.82276085 17.81749707 146.3675405 + X1_Y128= 105.1780352 24.00867005 110.0507368 + X128_Y128= 69.82286035 55.7859918 125.5495571 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 25.00046909 25.1972965 149.9669057 + X128_Y1= -24.99953091 25.197535 149.967022 + X1_Y128= 25.00065673 72.47320824 133.6884485 + X128_Y128= -24.99934327 72.47344674 133.6885648 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -6.580077344 -27.25284933 151.5387237 + X128_Y1= -41.93543986 -59.03000244 136.0399856 + X1_Y128= -39.24411633 10.49332119 148.6599796 + X128_Y128= -74.59947885 -21.28383192 133.1612416 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -41.93545732 -70.85827334 130.2709581 + X128_Y1= -6.580188623 -102.6355108 114.7721789 + X1_Y128= -74.59958298 -91.82860133 98.75429204 + X128_Y128= -39.24431429 -123.6058388 83.25551285 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 6.579966064 -102.6355422 114.7721636 + X128_Y1= 41.9354224 -70.85847337 130.2708605 + X1_Y128= 39.24391838 -123.606026 83.25542154 + X128_Y128= 74.59937471 -91.82895717 98.75411848 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= 41.93547478 -59.03020248 136.0398881 + X128_Y1= 6.580299903 -27.25288072 151.5387084 + X1_Y128= 74.59968712 -21.28418776 133.161068 + X128_Y128= 39.24451225 10.493134 148.6598883 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Forward 4 +GPDSquare + X1_Y1= 35.35533906 -65.75564142 134.8191219 + X128_Y1= -2.34546E-05 -97.53279453 119.3203838 + X1_Y128= 2.34546E-05 -33.97844615 150.3178805 + X128_Y128= -35.35533906 -65.75559926 134.8191424 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 +GPDSquare + X1_Y1= -87.07943091 125.0823075 22.83832466 + X128_Y1= -122.4347934 93.30515435 7.339586595 + X1_Y128= -73.54954822 133.1718044 -24.61167337 + X128_Y128= -108.9049107 101.3946513 -40.11041144 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 +GPDSquare + X1_Y1= -14.19561099 149.4724741 34.73419221 + X128_Y1= -62.49190516 137.8412307 29.06126127 + X1_Y128= -9.243331011 153.1108939 -14.8867391 + X128_Y128= -57.53962519 141.4796505 -20.55967004 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 +GPDSquare + X1_Y1= 62.49190516 137.8412307 29.06126127 + X128_Y1= 14.19561099 149.4724741 34.73419221 + X1_Y128= 57.53962519 141.4796505 -20.55967004 + X128_Y128= 9.243331011 153.1108939 -14.8867391 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 +GPDSquare + X1_Y1= 122.4347934 93.30515435 7.339586595 + X128_Y1= 87.07943091 125.0823075 22.83832466 + X1_Y128= 108.9049107 101.3946513 -40.11041144 + X128_Y128= 73.54954822 133.1718044 -24.61167337 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 +GPDSquare + X1_Y1= 149.5714318 27.79763104 -24.61053624 + X128_Y1= 136.6304262 71.20604539 -3.438858538 + X1_Y128= 131.0892616 43.59662179 -68.30036656 + X128_Y128= 118.1482559 87.00503613 -47.12868887 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 +GPDSquare + X1_Y1= 136.630592 -41.12868022 -58.22811174 + X128_Y1= 149.5714695 2.279764995 -37.05641899 + X1_Y128= 118.1484086 -16.42752829 -97.57607218 + X128_Y128= 131.0892861 26.98091692 -76.40437943 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 +GPDSquare + X1_Y1= 87.0797558 -95.00506047 -84.50535258 + X128_Y1= 122.4350245 -63.22782303 -69.00657339 + X1_Y128= 73.54983721 -62.59440294 -120.0931396 + X128_Y128= 108.9051059 -30.81716551 -104.5943604 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 +GPDSquare + X1_Y1= 14.19600789 -119.395401 -96.40130491 + X128_Y1= 62.49226772 -107.7640424 -90.72831779 + X1_Y128= 9.243678868 -82.5336458 -129.8181486 + X128_Y128= 57.5399387 -70.90228719 -124.1451615 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 +GPDSquare + X1_Y1= -62.4915426 -107.7643404 -90.72846318 + X128_Y1= -14.19521408 -119.3954687 -96.40133794 + X1_Y128= -57.53931167 -70.90256166 -124.1452954 + X128_Y128= -9.242983154 -82.53368989 -129.8181701 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 +GPDSquare + X1_Y1= -122.4345624 -63.22840705 -69.00685823 + X128_Y1= -87.07910602 -95.00547584 -84.50555517 + X1_Y128= -108.9047156 -30.81768499 -104.5946137 + X128_Y128= -73.54925923 -62.59475378 -120.0933107 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 +GPDSquare + X1_Y1= -149.5713941 2.27905153 -37.05676697 + X128_Y1= -136.6302603 -41.12933195 -58.22842961 + X1_Y128= -131.089237 26.98029162 -76.40468441 + X128_Y128= -118.1481032 -16.42809187 -97.57634705 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 1 +GPDSquare + X1_Y1= -136.6307578 71.20539365 -3.43917641 + X128_Y1= -149.5715072 27.79691757 -24.61088422 + X1_Y128= -118.1485613 87.00447256 -47.12896374 + X128_Y128= -131.0893106 43.59599648 -68.30067154 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 2 +GPDSquare + X1_Y1= -69.82230216 133.2799946 -33.33600384 + X128_Y1= -105.1776647 101.5028415 -48.83474191 + X1_Y128= -44.82233533 126.3088979 -76.07246917 + X128_Y128= -80.17769784 94.53174479 -91.57120724 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 2 +GPDSquare + X1_Y1= 25 149.9669973 -25.19721677 + X128_Y1= -25 149.9669973 -25.19721677 + X1_Y128= 25 133.6886028 -72.47315011 + X128_Y128= -25 133.6886028 -72.47315011 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 2 +GPDSquare + X1_Y1= 105.1776647 101.5028415 -48.83474191 + X128_Y1= 69.82230216 133.2799946 -33.33600384 + X1_Y128= 80.17769784 94.53174479 -91.57120724 + X128_Y128= 44.82233533 126.3088979 -76.07246917 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 2 +GPDSquare + X1_Y1= 123.7437785 16.27712709 -90.40205978 + X128_Y1= 123.7437122 61.21683781 -68.48351967 + X1_Y128= 88.38846291 31.77584356 -122.1792756 + X128_Y128= 88.38839657 76.71555428 -100.2607355 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 2 +GPDSquare + X1_Y1= 69.82258126 -55.78615833 -125.5496383 + X128_Y1= 105.17785 -24.0089209 -110.0508591 + X1_Y128= 44.82254809 -17.81760397 -146.3675926 + X128_Y128= 80.17781678 13.95963346 -130.8688134 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 2 +GPDSquare + X1_Y1= -24.99967163 -72.47338711 -133.6885357 + X128_Y1= 25.00032837 -72.47326786 -133.6884775 + X1_Y128= -24.99976545 -25.19747537 -149.9669929 + X128_Y128= 25.00023455 -25.19735612 -149.9669347 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 2 +GPDSquare + X1_Y1= -105.1774794 -24.0094226 -110.0511038 + X128_Y1= -69.82202306 -55.78649139 -125.5498008 + X1_Y128= -80.1775789 13.95925101 -130.869 + X128_Y128= -44.82212257 -17.81781778 -146.3676969 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 2 +GPDSquare + X1_Y1= -123.7438449 61.21624754 -68.48380756 + X128_Y1= -123.7436458 16.27653683 -90.40234767 + X1_Y128= -88.38852925 76.71513266 -100.2609411 + X128_Y128= -88.38833023 31.77542194 -122.1794813 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 3 +GPDSquare + X1_Y1= -39.24411633 123.6059324 -83.25546719 + X128_Y1= -74.59947885 91.82877925 -98.75420526 + X1_Y128= -6.580077344 102.6355265 -114.7721712 + X128_Y128= -41.93543986 70.85837335 -130.2709093 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 3 +GPDSquare + X1_Y1= -74.59958298 21.28400984 -133.1611548 + X128_Y1= -39.24431429 -10.4932276 -148.659934 + X1_Y128= -41.93545732 59.03010246 -136.0399369 + X128_Y128= -6.580188623 27.25286503 -151.5387161 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 3 +GPDSquare + X1_Y1= 39.24391838 -10.49341479 -148.6600253 + X128_Y1= 74.59937471 21.283654 -133.1613283 + X1_Y128= 6.579966064 27.25283364 -151.5387314 + X128_Y128= 41.9354224 59.02990243 -136.0400344 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 // Backward 3 +GPDSquare + X1_Y1= 74.59968712 91.82842341 -98.75437882 + X128_Y1= 39.24451225 123.6057452 -83.2555585 + X1_Y128= 41.93547478 70.85817332 -130.2710069 + X128_Y128= 6.580299903 102.6354951 -114.7721865 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% / Backward 4 +GPDSquare + X1_Y1= 2.34546E-05 97.53279453 -119.3203838 + X128_Y1= -35.35533906 65.75564142 -134.8191219 + X1_Y128= 35.35533906 65.75559926 -134.8191424 + X128_Y128= -2.34546E-05 33.97844615 -150.3178805 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Projects/Gaspard/DetectorConfiguration/gaspardV1_r150asy_1.detector b/Projects/Gaspard/DetectorConfiguration/gaspardV1_r150asy_1.detector new file mode 100644 index 0000000000000000000000000000000000000000..2d61fa3469b2fc45b459eff626243c14a4c2c479 --- /dev/null +++ b/Projects/Gaspard/DetectorConfiguration/gaspardV1_r150asy_1.detector @@ -0,0 +1,670 @@ +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and distance given in mm +%%Angle given in degree +%% using the data from the experimental mesurement +%% special care is given for the X Y direction +%% NOTATTION USED IN THE FOLLOWING: +%% +%% X1_Y1 --> X:1 Y:1 +%% X128_Y1 --> X:128 Y:1 +%% X1_Y128 --> X:1 Y:128 +%% X128_Y128 --> X:128 Y:128 +%%Option: 0,1 for Si SiLi and CSI +%%Option: all or sensible for VISualisation +% 1.2 12.371134021 +% 2 20.618556701 +% 30 309.278350515 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Target + THICKNESS= 0.001 + RADIUS= 7.5 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GaspardTracker +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 // central ring +GPDSquare + X1_Y1= -88.38826556 104.7572512 70.45163477 + X128_Y1= -123.7436281 72.09319422 56.92175207 + X1_Y128= -88.38826556 123.8914075 24.25765179 + X128_Y128= -123.7436281 91.22735051 10.7277691 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GPDSquare + X1_Y1= -129.014764 64.80489403 53.90284212 + X128_Y1= -148.1489815 22.12723623 36.22519404 + X1_Y128= -129.014764 83.93905033 7.70885915 + X128_Y128= -148.1489815 41.26139253 -9.968788937 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -149.9999668 13.53009721 32.6641458 + X128_Y1= -150.0000332 -32.66388576 13.5299895 + X1_Y128= -149.9999668 32.6642535 -13.52983718 + X128_Y128= -150.0000332 -13.52972947 -32.66399347 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -148.1490726 -41.26102933 9.96893938 + X128_Y1= -129.0149776 -83.93873404 -7.708728138 + X1_Y128= -148.1490726 -22.12687303 -36.22504359 + X128_Y128= -129.0149776 -64.80457774 -53.90271111 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -123.7438626 -91.22704714 -10.72764344 + X128_Y1= -88.38859392 -123.8911908 -24.25756204 + X1_Y128= -123.7438626 -72.09289085 -56.92162641 + X128_Y128= -88.38859392 -104.7570345 -70.45154501 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -80.49980273 -128.7610957 -26.2747408 + X128_Y1= -34.30587053 -146.4388667 -33.59710646 + X1_Y128= -80.49980273 -109.6269394 -72.46872378 + X128_Y128= -34.30587053 -127.3047104 -79.79108943 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -25.00039804 -148.1489658 -34.30545201 + X128_Y1= 24.99960196 -148.1490884 -34.30550279 + X1_Y128= -25.00039804 -129.0148095 -80.49943499 + X128_Y128= 24.99960196 -129.0149321 -80.49948576 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 34.30508427 -146.4390349 -33.59717613 + X128_Y1= 80.49911802 -128.7614904 -26.2749043 + X1_Y128= 34.30508427 -127.3048786 -79.7911591 + X128_Y128= 80.49911802 -109.6273341 -72.46888727 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 88.38793719 -123.8916241 -24.25774155 + X128_Y1= 123.7433935 -91.22765388 -10.72789476 + X1_Y128= 88.38793719 -104.7574679 -70.45172452 + X128_Y128= 123.7433935 -72.09349759 -56.92187773 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 129.0145503 -83.93936662 -7.708990163 + X128_Y1= 148.1488905 -41.26175573 9.968638494 + X1_Y128= 129.0145503 -64.80521033 -53.90297313 + X128_Y128= 148.1488905 -22.12759943 -36.22534448 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 149.9999005 -32.66462124 13.52968485 + X128_Y1= 150.0000995 13.52936173 32.66384115 + X1_Y128= 149.9999005 -13.53046495 -32.66429812 + X128_Y128= 150.0000995 32.66351802 -13.53014182 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 148.1491636 22.12650983 36.22489315 + X128_Y1= 129.0151912 64.80426145 53.9025801 + X1_Y128= 148.1491636 41.26066612 -9.969089823 + X128_Y128= 129.0151912 83.93841774 7.708597125 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 123.7440972 72.09258748 56.92150075 + X128_Y1= 88.38892229 104.7568178 70.45145525 + X1_Y128= 123.7440972 91.22674377 10.72751778 + X128_Y128= 88.38892229 123.8909741 24.25747228 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 80.50014508 109.626742 72.46864203 + X128_Y1= 34.30626365 127.3046263 79.79105459 + X1_Y128= 80.50014508 128.7608983 26.27465906 + X128_Y128= 34.30626365 146.4387826 33.59707162 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 25.00079608 129.0147482 80.4994096 + X128_Y1= -24.99920392 129.0149933 80.49951115 + X1_Y128= 25.00079608 148.1489045 34.30542663 + X128_Y128= -24.99920392 148.1491496 34.30552817 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -34.30469115 127.3049627 79.79119394 + X128_Y1= -80.49877567 109.6275314 72.46896901 + X1_Y128= -34.30469115 146.439119 33.59721096 + X128_Y128= -80.49877567 128.7616877 26.27498604 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -73.54954822 69.80933687 116.047923 + X128_Y1= -108.9049107 37.14527993 102.5180404 + X1_Y128= -87.07943091 99.98699467 78.54790646 + X128_Y128= -122.4347934 67.32293773 65.01802377 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -118.1482559 22.35404902 96.39131766 + X128_Y1= -131.0892616 -22.26589893 77.9091474 + X1_Y128= -136.6304262 44.60704021 55.60879976 + X128_Y128= -149.5714318 -0.01290774 37.12662951 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -131.0892861 -39.34534995 70.83461379 + X128_Y1= -118.1484086 -83.96532963 52.35243039 + X1_Y128= -149.5714695 -26.24298023 26.26178794 + X128_Y128= -136.630592 -70.86295991 7.77960454 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -108.9051059 -98.75658319 46.22569831 + X128_Y1= -73.54983721 -131.4207268 32.69577971 + X1_Y128= -122.4350245 -93.57889222 -1.62963388 + X128_Y128= -87.0797558 -126.2430358 -15.15955248 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -57.5399387 -139.960485 29.15849936 + X128_Y1= -9.243678868 -151.9164761 24.20617034 + X1_Y128= -62.49226772 -139.3581223 -20.59199407 + X128_Y128= -14.19600789 -151.3141134 -25.54432309 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 9.242983154 -151.9165214 24.20615157 + X128_Y1= 57.53931167 -139.9607672 29.1583825 + X1_Y128= 14.19521408 -151.314183 -25.54435192 + X128_Y128= 62.4915426 -139.3584287 -20.59212099 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 73.54925923 -131.4210874 32.69563034 + X128_Y1= 108.9047156 -98.75711718 46.22547713 + X1_Y128= 87.07910602 -126.2434628 -15.15972933 + X128_Y128= 122.4345624 -93.57949254 -1.629882541 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 118.1481032 -83.96590893 52.35219044 + X128_Y1= 131.089237 -39.3459927 70.83434755 + X1_Y128= 136.6302603 -70.86362983 7.779327048 + X128_Y128= 149.5713941 -26.2437136 26.26148416 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 131.0893106 -22.26654169 77.90888116 + X128_Y1= 118.1485613 22.35346971 96.3910777 + X1_Y128= 149.5715072 -0.013641119 37.12632573 + X128_Y128= 136.6307578 44.60637029 55.60852227 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 108.9053011 37.14474594 102.5178192 + X128_Y1= 73.5501262 69.80897624 116.0477737 + X1_Y128= 122.4352556 67.3223374 65.01777511 + X128_Y128= 87.08008069 99.9865677 78.5477296 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 57.54025222 78.3487737 119.5850703 + X128_Y1= 9.244026725 90.3048832 124.5374483 + X1_Y128= 62.49263028 113.1017145 83.98019617 + X128_Y128= 14.19640479 125.057824 88.93257423 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -9.242635297 90.30497385 124.5374859 + X128_Y1= -57.53899815 78.34933796 119.585304 + X1_Y128= -14.19481718 125.0579632 88.93263189 + X128_Y128= -62.49118004 113.1023273 83.98045 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -44.82233533 26.72000072 145.0068958 + X128_Y1= -80.17769784 -5.944056222 131.4770131 + X1_Y128= -69.82230216 63.34689285 121.9098736 + X128_Y128= -105.1776647 30.68283591 108.3799909 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -88.38839657 -24.25749857 123.891344 + X128_Y1= -88.38846291 -70.45148154 104.7571877 + X1_Y128= -123.7437122 -10.72755459 91.22726166 + X128_Y128= -123.7437785 -56.92153756 72.09310536 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -80.17781678 -88.76494402 97.17151028 + X128_Y1= -44.82254809 -121.4290876 83.64159168 + X1_Y128= -105.17785 -98.33197357 54.94035724 + X128_Y128= -69.82258126 -130.9961172 41.41043864 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -25.00023455 -129.0148095 80.49948576 + X128_Y1= 24.99976545 -129.0149321 80.49943499 + X1_Y128= -25.00032837 -148.1489658 34.30550279 + X128_Y128= 24.99967163 -148.1490884 34.30545201 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 44.82212257 -121.4293074 83.64150065 + X128_Y1= 80.1775789 -88.76533715 97.17134744 + X1_Y128= 69.82202306 -130.9964595 41.41029683 + X128_Y128= 105.1774794 -98.33248928 54.94014362 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 88.38833023 -70.45191493 104.7570082 + X128_Y1= 88.38852925 -24.25793196 123.8911645 + X1_Y128= 123.7436458 -56.9221443 72.09285404 + X128_Y128= 123.7438449 -10.72816133 91.22701034 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 80.17793572 -5.94444935 131.4768502 + X128_Y1= 44.82276085 26.71978094 145.0068047 + X1_Y128= 105.1780352 30.6823202 108.3797773 + X128_Y128= 69.82286035 63.3465505 121.9097318 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 25.00046909 34.30555138 148.1489308 + X128_Y1= -24.99953091 34.30579654 148.1490323 + X1_Y128= 25.00065673 80.49950897 129.0147132 + X128_Y128= -24.99934327 80.49975413 129.0148147 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -6.580077344 -17.9508074 152.9198192 + X128_Y1= -41.93543986 -50.61486434 139.3899365 + X1_Y128= -39.24411633 19.54921605 147.7420979 + X128_Y128= -74.59947885 -13.11484089 134.2122152 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -41.93545732 -62.77326357 134.3537673 + X128_Y1= -6.580188623 -95.43740719 120.8238487 + X1_Y128= -74.59958298 -85.62852255 104.176093 + X128_Y128= -39.24431429 -118.2926662 90.64617436 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 6.579966064 -95.43743945 120.8238354 + X128_Y1= 41.9354224 -62.77346919 134.3536822 + X1_Y128= 39.24391838 -118.2928586 90.64609466 + X128_Y128= 74.59937471 -85.62888833 104.1759414 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 41.93547478 -50.61506996 139.3898513 + X128_Y1= 6.580299903 -17.95083966 152.9198058 + X1_Y128= 74.59968712 -13.11520666 134.2120637 + X128_Y128= 39.24451225 19.54902363 147.7420182 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -87.07943091 126.2432493 15.1596409 + X128_Y1= -122.4347934 93.57919238 1.629758211 + X1_Y128= -73.54954822 131.4209071 -32.69570502 + X128_Y128= -108.9049107 98.75685019 -46.22558772 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -14.19561099 151.3141482 25.5443375 + X128_Y1= -62.49190516 139.3582755 20.59205753 + X1_Y128= -9.243331011 151.9164988 -24.20616096 + X128_Y128= -57.53962519 139.9606261 -29.15844093 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 62.49190516 139.3582755 20.59205753 + X128_Y1= 14.19561099 151.3141482 25.5443375 + X1_Y128= 57.53962519 139.9606261 -29.15844093 + X128_Y128= 9.243331011 151.9164988 -24.20616096 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 122.4347934 93.57919238 1.629758211 + X128_Y1= 87.07943091 126.2432493 15.1596409 + X1_Y128= 108.9049107 98.75685019 -46.22558772 + X128_Y128= 73.54954822 131.4209071 -32.69570502 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 149.5714318 26.24334692 -26.26163605 + X128_Y1= 136.6304262 70.86329487 -7.779465794 + X1_Y128= 131.0892616 39.34567133 -70.83448067 + X128_Y128= 118.1482559 83.96561928 -52.35231042 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 136.630592 -44.60670525 -55.60866102 + X128_Y1= 149.5714695 0.01327443 -37.12647762 + X1_Y128= 118.1484086 -22.35375937 -96.39119768 + X128_Y128= 131.0892861 22.26622031 -77.90901428 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 87.0797558 -99.98678118 -78.54781803 + X128_Y1= 122.4350245 -67.32263757 -65.01789944 + X1_Y128= 73.54983721 -69.80915655 -116.0478484 + X128_Y128= 108.9051059 -37.14501293 -102.5179298 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 14.19600789 -125.0578588 -88.93258864 + X128_Y1= 62.49226772 -113.1018677 -83.98025963 + X1_Y128= 9.243678868 -90.30490586 -124.5374577 + X128_Y128= 57.5399387 -78.34891477 -119.5851287 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -62.4915426 -113.1021741 -83.98038655 + X128_Y1= -14.19521408 -125.0579284 -88.93261748 + X1_Y128= -57.53931167 -78.34919689 -119.5852456 + X128_Y128= -9.242983154 -90.30495119 -124.5374765 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -122.4345624 -67.32323789 -65.0181481 + X128_Y1= -87.07910602 -99.98720815 -78.54799489 + X1_Y128= -108.9047156 -37.14554692 -102.5181509 + X128_Y128= -73.54925923 -69.80951718 -116.0479977 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -149.5713941 0.012541052 -37.1267814 + X128_Y1= -136.6302603 -44.60737518 -55.60893851 + X1_Y128= -131.089237 22.26557756 -77.90928052 + X128_Y128= -118.1481032 -22.35433867 -96.39143763 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -136.6307578 70.86262494 -7.779743286 + X128_Y1= -149.5715072 26.24261354 -26.26193982 + X1_Y128= -118.1485613 83.96503997 -52.35255037 + X128_Y128= -131.0893106 39.34502857 -70.83474691 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -69.82230216 130.9962884 -41.41036774 + X128_Y1= -105.1776647 98.33223142 -54.94025043 + X1_Y128= -44.82233533 121.4291975 -83.64154616 + X128_Y128= -80.17769784 88.76514058 -97.17142886 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 25 148.1490271 -34.3054774 + X128_Y1= -25 148.1490271 -34.3054774 + X1_Y128= 25 129.0148708 -80.49946037 + X128_Y128= -25 129.0148708 -80.49946037 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 105.1776647 98.33223142 -54.94025043 + X128_Y1= 69.82230216 130.9962884 -41.41036774 + X1_Y128= 80.17769784 88.76514058 -97.17142886 + X128_Y128= 44.82233533 121.4291975 -83.64154616 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 123.7437785 10.72785796 -91.227136 + X128_Y1= 123.7437122 56.92184093 -72.0929797 + X1_Y128= 88.38846291 24.25771526 -123.8912542 + X128_Y128= 88.38839657 70.45169823 -104.7570979 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 69.82258126 -63.34672167 -121.9098027 + X128_Y1= 105.17785 -30.68257806 -108.3798841 + X1_Y128= 44.82254809 -26.71989083 -145.0068502 + X128_Y128= 80.17781678 5.944252786 -131.4769316 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -24.99967163 -80.49969284 -129.0147893 + X128_Y1= 25.00032837 -80.49957026 -129.0147386 + X1_Y128= -24.99976545 -34.30573525 -148.1490069 + X128_Y128= 25.00023455 -34.30561267 -148.1489562 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -105.1774794 -30.68309376 -108.3800977 + X128_Y1= -69.82202306 -63.34706402 -121.9099445 + X1_Y128= -80.1775789 5.943859659 -131.4770945 + X128_Y128= -44.82212257 -26.7201106 -145.0069413 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -123.7438449 56.92123419 -72.09323102 + X128_Y1= -123.7436458 10.72725122 -91.22738732 + X1_Y128= -88.38852925 70.45126485 -104.7572774 + X128_Y128= -88.38833023 24.25728188 -123.8914337 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -39.24411633 118.2927624 -90.64613451 + X128_Y1= -74.59947885 85.62870544 -104.1760172 + X1_Y128= -6.580077344 95.43742332 -120.8238421 + X128_Y128= -41.93543986 62.77336638 -134.3537248 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= -74.59958298 13.11502377 -134.2121394 + X128_Y1= -39.24431429 -19.54911984 -147.742058 + X1_Y128= -41.93545732 50.61496715 -139.3898939 + X128_Y128= -6.580188623 17.95082353 -152.9198125 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 39.24391838 -19.54931227 -147.7421377 + X128_Y1= 74.59937471 13.114658 -134.2122909 + X1_Y128= 6.579966064 17.95079127 -152.9198259 + X128_Y128= 41.9354224 50.61476153 -139.3899791 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDSquare + X1_Y1= 74.59968712 85.62833966 -104.1761687 + X128_Y1= 39.24451225 118.29257 -90.64621421 + X1_Y128= 41.93547478 62.77316076 -134.3538099 + X128_Y128= 6.580299903 95.43739106 -120.8238554 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 diff --git a/Inputs/DetectorConfiguration/gaspardV2Annular.detector b/Projects/Gaspard/DetectorConfiguration/gaspardV2Annular.detector similarity index 60% rename from Inputs/DetectorConfiguration/gaspardV2Annular.detector rename to Projects/Gaspard/DetectorConfiguration/gaspardV2Annular.detector index 39b7bf71ff41a427023469c2b292020dc9336153..63b6c8350a644411c8931ba7441c1cd2801c3494 100644 --- a/Inputs/DetectorConfiguration/gaspardV2Annular.detector +++ b/Projects/Gaspard/DetectorConfiguration/gaspardV2Annular.detector @@ -5,10 +5,10 @@ %% special care is given for the X Y direction %% NOTATTION USED IN THE FOLLOWING: %% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 +%% X1_Y1 --> X:1 Y:1 +%% X128_Y1 --> X:128 Y:1 +%% X1_Y128 --> X:1 Y:128 +%% X128_Y128 --> X:128 Y:128 %%Option: 0,1 for Si SiLi and CSI %%Option: all or sensible for VISualisation % 1.2 12.371134021 @@ -19,30 +19,30 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Target - THICKNESS= 0.001 - RADIUS= 7.5 - MATERIAL= CD2 - NBLAYERS= 0 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + THICKNESS= 0.001 + RADIUS= 7.5 + MATERIAL= CD2 + NBLAYERS= 0 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% GaspardTracker %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Annular Back GPDAnnular - Z= -156.5 - RMIN= 16 - RMAX= 52 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all + Z= -156.5 + RMIN= 16 + RMAX= 52 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Annular Front %GPDAnnular - Z= 156.5 - RMIN= 16 - RMAX= 52 - FIRSTSTAGE= 1 - SECONDSTAGE= 0 - THIRDSTAGE= 1 - VIS= all + Z= 156.5 + RMIN= 16 + RMAX= 52 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all diff --git a/Projects/Gaspard/DetectorConfiguration/gaspardV2BarrelBack.detector b/Projects/Gaspard/DetectorConfiguration/gaspardV2BarrelBack.detector new file mode 100644 index 0000000000000000000000000000000000000000..ed090907288391dfef4f76ccc470d898ee308563 --- /dev/null +++ b/Projects/Gaspard/DetectorConfiguration/gaspardV2BarrelBack.detector @@ -0,0 +1,109 @@ +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and distance given in mm +%%Angle given in degree +%% using the data from the experimental mesurement +%% special care is given for the X Y direction +%% NOTATTION USED IN THE FOLLOWING: +%% +%% X1_Y1 --> X:1 Y:1 +%% X128_Y1 --> X:128 Y:1 +%% X1_Y128 --> X:1 Y:128 +%% X128_Y128 --> X:128 Y:128 +%%Option: 0,1 for Si SiLi and CSI +%%Option: all or sensible for VISualisation +% 1.2 12.371134021 +% 2 20.618556701 +% 30 309.278350515 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Target + THICKNESS= 0.001 + RADIUS= 7.5 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GaspardTracker +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Barrel Back +GPDTrapezoid + X1_Y1= 118.21 33.46 4.45 + X128_Y1= 127.60 10.79 -76.57 + X1_Y128= 97.86 82.61 -76.57 + X128_Y128= 107.27 59.89 4.45 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDTrapezoid + X1_Y1= 59.93 107.25 4.45 + X128_Y1= 82.60 97.86 -76.57 + X1_Y128= 10.79 127.61 -76.57 + X128_Y128= 33.50 118.20 4.45 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +GPDTrapezoid + X1_Y1= -33.46 118.21 4.45 + X128_Y1= -10.79 127.60 -76.57 + X1_Y128= -82.61 97.86 -76.57 + X128_Y128= -59.89 107.27 4.45 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +GPDTrapezoid + X1_Y1= -107.25 59.93 4.45 + X128_Y1= -97.86 82.60 -76.57 + X1_Y128= -127.61 10.79 -76.57 + X128_Y128= -118.20 33.50 4.45 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +GPDTrapezoid + X1_Y1= -118.21 -33.43 4.45 + X128_Y1= -127.60 -10.79 -76.57 + X1_Y128= -97.86 -82.61 -76.57 + X128_Y128= -107.27 -59.89 4.45 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +GPDTrapezoid + X1_Y1= -59.93 -107.25 4.45 + X128_Y1= -82.60 -97.86 -76.57 + X1_Y128= -10.79 -127.61 -76.57 + X128_Y128= -33.50 -118.20 4.45 + FIRSTSTAGE= 0 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +GPDTrapezoid + X1_Y1= 33.46 -118.21 4.45 + X128_Y1= 10.79 -127.60 -76.57 + X1_Y128= 82.61 -97.86 -76.57 + X128_Y128= 59.89 -107.27 4.45 + FIRSTSTAGE= 0 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 +GPDTrapezoid + X1_Y1= 107.25 -59.93 4.45 + X128_Y1= 97.86 -82.60 -76.57 + X1_Y128= 127.61 -10.79 -76.57 + X128_Y128= 118.20 -33.50 4.45 + FIRSTSTAGE= 0 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all diff --git a/Projects/Gaspard/DetectorConfiguration/gaspardV2BarrelFront.detector b/Projects/Gaspard/DetectorConfiguration/gaspardV2BarrelFront.detector new file mode 100644 index 0000000000000000000000000000000000000000..39f82d0553502d9baac372a3b62916ca4161f023 --- /dev/null +++ b/Projects/Gaspard/DetectorConfiguration/gaspardV2BarrelFront.detector @@ -0,0 +1,109 @@ +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and distance given in mm +%%Angle given in degree +%% using the data from the experimental mesurement +%% special care is given for the X Y direction +%% NOTATTION USED IN THE FOLLOWING: +%% +%% X1_Y1 --> X:1 Y:1 +%% X128_Y1 --> X:128 Y:1 +%% X1_Y128 --> X:1 Y:128 +%% X128_Y128 --> X:128 Y:128 +%%Option: 0,1 for Si SiLi and CSI +%%Option: all or sensible for VISualisation +% 1.2 12.371134021 +% 2 20.618556701 +% 30 309.278350515 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Target + THICKNESS= 0.001 + RADIUS= 7.5 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GaspardTracker +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Barrel Front +GPDTrapezoid + X1_Y1= 122.02 14.32 -4.45 + X128_Y1= 122.02 38.86 76.57 + X1_Y128= 122.02 -38.88 76.57 + X128_Y128= 122.02 -14.29 -4.45 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDTrapezoid + X1_Y1= 76.15 96.41 -4.45 + X128_Y1= 58.80 113.76 76.57 + X1_Y128= 113.77 58.79 76.57 + X128_Y128= 96.38 76.18 -4.45 + FIRSTSTAGE= 0 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +GPDTrapezoid + X1_Y1= -14.32 122.02 -4.45 + X128_Y1= -38.86 122.02 76.57 + X1_Y128= 38.88 122.02 76.57 + X128_Y128= 14.29 122.02 -4.45 + FIRSTSTAGE= 0 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +GPDTrapezoid + X1_Y1= -96.41 76.15 -4.45 + X128_Y1= -113.76 58.80 76.57 + X1_Y128= -58.79 113.77 76.57 + X128_Y128= -76.18 96.38 -4.45 + FIRSTSTAGE= 0 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +GPDTrapezoid + X1_Y1= -122.02 -14.32 -4.45 + X128_Y1= -122.02 -38.86 76.57 + X1_Y128= -122.02 38.88 76.57 + X128_Y128= -122.02 14.29 -4.45 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +GPDTrapezoid + X1_Y1= -76.15 -96.41 -4.45 + X128_Y1= -58.80 -113.76 76.57 + X1_Y128= -113.77 -58.79 76.57 + X128_Y128= -96.38 -76.18 -4.45 + FIRSTSTAGE= 0 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +GPDTrapezoid + X1_Y1= 14.32 -122.02 -4.45 + X128_Y1= 38.86 -122.02 76.57 + X1_Y128= -38.88 -122.02 76.57 + X128_Y128= -14.29 -122.02 -4.45 + FIRSTSTAGE= 0 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 +GPDTrapezoid + X1_Y1= 96.41 -76.15 -4.45 + X128_Y1= 113.76 -58.80 76.57 + X1_Y128= 58.79 -113.77 76.57 + X128_Y128= 76.18 -96.38 -4.45 + FIRSTSTAGE= 0 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all diff --git a/Projects/Gaspard/DetectorConfiguration/gaspardV2EndCapBack.detector b/Projects/Gaspard/DetectorConfiguration/gaspardV2EndCapBack.detector new file mode 100644 index 0000000000000000000000000000000000000000..0fe14167e350e778306d60458c5159ed8544c42c --- /dev/null +++ b/Projects/Gaspard/DetectorConfiguration/gaspardV2EndCapBack.detector @@ -0,0 +1,109 @@ +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and distance given in mm +%%Angle given in degree +%% using the data from the experimental mesurement +%% special care is given for the X Y direction +%% NOTATTION USED IN THE FOLLOWING: +%% +%% X1_Y1 --> X:1 Y:1 +%% X128_Y1 --> X:128 Y:1 +%% X1_Y128 --> X:1 Y:128 +%% X128_Y128 --> X:128 Y:128 +%%Option: 0,1 for Si SiLi and CSI +%%Option: all or sensible for VISualisation +% 1.2 12.371134021 +% 2 20.618556701 +% 30 309.278350515 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Target + THICKNESS= 0.001 + RADIUS= 7.5 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GaspardTracker +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 End-Cap Back +GPDTrapezoid + X1_Y1= 45.64 34.43 -146.50 + X128_Y1= 91.09 79.82 -91.36 + X1_Y128= 120.84 8.00 -91.36 + X128_Y128= 56.59 8.00 -146.50 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDTrapezoid + X1_Y1= 7.92 56.62 -146.50 + X128_Y1= 7.97 120.85 -91.36 + X1_Y128= 79.79 91.10 -91.36 + X128_Y128= 34.35 45.67 -146.50 + FIRSTSTAGE= 0 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +GPDTrapezoid + X1_Y1= -34.43 45.64 -146.50 + X128_Y1= -79.82 91.09 -91.36 + X1_Y128= -8.00 120.84 -91.36 + X128_Y128= -8.00 56.59 -146.50 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +GPDTrapezoid + X1_Y1= -56.62 7.92 -146.50 + X128_Y1= -120.85 7.97 -91.36 + X1_Y128= -91.09 79.79 -91.36 + X128_Y128= -45.67 34.35 -146.50 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +GPDTrapezoid + X1_Y1= -45.64 -34.43 -146.50 + X128_Y1= -91.09 -79.82 -91.36 + X1_Y128= -120.84 -8.00 -91.36 + X128_Y128= -56.59 -8.00 -146.50 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +GPDTrapezoid + X1_Y1= -7.92 -56.62 -146.50 + X128_Y1= -7.97 -120.85 -91.36 + X1_Y128= -79.79 -91.10 -91.36 + X128_Y128= -34.35 -45.67 -146.50 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +GPDTrapezoid + X1_Y1= 34.43 -45.64 -146.50 + X128_Y1= 79.82 -91.09 -91.36 + X1_Y128= 8.00 -120.84 -91.36 + X128_Y128= 8.00 -56.59 -146.50 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 +GPDTrapezoid + X1_Y1= 56.62 -7.92 -146.50 + X128_Y1= 120.85 -7.97 -91.36 + X1_Y128= 91.09 -79.79 -91.36 + X128_Y128= 45.67 -34.35 -146.50 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all diff --git a/Projects/Gaspard/DetectorConfiguration/gaspardV2EndCapFront.detector b/Projects/Gaspard/DetectorConfiguration/gaspardV2EndCapFront.detector new file mode 100644 index 0000000000000000000000000000000000000000..11b0bbf395f7734f9cd2b84e1949aec514a03093 --- /dev/null +++ b/Projects/Gaspard/DetectorConfiguration/gaspardV2EndCapFront.detector @@ -0,0 +1,109 @@ +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and distance given in mm +%%Angle given in degree +%% using the data from the experimental mesurement +%% special care is given for the X Y direction +%% NOTATTION USED IN THE FOLLOWING: +%% +%% X1_Y1 --> X:1 Y:1 +%% X128_Y1 --> X:128 Y:1 +%% X1_Y128 --> X:1 Y:128 +%% X128_Y128 --> X:128 Y:128 +%%Option: 0,1 for Si SiLi and CSI +%%Option: all or sensible for VISualisation +% 1.2 12.371134021 +% 2 20.618556701 +% 30 309.278350515 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Target + THICKNESS= 0.001 + RADIUS= 7.5 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GaspardTracker +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Barrel +GPDTrapezoid + X1_Y1= 55.34 -14.35 146.50 + X128_Y1= 114.70 -38.88 91.36 + X1_Y128= 114.70 38.85 91.36 + X128_Y128= 55.34 14.26 146.50 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GPDTrapezoid + X1_Y1= 49.27 28.99 146.50 + X128_Y1= 108.60 53.61 91.36 + X1_Y128= 53.63 108.58 91.36 + X128_Y128= 29.04 49.21 146.50 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +GPDTrapezoid + X1_Y1= 14.35 55.34 146.50 + X128_Y1= 38.88 114.70 91.36 + X1_Y128= -38.85 114.70 91.36 + X128_Y128= -14.26 55.34 146.50 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +GPDTrapezoid + X1_Y1= -28.99 49.27 146.50 + X128_Y1= -53.61 108.60 91.36 + X1_Y128= -108.58 53.63 91.36 + X128_Y128= -49.21 29.04 146.50 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +GPDTrapezoid + X1_Y1= -55.34 14.35 146.50 + X128_Y1= -114.70 38.88 91.36 + X1_Y128= -114.70 -38.85 91.36 + X128_Y128= -55.34 -14.26 146.50 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +GPDTrapezoid + X1_Y1= -49.27 -28.99 146.50 + X128_Y1= -108.60 -53.61 91.36 + X1_Y128= -53.63 -108.58 91.36 + X128_Y128= -29.04 -49.21 146.50 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +GPDTrapezoid + X1_Y1= -14.35 -55.34 146.50 + X128_Y1= -38.88 -114.70 91.36 + X1_Y128= 38.85 -114.70 91.36 + X128_Y128= 14.26 -55.34 146.50 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 +GPDTrapezoid + X1_Y1= 28.99 -49.27 146.50 + X128_Y1= 53.61 -108.60 91.36 + X1_Y128= 108.58 -53.63 91.36 + X128_Y128= 49.21 -29.04 146.50 + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 1 + VIS= all diff --git a/Inputs/DetectorConfiguration/gaspardV2full.detector b/Projects/Gaspard/DetectorConfiguration/gaspardV2full.detector similarity index 97% rename from Inputs/DetectorConfiguration/gaspardV2full.detector rename to Projects/Gaspard/DetectorConfiguration/gaspardV2full.detector index 1656e48399871612d8ca09c5e4eb57651778382d..41a678235593992307a30d718443272019581fab 100644 --- a/Inputs/DetectorConfiguration/gaspardV2full.detector +++ b/Projects/Gaspard/DetectorConfiguration/gaspardV2full.detector @@ -5,10 +5,10 @@ %% special care is given for the X Y direction %% NOTATTION USED IN THE FOLLOWING: %% -%% X1_Y1 --> X:1 Y:1 -%% X128_Y1 --> X:128 Y:1 -%% X1_Y128 --> X:1 Y:128 -%% X128_Y128 --> X:128 Y:128 +%% X1_Y1 --> X:1 Y:1 +%% X128_Y1 --> X:128 Y:1 +%% X1_Y128 --> X:1 Y:128 +%% X128_Y128 --> X:128 Y:128 %%Option: 0,1 for Si SiLi and CSI %%Option: all or sensible for VISualisation % 1.2 12.371134021 @@ -19,19 +19,19 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Target - THICKNESS= 0.001 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + THICKNESS= 0.001 + RADIUS= 7.5 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% GaspardTracker %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Annular Back GPDAnnular Z= -156.5 RMIN= 16 - RMAX= 52 + RMAX= 52 FIRSTSTAGE= 1 SECONDSTAGE= 0 THIRDSTAGE= 1 @@ -39,8 +39,8 @@ GPDAnnular %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Annular Front GPDAnnular Z= 156.5 - RMIN= 16 - RMAX= 52 + RMIN= 16 + RMAX= 52 FIRSTSTAGE= 1 SECONDSTAGE= 0 THIRDSTAGE= 1 diff --git a/Projects/Helios/DetectorConfiguration/helios.detector b/Projects/Helios/DetectorConfiguration/helios.detector new file mode 100644 index 0000000000000000000000000000000000000000..66e71f5fdc70f78aa41004c8e4a4d96e16ffa1fe --- /dev/null +++ b/Projects/Helios/DetectorConfiguration/helios.detector @@ -0,0 +1,426 @@ +%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%%%% +%% +%% Thickness in micrometer +%% Radius in mm +%% Position in mm +%% Magnetic field in tesla +%% +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%% +%% Position and distance given in mm +%% Angle given in degree +%% using the data from the experimental mesurement +%% special care is given for the X Y direction +%% NOTATTION USED IN THE FOLLOWING: +%% +%% X1_Y1 --> X:1 Y:1 +%% X128_Y1 --> X:128 Y:1 +%% X1_Y128 --> X:1 Y:128 +%% X128_Y128 --> X:128 Y:128 +%%Option: 0,1 for Si SiLi and CSI +%%Option: all or sensible for VISualisation +% 1.2 12.371134021 +% 2 20.618556701 +% 30 309.278350515 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Target + THICKNESS= 1. +% THICKNESS= 0.28 + RADIUS= 7.5 + MATERIAL= CD2 +% MATERIAL= Ti-t + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Helios + MField= 2. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +HeliosDummyShape + X1_Y1= 11.5 11.5 150. + X128_Y1= 11.5 -11.5 150. + X1_Y128= 11.5 11.5 206. + X128_Y128= 11.5 -11.5 206. + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +HeliosDummyShape + X1_Y1= -11.5 11.5 150. + X128_Y1= 11.5 11.5 150. + X1_Y128= -11.5 11.5 206. + X128_Y128= 11.5 11.5 206. + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +HeliosDummyShape + X1_Y1= -11.5 -11.5 150. + X128_Y1= -11.5 11.5 150. + X1_Y128= -11.5 -11.5 206. + X128_Y128= -11.5 11.5 206. + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +HeliosDummyShape + X1_Y1= 11.5 -11.5 150. + X128_Y1= -11.5 -11.5 150. + X1_Y128= 11.5 -11.5 206. + X128_Y128= -11.5 -11.5 206. + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +HeliosDummyShape + X1_Y1= 11.5 11.5 208.4 + X128_Y1= 11.5 -11.5 208.4 + X1_Y128= 11.5 11.5 264.4 + X128_Y128= 11.5 -11.5 264.4 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +HeliosDummyShape + X1_Y1= -11.5 11.5 208.4 + X128_Y1= 11.5 11.5 208.4 + X1_Y128= -11.5 11.5 264.4 + X128_Y128= 11.5 11.5 264.4 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +HeliosDummyShape + X1_Y1= -11.5 -11.5 208.4 + X128_Y1= -11.5 11.5 208.4 + X1_Y128= -11.5 -11.5 264.4 + X128_Y128= -11.5 11.5 264.4 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 +HeliosDummyShape + X1_Y1= 11.5 -11.5 208.4 + X128_Y1= -11.5 -11.5 208.4 + X1_Y128= 11.5 -11.5 264.4 + X128_Y128= -11.5 -11.5 264.4 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 +HeliosDummyShape + X1_Y1= 11.5 11.5 266.8 + X128_Y1= 11.5 -11.5 266.8 + X1_Y128= 11.5 11.5 322.8 + X128_Y128= 11.5 -11.5 322.8 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 +HeliosDummyShape + X1_Y1= -11.5 11.5 266.8 + X128_Y1= 11.5 11.5 266.8 + X1_Y128= -11.5 11.5 322.8 + X128_Y128= 11.5 11.5 322.8 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 +HeliosDummyShape + X1_Y1= -11.5 -11.5 266.8 + X128_Y1= -11.5 11.5 266.8 + X1_Y128= -11.5 -11.5 322.8 + X128_Y128= -11.5 11.5 322.8 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 +HeliosDummyShape + X1_Y1= 11.5 -11.5 266.8 + X128_Y1= -11.5 -11.5 266.8 + X1_Y128= 11.5 -11.5 322.8 + X128_Y128= -11.5 -11.5 322.8 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 +HeliosDummyShape + X1_Y1= 11.5 11.5 325.2 + X128_Y1= 11.5 -11.5 325.2 + X1_Y128= 11.5 11.5 381.2 + X128_Y128= 11.5 -11.5 381.2 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 +HeliosDummyShape + X1_Y1= -11.5 11.5 325.2 + X128_Y1= 11.5 11.5 325.2 + X1_Y128= -11.5 11.5 381.2 + X128_Y128= 11.5 11.5 381.2 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 +HeliosDummyShape + X1_Y1= -11.5 -11.5 325.2 + X128_Y1= -11.5 11.5 325.2 + X1_Y128= -11.5 -11.5 381.2 + X128_Y128= -11.5 11.5 381.2 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 +HeliosDummyShape + X1_Y1= 11.5 -11.5 325.2 + X128_Y1= -11.5 -11.5 325.2 + X1_Y128= 11.5 -11.5 381.2 + X128_Y128= -11.5 -11.5 381.2 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 +HeliosDummyShape + X1_Y1= 11.5 11.5 383.6 + X128_Y1= 11.5 -11.5 383.6 + X1_Y128= 11.5 11.5 439.6 + X128_Y128= 11.5 -11.5 439.6 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18 +HeliosDummyShape + X1_Y1= -11.5 11.5 383.6 + X128_Y1= 11.5 11.5 383.6 + X1_Y128= -11.5 11.5 439.6 + X128_Y128= 11.5 11.5 439.6 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%19 +HeliosDummyShape + X1_Y1= -11.5 -11.5 383.6 + X128_Y1= -11.5 11.5 383.6 + X1_Y128= -11.5 -11.5 439.6 + X128_Y128= -11.5 11.5 439.6 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%20 +HeliosDummyShape + X1_Y1= 11.5 -11.5 383.6 + X128_Y1= -11.5 -11.5 383.6 + X1_Y128= 11.5 -11.5 439.6 + X128_Y128= -11.5 -11.5 439.6 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%21 +HeliosDummyShape + X1_Y1= 11.5 11.5 442. + X128_Y1= 11.5 -11.5 442. + X1_Y128= 11.5 11.5 498. + X128_Y128= 11.5 -11.5 498. + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22 +HeliosDummyShape + X1_Y1= -11.5 11.5 442. + X128_Y1= 11.5 11.5 442. + X1_Y128= -11.5 11.5 498. + X128_Y128= 11.5 11.5 498. + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%23 +HeliosDummyShape + X1_Y1= -11.5 -11.5 442. + X128_Y1= -11.5 11.5 442. + X1_Y128= -11.5 -11.5 498. + X128_Y128= -11.5 11.5 498. + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24 +HeliosDummyShape + X1_Y1= 11.5 -11.5 442. + X128_Y1= -11.5 -11.5 442. + X1_Y128= 11.5 -11.5 498 + X128_Y128= -11.5 -11.5 498. + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%25 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% AT backward angles: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%25 +HeliosDummyShape + X1_Y1= 11.5 11.5 -150. + X128_Y1= 11.5 -11.5 -150. + X1_Y128= 11.5 11.5 -206. + X128_Y128= 11.5 -11.5 -206. + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%26 +HeliosDummyShape + X1_Y1= -11.5 11.5 -150. + X128_Y1= 11.5 11.5 -150. + X1_Y128= -11.5 11.5 -206. + X128_Y128= 11.5 11.5 -206. + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%27 +HeliosDummyShape + X1_Y1= -11.5 -11.5 -150. + X128_Y1= -11.5 11.5 -150. + X1_Y128= -11.5 -11.5 -206. + X128_Y128= -11.5 11.5 -206. + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%28 +HeliosDummyShape + X1_Y1= 11.5 -11.5 -150. + X128_Y1= -11.5 -11.5 -150. + X1_Y128= 11.5 -11.5 -206. + X128_Y128= -11.5 -11.5 -206. + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%29 +HeliosDummyShape + X1_Y1= 11.5 11.5 -208.4 + X128_Y1= 11.5 -11.5 -208.4 + X1_Y128= 11.5 11.5 -264.4 + X128_Y128= 11.5 -11.5 -264.4 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%30 +HeliosDummyShape + X1_Y1= -11.5 11.5 -208.4 + X128_Y1= 11.5 11.5 -208.4 + X1_Y128= -11.5 11.5 -264.4 + X128_Y128= 11.5 11.5 -264.4 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%31 +HeliosDummyShape + X1_Y1= -11.5 -11.5 -208.4 + X128_Y1= -11.5 11.5 -208.4 + X1_Y128= -11.5 -11.5 -264.4 + X128_Y128= -11.5 11.5 -264.4 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%32 +HeliosDummyShape + X1_Y1= 11.5 -11.5 -208.4 + X128_Y1= -11.5 -11.5 -208.4 + X1_Y128= 11.5 -11.5 -264.4 + X128_Y128= -11.5 -11.5 -264.4 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%33 +HeliosDummyShape + X1_Y1= 11.5 11.5 -266.8 + X128_Y1= 11.5 -11.5 -266.8 + X1_Y128= 11.5 11.5 -322.8 + X128_Y128= 11.5 -11.5 -322.8 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%34 +HeliosDummyShape + X1_Y1= -11.5 11.5 -266.8 + X128_Y1= 11.5 11.5 -266.8 + X1_Y128= -11.5 11.5 -322.8 + X128_Y128= 11.5 11.5 -322.8 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%35 +HeliosDummyShape + X1_Y1= -11.5 -11.5 -266.8 + X128_Y1= -11.5 11.5 -266.8 + X1_Y128= -11.5 -11.5 -322.8 + X128_Y128= -11.5 11.5 -322.8 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%36 +HeliosDummyShape + X1_Y1= 11.5 -11.5 -266.8 + X128_Y1= -11.5 -11.5 -266.8 + X1_Y128= 11.5 -11.5 -322.8 + X128_Y128= -11.5 -11.5 -322.8 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%37 +HeliosDummyShape + X1_Y1= 11.5 11.5 -325.2 + X128_Y1= 11.5 -11.5 -325.2 + X1_Y128= 11.5 11.5 -381.2 + X128_Y128= 11.5 -11.5 -381.2 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%38 +HeliosDummyShape + X1_Y1= -11.5 11.5 -325.2 + X128_Y1= 11.5 11.5 -325.2 + X1_Y128= -11.5 11.5 -381.2 + X128_Y128= 11.5 11.5 -381.2 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%39 +HeliosDummyShape + X1_Y1= -11.5 -11.5 -325.2 + X128_Y1= -11.5 11.5 -325.2 + X1_Y128= -11.5 -11.5 -381.2 + X128_Y128= -11.5 11.5 -381.2 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40 +HeliosDummyShape + X1_Y1= 11.5 -11.5 -325.2 + X128_Y1= -11.5 -11.5 -325.2 + X1_Y128= 11.5 -11.5 -381.2 + X128_Y128= -11.5 -11.5 -381.2 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%41 +HeliosDummyShape + X1_Y1= 11.5 11.5 -383.6 + X128_Y1= 11.5 -11.5 -383.6 + X1_Y128= 11.5 11.5 -439.6 + X128_Y128= 11.5 -11.5 -439.6 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%42 +HeliosDummyShape + X1_Y1= -11.5 11.5 -383.6 + X128_Y1= 11.5 11.5 -383.6 + X1_Y128= -11.5 11.5 -439.6 + X128_Y128= 11.5 11.5 -439.6 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%43 +HeliosDummyShape + X1_Y1= -11.5 -11.5 -383.6 + X128_Y1= -11.5 11.5 -383.6 + X1_Y128= -11.5 -11.5 -439.6 + X128_Y128= -11.5 11.5 -439.6 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%44 +HeliosDummyShape + X1_Y1= 11.5 -11.5 -383.6 + X128_Y1= -11.5 -11.5 -383.6 + X1_Y128= 11.5 -11.5 -439.6 + X128_Y128= -11.5 -11.5 -439.6 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%45 +HeliosDummyShape + X1_Y1= 11.5 11.5 -442. + X128_Y1= 11.5 -11.5 -442. + X1_Y128= 11.5 11.5 -498. + X128_Y128= 11.5 -11.5 -498. + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%46 +HeliosDummyShape + X1_Y1= -11.5 11.5 -442. + X128_Y1= 11.5 11.5 -442. + X1_Y128= -11.5 11.5 -498. + X128_Y128= 11.5 11.5 -498. + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%47 +HeliosDummyShape + X1_Y1= -11.5 -11.5 -442. + X128_Y1= -11.5 11.5 -442. + X1_Y128= -11.5 -11.5 -498. + X128_Y128= -11.5 11.5 -498. + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%48 +HeliosDummyShape + X1_Y1= 11.5 -11.5 -442. + X128_Y1= -11.5 -11.5 -442. + X1_Y128= 11.5 -11.5 -498 + X128_Y128= -11.5 -11.5 -498. + FIRSTSTAGE= 1 + VIS= all diff --git a/Projects/Helios/DetectorConfiguration/helios100.detector b/Projects/Helios/DetectorConfiguration/helios100.detector new file mode 100644 index 0000000000000000000000000000000000000000..25c45f735d18feef70650a1e62441d3e362de872 --- /dev/null +++ b/Projects/Helios/DetectorConfiguration/helios100.detector @@ -0,0 +1,257 @@ +%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%%%% +%% +%% Thickness in micrometer +%% Radius in mm +%% Position in mm +%% Magnetic field in tesla +%% +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%% +%% Position and distance given in mm +%% Angle given in degree +%% using the data from the experimental mesurement +%% special care is given for the X Y direction +%% NOTATTION USED IN THE FOLLOWING: +%% +%% X1_Y1 --> X:1 Y:1 +%% X128_Y1 --> X:128 Y:1 +%% X1_Y128 --> X:1 Y:128 +%% X128_Y128 --> X:128 Y:128 +%%Option: 0,1 for Si SiLi and CSI +%%Option: all or sensible for VISualisation +% 1.2 12.371134021 +% 2 20.618556701 +% 30 309.278350515 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Target + THICKNESS= 0.945 + ANGLE= 0. + RADIUS= 7.5 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%% Det 1 %%%%%%%% 1st quadran +QQQ + THETA= 0 + PHI= 0 + R= 900 + BETA= 0 0 -0 + SIDE= right +%%%%%%%%% Det 2 %%%%%%%% 2nd quadran +QQQ + THETA= 0 + PHI= 90 + R= 900 + BETA= 0 0 -0 + SIDE= right +%%%%%%%%% Det 1 %%%%%%%% +QQQ + THETA= 0 + PHI= 180 + R= 900 + BETA= 0 0 -0 + SIDE= right +%%%%%%%%% Det 1 %%%%%%%% +QQQ + THETA= 0 + PHI= 270 + R= 900 + BETA= 0 0 -0 + SIDE= right +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% AT backward +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%25 +HeliosDummyShape + MField= 2 + X1_Y1= 11.5 11.5 -100 + X128_Y1= 11.5 -11.5 -100 + X1_Y128= 11.5 11.5 -156 + X128_Y128= 11.5 -11.5 -156 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%26 +HeliosDummyShape + X1_Y1= -11.5 11.5 -100 + X128_Y1= 11.5 11.5 -100 + X1_Y128= -11.5 11.5 -156 + X128_Y128= 11.5 11.5 -156 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%27 +HeliosDummyShape + X1_Y1= -11.5 -11.5 -100 + X128_Y1= -11.5 11.5 -100 + X1_Y128= -11.5 -11.5 -156 + X128_Y128= -11.5 11.5 -156 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%28 +HeliosDummyShape + X1_Y1= 11.5 -11.5 -100 + X128_Y1= -11.5 -11.5 -100 + X1_Y128= 11.5 -11.5 -156 + X128_Y128= -11.5 -11.5 -156 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%29 +HeliosDummyShape + X1_Y1= 11.5 11.5 -158.4 + X128_Y1= 11.5 -11.5 -158.4 + X1_Y128= 11.5 11.5 -214.4 + X128_Y128= 11.5 -11.5 -214.4 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%30 +HeliosDummyShape + X1_Y1= -11.5 11.5 -158.4 + X128_Y1= 11.5 11.5 -158.4 + X1_Y128= -11.5 11.5 -214.4 + X128_Y128= 11.5 11.5 -214.4 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%31 +HeliosDummyShape + X1_Y1= -11.5 -11.5 -158.4 + X128_Y1= -11.5 11.5 -158.4 + X1_Y128= -11.5 -11.5 -214.4 + X128_Y128= -11.5 11.5 -214.4 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%32 +HeliosDummyShape + X1_Y1= 11.5 -11.5 -158.4 + X128_Y1= -11.5 -11.5 -158.4 + X1_Y128= 11.5 -11.5 -214.4 + X128_Y128= -11.5 -11.5 -214.4 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%33 +HeliosDummyShape + X1_Y1= 11.5 11.5 -216.8 + X128_Y1= 11.5 -11.5 -216.8 + X1_Y128= 11.5 11.5 -272.8 + X128_Y128= 11.5 -11.5 -272.8 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%34 +HeliosDummyShape + X1_Y1= -11.5 11.5 -216.8 + X128_Y1= 11.5 11.5 -216.8 + X1_Y128= -11.5 11.5 -272.8 + X128_Y128= 11.5 11.5 -272.8 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%35 +HeliosDummyShape + X1_Y1= -11.5 -11.5 -216.8 + X128_Y1= -11.5 11.5 -216.8 + X1_Y128= -11.5 -11.5 -272.8 + X128_Y128= -11.5 11.5 -272.8 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%36 +HeliosDummyShape + X1_Y1= 11.5 -11.5 -216.8 + X128_Y1= -11.5 -11.5 -216.8 + X1_Y128= 11.5 -11.5 -272.8 + X128_Y128= -11.5 -11.5 -272.8 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%37 +HeliosDummyShape + X1_Y1= 11.5 11.5 -275.2 + X128_Y1= 11.5 -11.5 -275.2 + X1_Y128= 11.5 11.5 -331.2 + X128_Y128= 11.5 -11.5 -331.2 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%38 +HeliosDummyShape + X1_Y1= -11.5 11.5 -275.2 + X128_Y1= 11.5 11.5 -275.2 + X1_Y128= -11.5 11.5 -331.2 + X128_Y128= 11.5 11.5 -331.2 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%39 +HeliosDummyShape + X1_Y1= -11.5 -11.5 -275.2 + X128_Y1= -11.5 11.5 -275.2 + X1_Y128= -11.5 -11.5 -331.2 + X128_Y128= -11.5 11.5 -331.2 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40 +HeliosDummyShape + X1_Y1= 11.5 -11.5 -275.2 + X128_Y1= -11.5 -11.5 -275.2 + X1_Y128= 11.5 -11.5 -331.2 + X128_Y128= -11.5 -11.5 -331.2 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%41 +HeliosDummyShape + X1_Y1= 11.5 11.5 -333.6 + X128_Y1= 11.5 -11.5 -333.6 + X1_Y128= 11.5 11.5 -389.6 + X128_Y128= 11.5 -11.5 -389.6 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%42 +HeliosDummyShape + X1_Y1= -11.5 11.5 -333.6 + X128_Y1= 11.5 11.5 -333.6 + X1_Y128= -11.5 11.5 -389.6 + X128_Y128= 11.5 11.5 -389.6 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%43 +HeliosDummyShape + X1_Y1= -11.5 -11.5 -333.6 + X128_Y1= -11.5 11.5 -333.6 + X1_Y128= -11.5 -11.5 -389.6 + X128_Y128= -11.5 11.5 -389.6 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%44 +HeliosDummyShape + X1_Y1= 11.5 -11.5 -333.6 + X128_Y1= -11.5 -11.5 -333.6 + X1_Y128= 11.5 -11.5 -389.6 + X128_Y128= -11.5 -11.5 -389.6 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%45 +HeliosDummyShape + X1_Y1= 11.5 11.5 -392 + X128_Y1= 11.5 -11.5 -392 + X1_Y128= 11.5 11.5 -448 + X128_Y128= 11.5 -11.5 -448 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%46 +HeliosDummyShape + X1_Y1= -11.5 11.5 -392 + X128_Y1= 11.5 11.5 -392 + X1_Y128= -11.5 11.5 -448 + X128_Y128= 11.5 11.5 -448 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%47 +HeliosDummyShape + X1_Y1= -11.5 -11.5 -392 + X128_Y1= -11.5 11.5 -392 + X1_Y128= -11.5 -11.5 -448 + X128_Y128= -11.5 11.5 -448 + FIRSTSTAGE= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%48 +HeliosDummyShape + X1_Y1= 11.5 -11.5 -392 + X128_Y1= -11.5 -11.5 -392 + X1_Y128= 11.5 -11.5 -448 + X128_Y128= -11.5 -11.5 -448 + FIRSTSTAGE= 1 + VIS= all diff --git a/Projects/MUGAST/56Nidp.reaction b/Projects/MUGAST/56Nidp.reaction new file mode 100644 index 0000000000000000000000000000000000000000..9f477e4d0b891bc7ffa01d7cdc025f46d456fbee --- /dev/null +++ b/Projects/MUGAST/56Nidp.reaction @@ -0,0 +1,37 @@ +%%%%%%%%%%%%%%%%%%%%%% S1107 at Triumf %%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Beam + Particle= 56Ni + ExcitationEnergy= 0 MeV + SigmaThetaX= 3 mrad + SigmaPhiY= 3 mrad + SigmaX= 25 mm + SigmaY= 25 mm + MeanThetaX= 1 mrad + MeanPhiY= 1 mrad + MeanX= 0 mm + MeanY= 0 mm + EnergyProfilePath= eLise.txt EL + %XThetaXProfilePath= + %YPhiYProfilePath= + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +TwoBodyReaction + Beam= 56Ni + Target= 2H + Light= 1H + Heavy= 57Ni + ExcitationEnergyLight= 0.0 MeV + ExcitationEnergyHeavy= 1.0 MeV + DoubleDifferentialCrossSectionPath= 56Nidp.root h + ShootLight= 1 + ShootHeavy= 1 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GammaCascade 57Ni + Energies= 1.0 + BranchingRatio= 70 +GammaCascade 57Ni + Energies= 0.5 0.5 + BranchingRatio= 20 + + diff --git a/Projects/MUGAST/56Nidp.root b/Projects/MUGAST/56Nidp.root new file mode 100644 index 0000000000000000000000000000000000000000..b8ca621e3ebb78f300d185c62c0a65563f44c899 Binary files /dev/null and b/Projects/MUGAST/56Nidp.root differ diff --git a/Projects/MUGAST/Analysis.cxx b/Projects/MUGAST/Analysis.cxx index dbf6ac6ad86e477fb56ccd5c068e524399bcca44..57e731e6e5993b353b4d94417bdb5d0659461256 100644 --- a/Projects/MUGAST/Analysis.cxx +++ b/Projects/MUGAST/Analysis.cxx @@ -41,7 +41,7 @@ void Analysis::Init() { InitInputBranch(); myInit = new TInitialConditions(); // get MUST2 and Gaspard objects - M2 = (TMust2Physics*) m_DetectorManager -> GetDetector("MUST2Array"); + M2 = (TMust2Physics*) m_DetectorManager -> GetDetector("M2Telescope"); GD = (GaspardTracker*) m_DetectorManager -> GetDetector("GaspardTracker"); // get reaction information @@ -49,10 +49,10 @@ void Analysis::Init() { OriginalBeamEnergy = myReaction.GetBeamEnergy(); // target thickness - TargetThickness = m_DetectorManager->GetTargetThickness()*micrometer; + TargetThickness = m_DetectorManager->GetTargetThickness(); string TargetMaterial = m_DetectorManager->GetTargetMaterial(); // Cryo target case - WindowsThickness = m_DetectorManager->GetWindowsThickness()*micrometer; + WindowsThickness = m_DetectorManager->GetWindowsThickness(); string WindowsMaterial = m_DetectorManager->GetWindowsMaterial(); // energy losses @@ -88,19 +88,6 @@ void Analysis::Init() { Z = 0; dE = 0; dTheta=0; - // determine beam energy for a randomized interaction point in target - FinalBeamEnergy = OriginalBeamEnergy; - if(BeamWindow) - FinalBeamEnergy = BeamWindow->Slow(OriginalBeamEnergy,WindowsThickness,0); - - FinalBeamEnergy = BeamCD2.Slow(FinalBeamEnergy, TargetThickness*0.5, 0); - - myReaction.SetBeamEnergy(FinalBeamEnergy); - - cout << "//// Slow down Beam in the target ////" << endl; - cout << "Initial beam energy : " << OriginalBeamEnergy << endl; - cout << "Final beam energy : " << FinalBeamEnergy << endl; - BeamDirection = TVector3(0,0,1); } @@ -112,6 +99,11 @@ void Analysis::TreatEvent() { //double zImpact = Rand.Uniform(-TargetThickness*0.5,TargetThickness*0.5); double zImpact = 0 ; BeamImpact = TVector3(0,0,zImpact); + // determine beam energy for a randomized interaction point in target + // 1% FWHM randominastion (E/100)/2.35 + myReaction.SetBeamEnergy(Rand.Gaus(myInit->GetIncidentFinalKineticEnergy(),myInit->GetIncidentFinalKineticEnergy()/235)); + + //////////////////////////// LOOP on MUST2 ////////////////// for(unsigned int countMust2 = 0 ; countMust2 < M2->Si_E.size() ; countMust2++){ /************************************************/ diff --git a/Projects/MUGAST/DetectorConfiguration/MUGAST.detector b/Projects/MUGAST/DetectorConfiguration/MUGAST.detector new file mode 100644 index 0000000000000000000000000000000000000000..05dcafde0979348e7256a6ece37891ff30296382 --- /dev/null +++ b/Projects/MUGAST/DetectorConfiguration/MUGAST.detector @@ -0,0 +1,137 @@ +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +Target + THICKNESS= 5 micrometer + RADIUS= 7.5 mm + MATERIAL= CD2 + Angle= 0 deg + X= 0 mm + Y= 0 mm + Z= 0 mm + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Annular Back +GaspardTracker Annular + Z= -148.6 mm + RMIN= 16 mm + RMAX= 45 mm + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 End-Cap Back +GaspardTracker Trapezoid + X128_Y128=41.963 21.364 -138.589 mm + X1_Y128= 23.737 39.592 -138.591 mm + X128_Y1= 122.368 54.712 -71.098 mm + X1_Y1= 57.084 119.996 -71.098 mm + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GaspardTracker Trapezoid + X128_Y128= -41.963 -21.364 -138.589 mm + X1_Y128= -23.737 -39.592 -138.591 mm + X128_Y1= -122.368 -54.712 -71.098 mm + X1_Y1= -57.084 -119.996 -71.098 mm + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +GaspardTracker Trapezoid + X128_Y128= -21.364 41.963 -138.589 mm + X1_Y128= -39.592 23.737 -138.591 mm + X128_Y1= -54.712 122.368 -71.098 mm + X1_Y1= -119.996 57.084 -71.098 mm + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +GaspardTracker Trapezoid + X128_Y128= 21.364 -41.963 -138.589 mm + X1_Y128= 39.592 -23.737 -138.591 mm + X128_Y1= 54.712 -122.368 -71.098 mm + X1_Y1= 119.996 -57.084 -71.098 mm + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Barrel +GaspardTracker Square + X1_Y1= -132.251 58.314 53.5 mm + X128_Y1= -61.823 128.742 53.5 mm + X1_Y128= -132.251 58.314 -58.5 mm + X128_Y128= -61.823 128.742 -58.5 mm + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +GaspardTracker Square + X1_Y1= -134.75 -52.319 53.5 mm + X128_Y1= -134.75 47.281 53.5 mm + X1_Y128= -134.75 -52.319 -58.5 mm + X128_Y128= -134.75 47.281 -58.5 mm + FIRSTSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 + VIS= all +%%%%%%% Telescope 1 %%%%%%% +M2Telescope + X1_Y1= 13.00 102.79 145.98 mm + X1_Y128= 24.88 10.58 175.20 mm + X128_Y1= 103.08 102.90 110.06 mm + X128_Y128= 115.23 10.76 139.14 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all + +%%%%%%% Telescope 2 %%%%%%% +M2Telescope + X1_Y1= -114.05 10.98 138.48 mm + X1_Y128= -23.81 10.92 174.84 mm + X128_Y1= -102.23 102.22 109.39 mm + X128_Y128= -11.95 102.90 145.48 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all + +%%%%%%% Telescope 3 %%%%%%% +M2Telescope + X1_Y1= -11.91 -103.68 146.50 mm + X1_Y128= -24.30 -10.94 175.00 mm + X128_Y1= -102.03 -103.39 110.36 mm + X128_Y128= -114.58 -10.71 138.76 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all + +%%%%%%% Telescope 4 %%%%%%% +M2Telescope + X1_Y1= 115.12 -11.35 138.94 mm + X1_Y128= 24.33 -11.60 174.81 mm + X128_Y1= 103.64 -103.42 110.51 mm + X128_Y128= 12.89 -103.90 146.29 mm + SI= 1 + SILI= 0 + CSI= 1 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Paris +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%ParisCluster + A= 291.358 -7.734 -38.5 + B= 291 -7.118 129 + C= 246.046 -168.989 129 + D= 246.661 -168.641 -38.5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%ParisCluster + A= 243.139 158.516 -38.5 + B= 242.517 158.852 129 + C= 290.527 -2.142 129 + D= 290.863 -1.52 -38.5 diff --git a/Inputs/DetectorConfiguration/MUGAST_Agata.detector b/Projects/MUGAST/DetectorConfiguration/MUGAST_Agata.detector similarity index 70% rename from Inputs/DetectorConfiguration/MUGAST_Agata.detector rename to Projects/MUGAST/DetectorConfiguration/MUGAST_Agata.detector index 65e79cee74b9750357dda5dfb8d56c506b4a57a1..ee5bcdb5c544fe9cad9b0bbb78fe14398038b193 100644 --- a/Inputs/DetectorConfiguration/MUGAST_Agata.detector +++ b/Projects/MUGAST/DetectorConfiguration/MUGAST_Agata.detector @@ -3,12 +3,12 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Target - THICKNESS= 9.7 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 9.7 + RADIUS= 7.5 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -28,8 +28,8 @@ GPDAnnular GPDTrapezoid X128_Y128= 41.963 21.364 -99.28 X1_Y128= 23.737 39.592 -99.282 - X128_Y1= 122.368 54.712 -31.789 - X1_Y1= 57.084 119.996 -31.789 + X128_Y1= 122.368 54.712 -31.789 + X1_Y1= 57.084 119.996 -31.789 FIRSTSTAGE= 1 SECONDSTAGE= 0 THIRDSTAGE= 0 @@ -38,8 +38,8 @@ GPDTrapezoid GPDTrapezoid X128_Y128= -41.963 -21.364 -99.28 X1_Y128= -23.737 -39.592 -99.282 - X128_Y1= -122.368 -54.712 -31.789 - X1_Y1= -57.084 -119.996 -31.789 + X128_Y1= -122.368 -54.712 -31.789 + X1_Y1= -57.084 -119.996 -31.789 FIRSTSTAGE= 1 SECONDSTAGE= 0 THIRDSTAGE= 0 @@ -48,8 +48,8 @@ GPDTrapezoid GPDTrapezoid X128_Y128= -21.364 41.963 -99.28 X1_Y128= -39.592 23.737 -99.282 - X128_Y1= -54.712 122.368 -31.789 - X1_Y1= -119.996 57.084 -31.789 + X128_Y1= -54.712 122.368 -31.789 + X1_Y1= -119.996 57.084 -31.789 FIRSTSTAGE= 1 SECONDSTAGE= 0 THIRDSTAGE= 0 @@ -58,8 +58,8 @@ GPDTrapezoid GPDTrapezoid X128_Y128= 21.364 -41.963 -99.28 X1_Y128= 39.592 -23.737 -98.282 - X128_Y1= 54.712 -122.368 -31.789 - X1_Y1= 119.996 -57.084 -31.789 + X128_Y1= 54.712 -122.368 -31.789 + X1_Y1= 119.996 -57.084 -31.789 FIRSTSTAGE= 1 SECONDSTAGE= 0 THIRDSTAGE= 0 @@ -86,51 +86,51 @@ GPDSquare THIRDSTAGE= 0 VIS= all -%%%%%%%%%%%%%%%%%%%%% -MUST2Array +%%%%%%%%%%%%%%%%%%%%% +MUST2Array %%%%%%% Telescope 1 %%%%%%% M2Telescope -X1_Y1= 13.00 102.79 161.98 -X1_Y128= 24.88 10.58 191.20 -X128_Y1= 103.08 102.90 126.06 -X128_Y128= 115.23 10.76 155.14 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all +X1_Y1= 13.00 102.79 161.98 +X1_Y128= 24.88 10.58 191.20 +X128_Y1= 103.08 102.90 126.06 +X128_Y128= 115.23 10.76 155.14 +SI= 1.00 +SILI= 0.00 +CSI= 1.00 +VIS= all %%%%%%% Telescope 2 %%%%%%% M2Telescope -X1_Y1= -114.05 10.98 154.48 -X1_Y128= -23.81 10.92 190.84 -X128_Y1= -102.23 102.22 125.39 -X128_Y128= -11.95 102.90 161.48 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all +X1_Y1= -114.05 10.98 154.48 +X1_Y128= -23.81 10.92 190.84 +X128_Y1= -102.23 102.22 125.39 +X128_Y128= -11.95 102.90 161.48 +SI= 1.00 +SILI= 0.00 +CSI= 1.00 +VIS= all %%%%%%% Telescope 3 %%%%%%% M2Telescope -X1_Y1= -11.91 -103.68 162.50 -X1_Y128= -24.30 -10.94 191.00 -X128_Y1= -102.03 -103.39 126.36 -X128_Y128= -114.58 -10.71 154.76 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all +X1_Y1= -11.91 -103.68 162.50 +X1_Y128= -24.30 -10.94 191.00 +X128_Y1= -102.03 -103.39 126.36 +X128_Y128= -114.58 -10.71 154.76 +SI= 1.00 +SILI= 0.00 +CSI= 1.00 +VIS= all %%%%%%% Telescope 4 %%%%%%% M2Telescope -X1_Y1= 115.12 -11.35 154.94 -X1_Y128= 24.33 -11.60 190.81 -X128_Y1= 103.64 -103.42 126.51 -X128_Y128= 12.89 -103.90 162.29 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all +X1_Y1= 115.12 -11.35 154.94 +X1_Y128= 24.33 -11.60 190.81 +X128_Y1= 103.64 -103.42 126.51 +X128_Y128= 12.89 -103.90 162.29 +SI= 1.00 +SILI= 0.00 +CSI= 1.00 +VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AGATA diff --git a/Inputs/DetectorConfiguration/MUGAST_Agata_Cryo.detector b/Projects/MUGAST/DetectorConfiguration/MUGAST_Agata_Cryo.detector similarity index 69% rename from Inputs/DetectorConfiguration/MUGAST_Agata_Cryo.detector rename to Projects/MUGAST/DetectorConfiguration/MUGAST_Agata_Cryo.detector index 909c1b26dc1cff0bf0a96cb37b310ccc0b64d1d7..068eb26ae72a9f17c0a390ffb852e96b14805b67 100644 --- a/Inputs/DetectorConfiguration/MUGAST_Agata_Cryo.detector +++ b/Projects/MUGAST/DetectorConfiguration/MUGAST_Agata_Cryo.detector @@ -1,19 +1,16 @@ %%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 -GeneralTarget -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 CryoTarget - THICKNESS= 1000 - RADIUS= 7.5 - MATERIAL= D2 + THICKNESS= 1000 + RADIUS= 7.5 + MATERIAL= D2 DENSITY= 0.16383 WINDOWSTHICKNESS= 1 WINDOWSMATERIAL= Mylar - X= 0 - Y= 0 - Z= 0 - - + ANGLE= 0 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% GaspardTracker GPDChamber= MUGAST @@ -31,8 +28,8 @@ GPDAnnular GPDTrapezoid X128_Y128= 41.963 21.364 -99.28 X1_Y128= 23.737 39.592 -99.282 - X128_Y1= 122.368 54.712 -31.789 - X1_Y1= 57.084 119.996 -31.789 + X128_Y1= 122.368 54.712 -31.789 + X1_Y1= 57.084 119.996 -31.789 FIRSTSTAGE= 1 SECONDSTAGE= 0 THIRDSTAGE= 0 @@ -41,8 +38,8 @@ GPDTrapezoid GPDTrapezoid X128_Y128= -41.963 -21.364 -99.28 X1_Y128= -23.737 -39.592 -99.282 - X128_Y1= -122.368 -54.712 -31.789 - X1_Y1= -57.084 -119.996 -31.789 + X128_Y1= -122.368 -54.712 -31.789 + X1_Y1= -57.084 -119.996 -31.789 FIRSTSTAGE= 1 SECONDSTAGE= 0 THIRDSTAGE= 0 @@ -51,8 +48,8 @@ GPDTrapezoid GPDTrapezoid X128_Y128= -21.364 41.963 -99.28 X1_Y128= -39.592 23.737 -99.282 - X128_Y1= -54.712 122.368 -31.789 - X1_Y1= -119.996 57.084 -31.789 + X128_Y1= -54.712 122.368 -31.789 + X1_Y1= -119.996 57.084 -31.789 FIRSTSTAGE= 1 SECONDSTAGE= 0 THIRDSTAGE= 0 @@ -61,8 +58,8 @@ GPDTrapezoid GPDTrapezoid X128_Y128= 21.364 -41.963 -99.28 X1_Y128= 39.592 -23.737 -98.282 - X128_Y1= 54.712 -122.368 -31.789 - X1_Y1= 119.996 -57.084 -31.789 + X128_Y1= 54.712 -122.368 -31.789 + X1_Y1= 119.996 -57.084 -31.789 FIRSTSTAGE= 1 SECONDSTAGE= 0 THIRDSTAGE= 0 @@ -89,51 +86,51 @@ GPDRectangle THIRDSTAGE= 0 VIS= all -%%%%%%%%%%%%%%%%%%%%% -MUST2Array +%%%%%%%%%%%%%%%%%%%%% +MUST2Array %%%%%%% Telescope 1 %%%%%%% M2Telescope -X1_Y1= 13.00 102.79 161.98 -X1_Y128= 24.88 10.58 191.20 -X128_Y1= 103.08 102.90 126.06 -X128_Y128= 115.23 10.76 155.14 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all +X1_Y1= 13.00 102.79 161.98 +X1_Y128= 24.88 10.58 191.20 +X128_Y1= 103.08 102.90 126.06 +X128_Y128= 115.23 10.76 155.14 +SI= 1.00 +SILI= 0.00 +CSI= 1.00 +VIS= all %%%%%%% Telescope 2 %%%%%%% M2Telescope -X1_Y1= -114.05 10.98 154.48 -X1_Y128= -23.81 10.92 190.84 -X128_Y1= -102.23 102.22 125.39 -X128_Y128= -11.95 102.90 161.48 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all +X1_Y1= -114.05 10.98 154.48 +X1_Y128= -23.81 10.92 190.84 +X128_Y1= -102.23 102.22 125.39 +X128_Y128= -11.95 102.90 161.48 +SI= 1.00 +SILI= 0.00 +CSI= 1.00 +VIS= all %%%%%%% Telescope 3 %%%%%%% M2Telescope -X1_Y1= -11.91 -103.68 162.50 -X1_Y128= -24.30 -10.94 191.00 -X128_Y1= -102.03 -103.39 126.36 -X128_Y128= -114.58 -10.71 154.76 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all +X1_Y1= -11.91 -103.68 162.50 +X1_Y128= -24.30 -10.94 191.00 +X128_Y1= -102.03 -103.39 126.36 +X128_Y128= -114.58 -10.71 154.76 +SI= 1.00 +SILI= 0.00 +CSI= 1.00 +VIS= all %%%%%%% Telescope 4 %%%%%%% M2Telescope -X1_Y1= 115.12 -11.35 154.94 -X1_Y128= 24.33 -11.60 190.81 -X128_Y1= 103.64 -103.42 126.51 -X128_Y128= 12.89 -103.90 162.29 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all +X1_Y1= 115.12 -11.35 154.94 +X1_Y128= 24.33 -11.60 190.81 +X128_Y1= 103.64 -103.42 126.51 +X128_Y128= 12.89 -103.90 162.29 +SI= 1.00 +SILI= 0.00 +CSI= 1.00 +VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AGATA diff --git a/Inputs/DetectorConfiguration/MUGAST_Manu.detector b/Projects/MUGAST/DetectorConfiguration/MUGAST_Manu.detector similarity index 64% rename from Inputs/DetectorConfiguration/MUGAST_Manu.detector rename to Projects/MUGAST/DetectorConfiguration/MUGAST_Manu.detector index 9135644bd2b4a39353040e5aff69c3f756869b35..d9ae240d8d902e01e607d61ff45a50eb60d844c6 100644 --- a/Inputs/DetectorConfiguration/MUGAST_Manu.detector +++ b/Projects/MUGAST/DetectorConfiguration/MUGAST_Manu.detector @@ -3,13 +3,13 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Target - THICKNESS= 9.7 - RADIUS= 7.5 - MATERIAL= CD2 - X= 0 - Y= 0 - Z= 0 - NBLAYERS= 100 + THICKNESS= 9.7 + RADIUS= 7.5 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 + NBLAYERS= 100 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -27,8 +27,8 @@ GPDAnnular GPDTrapezoid X128_Y128= 41.963 21.364 -99.28 X1_Y128= 23.737 39.592 -99.282 - X128_Y1= 122.368 54.712 -31.789 - X1_Y1= 57.084 119.996 -31.789 + X128_Y1= 122.368 54.712 -31.789 + X1_Y1= 57.084 119.996 -31.789 FIRSTSTAGE= 1 SECONDSTAGE= 0 THIRDSTAGE= 0 @@ -37,8 +37,8 @@ GPDTrapezoid GPDTrapezoid X128_Y128= -41.963 -21.364 -99.28 X1_Y128= -23.737 -39.592 -99.282 - X128_Y1= -122.368 -54.712 -31.789 - X1_Y1= -57.084 -119.996 -31.789 + X128_Y1= -122.368 -54.712 -31.789 + X1_Y1= -57.084 -119.996 -31.789 FIRSTSTAGE= 1 SECONDSTAGE= 0 THIRDSTAGE= 0 @@ -47,8 +47,8 @@ GPDTrapezoid GPDTrapezoid X128_Y128= -21.364 41.963 -99.28 X1_Y128= -39.592 23.737 -99.282 - X128_Y1= -54.712 122.368 -31.789 - X1_Y1= -119.996 57.084 -31.789 + X128_Y1= -54.712 122.368 -31.789 + X1_Y1= -119.996 57.084 -31.789 FIRSTSTAGE= 1 SECONDSTAGE= 0 THIRDSTAGE= 0 @@ -57,8 +57,8 @@ GPDTrapezoid GPDTrapezoid X128_Y128= 21.364 -41.963 -99.28 X1_Y128= 39.592 -23.737 -98.282 - X128_Y1= 54.712 -122.368 -31.789 - X1_Y1= 119.996 -57.084 -31.789 + X128_Y1= 54.712 -122.368 -31.789 + X1_Y1= 119.996 -57.084 -31.789 FIRSTSTAGE= 1 SECONDSTAGE= 0 THIRDSTAGE= 0 @@ -86,50 +86,50 @@ GPDSquare VIS= all -%%%%%%%%%%%%%%%%%%%%% -MUST2Array +%%%%%%%%%%%%%%%%%%%%% +MUST2Array %%%%%%% Telescope 1 %%%%%%% M2Telescope -X1_Y1= 13.00 102.79 161.98 -X1_Y128= 24.88 10.58 191.20 -X128_Y1= 103.08 102.90 126.06 -X128_Y128= 115.23 10.76 155.14 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all +X1_Y1= 13.00 102.79 161.98 +X1_Y128= 24.88 10.58 191.20 +X128_Y1= 103.08 102.90 126.06 +X128_Y128= 115.23 10.76 155.14 +SI= 1.00 +SILI= 0.00 +CSI= 1.00 +VIS= all %%%%%%% Telescope 2 %%%%%%% M2Telescope -X1_Y1= -114.05 10.98 154.48 -X1_Y128= -23.81 10.92 190.84 -X128_Y1= -102.23 102.22 125.39 -X128_Y128= -11.95 102.90 161.48 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all +X1_Y1= -114.05 10.98 154.48 +X1_Y128= -23.81 10.92 190.84 +X128_Y1= -102.23 102.22 125.39 +X128_Y128= -11.95 102.90 161.48 +SI= 1.00 +SILI= 0.00 +CSI= 1.00 +VIS= all %%%%%%% Telescope 3 %%%%%%% M2Telescope -X1_Y1= -11.91 -103.68 162.50 -X1_Y128= -24.30 -10.94 191.00 -X128_Y1= -102.03 -103.39 126.36 -X128_Y128= -114.58 -10.71 154.76 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all +X1_Y1= -11.91 -103.68 162.50 +X1_Y128= -24.30 -10.94 191.00 +X128_Y1= -102.03 -103.39 126.36 +X128_Y128= -114.58 -10.71 154.76 +SI= 1.00 +SILI= 0.00 +CSI= 1.00 +VIS= all %%%%%%% Telescope 4 %%%%%%% M2Telescope -X1_Y1= 115.12 -11.35 154.94 -X1_Y128= 24.33 -11.60 190.81 -X128_Y1= 103.64 -103.42 126.51 -X128_Y128= 12.89 -103.90 162.29 -SI= 1.00 -SILI= 0.00 -CSI= 1.00 -VIS= all +X1_Y1= 115.12 -11.35 154.94 +X1_Y128= 24.33 -11.60 190.81 +X128_Y1= 103.64 -103.42 126.51 +X128_Y128= 12.89 -103.90 162.29 +SI= 1.00 +SILI= 0.00 +CSI= 1.00 +VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Projects/MUGAST/ShowResults.C b/Projects/MUGAST/ShowResults.C index e562cad92fd36edfdbd100a76ffbaadf9714b7b1..41ca7ece32729879f3f02fbce3663a6ce1767457 100644 --- a/Projects/MUGAST/ShowResults.C +++ b/Projects/MUGAST/ShowResults.C @@ -49,7 +49,7 @@ using namespace std; #include "TInitialConditions.h" #include "TInteractionCoordinates.h" //#include "NPDetectorManager.h" -#include "Reaction.h" +#include "NPReaction.h" using namespace NPL; void ShowResults() @@ -82,8 +82,7 @@ void ShowResults() void CountingRates(Double_t ibeam = 1e5, Double_t ubt = 30) { // load event generator file - NPL::Reaction *reaction = new NPL::Reaction(); - Reaction *reaction = new Reaction(); + NPL::Reaction* reaction = new NPL::Reaction(); reaction->ReadConfigurationFile("30Pdp.reaction"); // reaction->ReadConfigurationFile("11Be_d3He.reaction"); // get angular distribution diff --git a/Projects/MUGAST/eLise.txt b/Projects/MUGAST/eLise.txt new file mode 100644 index 0000000000000000000000000000000000000000..6d521c318f095bc29703c632d6e9106793d8bfc6 --- /dev/null +++ b/Projects/MUGAST/eLise.txt @@ -0,0 +1,107 @@ +613.219 709.855 +614.514 1313.08 +615.809 2238.92 +617.104 3326.08 +618.399 5471.15 +619.694 7846.54 +620.988 10682.6 +622.283 14367.4 +623.578 18476.6 +624.873 24443.9 +626.168 30839.4 +627.463 38091.2 +628.757 46423.8 +630.052 55296.8 +631.347 65853.4 +632.642 76681.1 +633.937 88051 +635.232 99897.7 +636.527 111983 +637.821 123753 +639.116 135331 +640.411 146525 +641.706 157397 +643.001 168109 +644.296 177356 +645.59 186232 +646.885 194365 +648.18 202193 +649.475 209870 +650.77 216265 +652.065 222212 +653.36 227261 +654.654 232041 +655.949 236686 +657.244 241899 +658.539 247179 +659.834 252593 +661.128 257121 +662.423 261204 +663.718 265745 +665.013 270121 +666.308 274168 +667.603 278329 +668.898 282547 +670.192 286326 +671.487 289804 +672.782 292678 +674.077 295509 +675.372 298320 +676.667 300010 +677.961 301688 +679.256 303343 +680.551 303699 +681.846 303407 +683.141 304337 +684.436 304835 +685.73 304469 +687.025 302633 +688.32 300063 +689.615 298270 +690.91 295638 +692.205 291329 +693.5 287682 +694.794 284365 +696.089 279889 +697.384 274682 +698.679 268013 +699.974 261764 +701.269 255725 +702.563 247673 +703.858 239926 +705.153 232786 +706.448 225368 +707.743 217812 +709.038 208636 +710.333 199665 +711.627 191105 +712.922 181974 +714.217 172557 +715.512 164076 +716.807 155603 +718.101 147146 +719.396 138130 +720.691 128834 +721.986 120126 +723.281 111349 +724.576 102434 +725.871 94069.8 +727.165 85981.5 +728.46 78207.3 +729.755 70298.4 +731.05 62120.2 +732.345 54567 +733.64 47326.1 +734.934 40399.1 +736.229 33915.6 +737.524 28319.1 +738.819 23384.8 +740.114 18781.6 +741.409 14615.9 +742.704 10933.7 +743.998 8218.64 +745.293 5802.54 +746.588 3535.92 +747.883 2403.3 +749.178 1431.15 +750.473 779.938 diff --git a/Projects/Paris/DetectorConfigurtation/Paris1.detector b/Projects/Paris/DetectorConfigurtation/Paris1.detector new file mode 100644 index 0000000000000000000000000000000000000000..977f6cce72eea82e9786fe7beb870a3bfd44170e --- /dev/null +++ b/Projects/Paris/DetectorConfigurtation/Paris1.detector @@ -0,0 +1,135 @@ +%Fichier de configuration manip E225 +%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 +%Thickness in micrometer +%Radius in mm +%Temperature in K, Pressure in bar +%Material name according to the target library + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 10.3 + ANGLE= 0 + RADIUS= 12 + MATERIAL= CD2 + NBLAYERS= 50 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and R given in mm +%%Angle given in degree +%%Option: 0,1 for Si SiLi and CsI +%%Option: all or sensible for VISualisation + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ParisCluster + A= -84.5 -235 84.5 + B= 84.5 -235 84.5 + C= -84.5 -235 -84.5 + D= 84.5 -235 -84.5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + A= -225.920617 -106.419571 84.5 + B= -106.419571 -225.920617 84.5 + C= -225.920617 -106.419571 -84.5 + D= -106.419571 -225.920617 -84.5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + A= -235 84.5 84.5 + B= -235 -84.5 84.5 + C= -235 84.5 -84.5 + D= -235 -84.5 -84.5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +ParisCluster + A= -106.419571 225.920617 84.5 + B= -225.920617 106.419571 84.5 + C= -106.419571 225.920617 -84.5 + D= -225.920617 106.419571 -84.5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + A= 84.5 235 84.5 + B= -84.5 235 84.5 + C= 84.5 235 -84.5 + D= -84.5 235 -84.5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + A= 225.920617 106.419571 84.5 + B= 106.419571 225.920617 84.5 + C= 225.920617 106.419571 -84.5 + D= 106.419571 225.920617 -84.5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + A= 235 -84.5 84.5 + B= 235 84.5 84.5 + C= 235 -84.5 -84.5 + D= 235 84.5 -84.5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + A= 106.419571 -225.920617 84.5 + B= 225.920617 -106.419571 84.5 + C= 106.419571 -225.920617 -84.5 + D= 225.920617 -106.419571 -84.5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + A= 84.5 84.5 -235 + B= -84.5 84.5 -235 + C= 84.5 -84.5 -235 + D= -84.5 -84.5 -235 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + A= 225.920617 84.5 -106.419571 + B= 106.419571 84.5 -225.920617 + C= 225.920617 -84.5 -106.419571 + D= 106.419571 -84.5 -225.920617 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + A= 106.419571 84.5 225.920617 + B= 225.920617 84.5 106.419571 + C= 106.419571 -84.5 225.920617 + D= 225.920617 -84.5 106.419571 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + A= -84.5 84.5 235 + B= 84.5 84.5 235 + C= -84.5 -84.5 235 + D= 84.5 -84.5 235 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + A= -225.920617 84.5 106.419571 + B= -106.419571 84.5 225.920617 + C= -225.920617 -84.5 106.419571 + D= -106.419571 -84.5 225.920617 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + A= -106.419571 84.5 -225.920617 + B= -225.920617 84.5 -106.419571 + C= -106.419571 -84.5 -225.920617 + D= -225.920617 -84.5 -106.419571 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + A= -84.5 106.419571 -225.920617 + B= 84.5 106.419571 -225.920617 + C= -84.5 225.920617 -106.419571 + D= 84.5 225.920617 -106.419571 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + A= -84.5 225.920617 106.419571 + B= 84.5 225.920617 106.419571 + C= -84.5 106.419571 225.920617 + D= 84.5 106.419571 225.920617 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + A= -84.5 -106.419571 225.920617 + B= 84.5 -106.419571 225.920617 + C= -84.5 -225.920617 106.419571 + D= 84.5 -225.920617 106.419571 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + A= -84.5 -225.920617 -106.419571 + B= 84.5 -225.920617 -106.419571 + C= -84.5 -106.419571 -225.920617 + D= 84.5 -106.419571 -225.920617 diff --git a/Inputs/DetectorConfiguration/Paris1moduleChamber.detector b/Projects/Paris/DetectorConfigurtation/Paris1moduleChamber.detector similarity index 81% rename from Inputs/DetectorConfiguration/Paris1moduleChamber.detector rename to Projects/Paris/DetectorConfigurtation/Paris1moduleChamber.detector index 0ff7f283262587a01e168876eb6096be1820771b..8fd8e1c000eaa4e46bea427b77502184511d9a85 100644 --- a/Inputs/DetectorConfiguration/Paris1moduleChamber.detector +++ b/Projects/Paris/DetectorConfigurtation/Paris1moduleChamber.detector @@ -9,14 +9,14 @@ %GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Target -% THICKNESS= 10.3 -% ANGLE= 0 -% RADIUS= 12 -% MATERIAL= CD2 -% NBLAYERS= 50 -% X= 0 -% Y= 0 -% Z= 0 +% THICKNESS= 10.3 +% ANGLE= 0 +% RADIUS= 12 +% MATERIAL= CD2 +% NBLAYERS= 50 +% X= 0 +% Y= 0 +% Z= 0 %%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% @@ -37,7 +37,7 @@ Chamber ThetaMax= 3.14159 % MATERIAL= 12C MATERIAL= Alu -% MATERIAL= Cu +% MATERIAL= Cu %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -46,7 +46,7 @@ Chamber Paris %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 ParisPhoswich - A= -28.5 -235 28.5 - B= 28.5 -235 28.5 - C= -28.5 -235 -28.5 - D= 28.5 -235 -28.5 + A= -28.5 -235 28.5 + B= 28.5 -235 28.5 + C= -28.5 -235 -28.5 + D= 28.5 -235 -28.5 diff --git a/Projects/Paris/DetectorConfigurtation/Paris2.detector b/Projects/Paris/DetectorConfigurtation/Paris2.detector new file mode 100644 index 0000000000000000000000000000000000000000..b11469b2a398e67bda54ef1181f6c2fed6ccc73b --- /dev/null +++ b/Projects/Paris/DetectorConfigurtation/Paris2.detector @@ -0,0 +1,171 @@ +%Fichier de configuration manip E225 +%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 +%Thickness in micrometer +%Radius in mm +%Temperature in K, Pressure in bar +%Material name according to the target library + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 10.3 + ANGLE= 0 + RADIUS= 12 + MATERIAL= CD2 + NBLAYERS= 50 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and R given in mm +%%Angle given in degree +%%Option: 0,1 for Si SiLi and CsI +%%Option: all or sensible for VISualisation + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= -175.9824 135.677313 -95.372227 + B= -199.252552 89.137008 -118.642379 + C= -135.677313 135.677313 -135.677313 + D= -158.947466 89.137008 -158.947466 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= -135.677313 135.677313 -135.677313 + B= -158.947466 89.137008 -158.947466 + C= -95.372227 135.677313 -175.9824 + D= -118.642379 89.137008 -199.252552 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= -132.559704 182.217618 -92.254617 + B= -155.829857 135.677313 -115.52477 + C= -92.254617 182.217618 -132.559704 + D= -115.52477 135.677313 -155.829857 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= -95.372227 135.677313 175.9824 + B= -118.642379 89.137008 199.252552 + C= -135.677313 135.677313 135.677313 + D= -158.947466 89.137008 158.947466 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= -135.677313 135.677313 135.677313 + B= -158.947466 89.137008 158.947466 + C= -175.9824 135.677313 95.372227 + D= -199.252552 89.137008 118.642379 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= -92.254617 182.217618 132.559704 + B= -115.52477 135.677313 155.829857 + C= -132.559704 182.217618 92.254617 + D= -155.829857 135.677313 115.52477 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= 175.9824 135.677313 95.372227 + B= 199.252552 89.137008 118.642379 + C= 135.677313 135.677313 135.677313 + D= 158.947466 89.137008 158.947466 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= 135.677313 135.677313 135.677313 + B= 158.947466 89.137008 158.947466 + C= 95.372227 135.677313 175.9824 + D= 118.642379 89.137008 199.252552 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= 132.559704 182.217618 92.254617 + B= 155.829857 135.677313 115.52477 + C= 92.254617 182.217618 132.559704 + D= 115.52477 135.677313 155.829857 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= 95.372227 135.677313 -175.9824 + B= 118.642379 89.137008 -199.252552 + C= 135.677313 135.677313 -135.677313 + D= 158.947466 89.137008 -158.947466 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= 135.677313 135.677313 -135.677313 + B= 158.947466 89.137008 -158.947466 + C= 175.9824 135.677313 -95.372227 + D= 199.252552 89.137008 -118.642379 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= 92.254617 182.217618 -132.559704 + B= 115.52477 135.677313 -155.829857 + C= 132.559704 182.217618 -92.254617 + D= 155.829857 135.677313 -115.52477 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= -95.372227 -135.677313 -175.9824 + B= -118.642379 -89.137008 -199.252552 + C= -135.677313 -135.677313 -135.677313 + D= -158.947466 -89.137008 -158.947466 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= -135.677313 -135.677313 -135.677313 + B= -158.947466 -89.137008 -158.947466 + C= -175.9824 -135.677313 -95.372227 + D= -199.252552 -89.137008 -118.642379 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= -92.254617 -182.217618 -132.559704 + B= -115.52477 -135.677313 -155.829857 + C= -132.559704 -182.217618 -92.254617 + D= -155.829857 -135.677313 -115.52477 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= 175.9824 -135.677313 -95.372227 + B= 199.252552 -89.137008 -118.642379 + C= 135.677313 -135.677313 -135.677313 + D= 158.947466 -89.137008 -158.947466 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= 135.677313 -135.677313 -135.677313 + B= 158.947466 -89.137008 -158.947466 + C= 95.372227 -135.677313 -175.9824 + D= 118.642379 -89.137008 -199.252552 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= 132.559704 -182.217618 -92.254617 + B= 155.829857 -135.677313 -115.52477 + C= 92.254617 -182.217618 -132.559704 + D= 115.52477 -135.677313 -155.829857 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= 95.372227 -135.677313 175.9824 + B= 118.642379 -89.137008 199.252552 + C= 135.677313 -135.677313 135.677313 + D= 158.947466 -89.137008 158.947466 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= 135.677313 -135.677313 135.677313 + B= 158.947466 -89.137008 158.947466 + C= 175.9824 -135.677313 95.372227 + D= 199.252552 -89.137008 118.642379 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= 92.254617 -182.217618 132.559704 + B= 115.52477 -135.677313 155.829857 + C= 132.559704 -182.217618 92.254617 + D= 155.829857 -135.677313 115.52477 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= -175.9824 -135.677313 95.372227 + B= -199.252552 -89.137008 118.642379 + C= -135.677313 -135.677313 135.677313 + D= -158.947466 -89.137008 158.947466 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= -135.677313 -135.677313 135.677313 + B= -158.947466 -89.137008 158.947466 + C= -95.372227 -135.677313 175.9824 + D= -118.642379 -89.137008 199.252552 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + A= -132.559704 -182.217618 92.254617 + B= -155.829857 -135.677313 115.52477 + C= -92.254617 -182.217618 132.559704 + D= -115.52477 -135.677313 155.829857 diff --git a/Projects/Paris/DetectorConfigurtation/Paris3by3_CsIshield.detector b/Projects/Paris/DetectorConfigurtation/Paris3by3_CsIshield.detector new file mode 100644 index 0000000000000000000000000000000000000000..cac61df33107b0ecab430bbfd0a7e178e52fabd9 --- /dev/null +++ b/Projects/Paris/DetectorConfigurtation/Paris3by3_CsIshield.detector @@ -0,0 +1,124 @@ +%Fichier de configuration manip E225 +%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 +%Thickness in micrometer +%Radius in mm +%Temperature in K, Pressure in bar +%Material name according to the target library + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 10.3 + ANGLE= 0 + RADIUS= 12 + MATERIAL= CD2 + NBLAYERS= 50 + X= 0 + Y= 0 + Z= 0 +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and R given in mm +%%Angle given in degree +%%Option: 0,1 for Si SiLi and CsI +%%Option: all or sensible for VISualisation +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ParisCluster + A= -84.5 84.5 0 + B= 84.5 84.5 0 + C= -84.5 -84.5 0 + D= 84.5 -84.5 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +%ParisCluster +% A= -84.5 -235 84.5 +% B= 84.5 -235 84.5 +% C= -84.5 -235 -84.5 +% D= 84.5 -235 -84.5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 = centre of the volume +%ParisClShield +% X1_Y1= 117.94 31.125 0. +% X1_Y128= 117.94 -31.125 0. +% X128_Y1= -117.94 31.125 0. +% X128_Y128= -117.94 -31.125 0. +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%A one bottom corner +%ParisClShield +% X1_Y1= 31.125 62.25 75. +% X1_Y128= 31.125 0. 75. +% X128_Y1= -204.75 62.25 75. +% X128_Y128= -204.75 0. 75. +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0A on top corner +%ParisClShield +% X1_Y1= -31.125. 62.25 -75. +% X1_Y128= -31.125. 0. -75. +% X128_Y1= -267. 62.25 -75. +% X128_Y128= -267. 0. -75. +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% from bottom corner +ParisClShield + X1_Y1= 151.375 153.75 156. + X128_Y1= -84.5 153.75 156. + X128_Y128= -84.5 91.5 156. + X1_Y128= 151.375 91.5 156. + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% from top corner +%ParisClShield +% X1_Y1= 146.375 153.75 77 +% X128_Y1= -89.5 153.75 77. +% X128_Y128= -89.5 91.5 77. +% X1_Y128= 146.375 91.5 77. +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% from bottom corner +ParisClShield + X1_Y1= 153.75 -151.375 156 + X128_Y1= 153.75 84.5 156. + X128_Y128= 91.5 84.5 156. + X1_Y128= 91.5 -151.375 156. + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% from top corner +%ParisClShield +% X1_Y1= 153.75 -146.625 77 +% X128_Y1= 153.75 89.25 77. +% X128_Y128= 91.5 89.25 77. +% X1_Y128= 91.5 -146.625 77. +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% from bottom corner +ParisClShield + X1_Y1= -151.375 -153.75 156 + X128_Y1= 84.25 -153.75 156. + X128_Y128= 84.25 -91.5 156. + X1_Y128= -151.375 -91.5 156. + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% from top corner +%ParisClShield +% X1_Y1= -146.625 -153.75 77 +% X128_Y1= 89.25 -153.75 77. +% X128_Y128= 89.25 -91.5 77. +% X1_Y128= -146.625 -91.5 77. +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% from bottom corner +ParisClShield + X1_Y1= -153.75 151.375 156 + X128_Y1= -153.75 -84.5 156. + X128_Y128= -91.5 -84.5 156. + X1_Y128= -91.5 151.375 156. + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% from top corner +%ParisClShield +% X1_Y1= -153.75 146.375 77 +% X128_Y1= -153.75 -89.5 77. +% X128_Y128= -91.5 -89.5 77. +% X1_Y128= -91.5 146.375 77. +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0A +%ParisClShield +% THETA= 0. +% PHI= 0. +% R= 150. +% BETA= 0. 0. 0. +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Projects/Paris/DetectorConfigurtation/Paris3by3_CsIshield208.detector b/Projects/Paris/DetectorConfigurtation/Paris3by3_CsIshield208.detector new file mode 100644 index 0000000000000000000000000000000000000000..98601b6466db8840e2db56959541b2f6eb38d772 --- /dev/null +++ b/Projects/Paris/DetectorConfigurtation/Paris3by3_CsIshield208.detector @@ -0,0 +1,674 @@ +%Fichier de configuration manip E225 +%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 +%Thickness in micrometer +%Radius in mm +%Temperature in K, Pressure in bar +%Material name according to the target library + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Target +% THICKNESS= 10.3 +% ANGLE= 0 +% RADIUS= 12 +% MATERIAL= CD2l +% NBLAYERS= 50 +% X= 0 +% Y= 0 +% Z= 0 +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and R given in mm +%%Angle given in degree +%%Option: 0,1 for Si SiLi and CsI +%%Option: all or sensible for VISualisation +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + X1_Y1= -50.418664 -87.327687 -217.661051 + X1_Y128= -188.406586 -87.327687 -120.088856 + X128_Y1= 18.575297 -206.828733 -120.088856 + X128_Y128= -119.412625 -206.828733 -22.51666 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%% 1 +%ShieldClParis +%X1_Y1= -334.9677217 -148.6692001 -211.5267063 +%X1_Y128= -309.5542658 -192.6865973 -175.586652 +%X128_Y1= -142.3765903 -148.6692 -347.7092004 +%X128_Y128= -116.9631343 -192.6865972 -311.7691461 +%VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -212.3401423 -364.4251571 -33.9914984 +X1_Y128= -161.51323 -364.4251571 -69.93155248 +X128_Y1= -308.6357072 -197.6363448 -170.1739932 +X128_Y128= -257.8087949 -197.6363448 -206.1140473 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 37.76296724 -366.1045357 -208.7842915 +X1_Y128= 12.34951131 -322.0871385 -244.7243458 +X128_Y1= -154.8281642 -366.1045357 -72.60179742 +X128_Y128= -180.2416202 -322.0871385 -108.5418517 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -84.86461219 -150.3485787 -386.3194994 +X1_Y128= -135.6915245 -150.3485787 -350.3794453 +X128_Y1= 11.43095278 -317.137391 -250.1370047 +X128_Y128= -39.3959595 -317.137391 -214.1969506 +VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +ParisCluster + X1_Y1= -190.237216 -86.499477 -117.780059 + X1_Y128= -239.023313 -1.999477 20.207863 + X128_Y1= -121.243255 -206.000523 -20.207863 + X128_Y128= -170.029352 -121.500523 117.780059 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 2 +%ShieldClParis +%X1_Y1= -421.6181269 2.264017201 35.81176364 +%X1_Y128= -396.1220195 -41.89653619 71.51689679 +%X128_Y1= -353.971956 -114.9025878 -157.4057249 +%X128_Y128= -328.4758486 -159.0631412 -121.7005917 +%VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -297.3273652 -213.0138971 212.7697599 +X1_Y128= -279.4747986 -243.9354494 161.7775451 +X128_Y1= -393.9361094 -45.68264358 77.47741798 +X128_Y128= -376.0835428 -76.60419594 26.48520322 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -208.848367 -366.2640172 -35.81176364 +X1_Y128= -234.3444744 -322.1034638 -71.51689679 +X128_Y1= -276.494538 -249.0974122 157.4057249 +X128_Y128= -301.9906454 -204.9368588 121.7005917 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +%ShieldClParis +%X1_Y1= -333.1391288 -150.9861029 -212.7697599 +%X1_Y128= -350.9916954 -120.0645506 -161.7775451 +%X128_Y1= -236.5303845 -318.3173564 -77.47741806 +%X128_Y128= -254.3829511 -287.3958041 -26.48520328 +%VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +ParisCluster + X1_Y1= -238.82525 0 22.51666 + X1_Y128= -169.831289 119.501046 120.088856 + X128_Y1= -169.831289 -119.501046 120.088856 + X128_Y128= -100.837328 0 217.661051 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 3 +ShieldClParis +X1_Y1= -298.1743452 215.7559566 208.784291 +X1_Y128= -272.7608891 171.7385595 244.7243453 +X128_Y1= -394.4699107 48.9671447 72.60179615 +X128_Y128= -369.0564547 4.949747549 108.5418504 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -172.637996 1.679378555 386.3194988 +X1_Y128= -198.0514521 -42.33801856 350.3794445 +X128_Y1= -268.9335614 168.4681906 250.1370041 +X128_Y128= -294.3470175 124.4507935 214.1969498 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -296.2351659 -215.7559566 211.5267047 +X1_Y128= -321.6486219 -171.7385595 175.5866504 +X128_Y1= -199.9396004 -48.9671447 347.7091996 +X128_Y128= -225.3530564 -4.949747549 311.7691453 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -421.7715151 -1.679378528 33.99149691 +X1_Y128= -396.358059 42.33801857 69.9315512 +X128_Y1= -325.4759497 -168.4681907 170.1739916 +X128_Y128= -300.0624936 -124.4507936 206.1140459 +VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +ParisCluster + X1_Y1= -167.720555 121.500523 121.045191 + X1_Y128= -21.362262 206.000523 121.045191 + X128_Y1= -98.726594 1.999477 218.617387 + X128_Y128= 47.631699 86.499477 218.617387 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 4 +ShieldClParis +X1_Y1= -35.85246778 366.2640171 208.8413835 +X1_Y128= -10.68804787 322.1034637 244.7810551 +X128_Y1= -240.5683866 249.0974121 208.2129755 +X128_Y128= -215.4039666 204.9368587 244.1526471 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 89.5548772 150.9861028 385.009836 +X1_Y128= 35.52810055 120.0645505 384.8439923 +X128_Y1= -5.797051298 318.3173563 248.8287913 +X128_Y128= -59.82382795 287.395804 248.6629475 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -174.3030301 -2.264017362 385.5681276 +X1_Y128= -199.46745 41.89653603 349.6284561 +X128_Y1= 30.41288869 114.9025876 386.1965356 +X128_Y128= 5.248468782 159.063141 350.256864 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -299.7103751 213.013897 209.399675 +X1_Y128= -245.6835984 243.9354493 209.5655188 +X128_Y1= -204.3584466 45.68264341 345.5807198 +X128_Y128= -150.33167 76.60419575 345.7465636 +VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +ParisCluster + X1_Y1= -18.575297 206.828733 120.088856 + X1_Y128= 119.412625 206.828733 22.51666 + X128_Y1= 50.418664 87.327687 217.661051 + X128_Y128= 188.406586 87.327687 120.088856 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 5 +ShieldClParis +X1_Y1= 209.4313732 366.1045359 33.99149673 +X1_Y128= 234.8448293 322.0871387 69.93155092 +X128_Y1= 16.84024247 366.104536 170.1739919 +X128_Y128= 42.25369861 322.0871388 206.1140461 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 335.9373126 150.3485792 208.7842904 +X1_Y128= 285.1104005 150.3485792 244.7243447 +X128_Y1= 239.6417468 317.1373913 72.60179588 +X128_Y128= 188.8148347 317.1373913 108.5418502 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 87.77338339 148.6692006 386.3194987 +X1_Y128= 62.35992725 192.6865977 350.3794445 +X128_Y1= 280.3645141 148.6692005 250.1370036 +X128_Y128= 254.951058 192.6865977 214.1969494 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -38.73255596 364.4251573 211.5267051 +X1_Y128= 12.09435614 364.4251573 175.5866507 +X128_Y1= 57.56300972 197.6363452 347.7091996 +X128_Y128= 108.3899218 197.6363452 311.7691452 +VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +ParisCluster + X1_Y1= 121.243255 206.000523 20.207863 + X1_Y128= 170.029352 121.500523 -117.780059 + X128_Y1= 190.237216 86.499477 117.780059 + X128_Y128= 239.023313 1.999477 -20.207863 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 6 +ShieldClParis +X1_Y1= 295.6735001 215.8784753 -212.1865178 +X1_Y128= 321.1696075 171.717922 -176.4813846 +X128_Y1= 228.0273291 333.0450805 -18.96902942 +X128_Y128= 253.5234365 288.8845271 16.73610377 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 421.3265059 -1.758914768 -39.11949374 +X1_Y128= 403.4739393 29.16263761 11.87272101 +X128_Y1= 324.7177617 165.5723387 -174.4118357 +X128_Y128= 306.8651951 196.493891 -123.419621 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 334.7929938 148.1215246 212.1865178 +X1_Y128= 309.2968865 192.282078 176.4813846 +X128_Y1= 402.4391648 30.95491952 18.96902942 +X128_Y128= 376.9430575 75.11547288 -16.73610377 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 209.1399881 365.7589148 39.11949372 +X1_Y128= 226.9925547 334.8373624 -11.87272102 +X128_Y1= 305.7487323 198.4276614 174.4118358 +X128_Y128= 323.6012989 167.506109 123.419621 +VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +ParisCluster + X1_Y1= 169.831289 119.501046 -120.088856 + X1_Y128= 100.837328 0 -217.661051 + X128_Y1= 238.82525 0 -22.51666 + X128_Y128= 169.831289 -119.501046 -120.088856 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 7 +ShieldClParis +X1_Y1= 172.6379967 1.679378615 -386.3194985 +X1_Y128= 198.0514528 -42.3380185 -350.3794441 +X128_Y1= 268.9335619 168.4681907 -250.1370035 +X128_Y128= 294.3470179 124.4507935 -214.1969492 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 296.2351663 -215.7559566 -211.5267042 +X1_Y128= 321.6486223 -171.7385595 -175.5866499 +X128_Y1= 199.9396011 -48.96714461 -347.7091992 +X128_Y128= 225.3530571 -4.949747477 -311.7691448 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 421.7715152 -1.679378615 -33.99149608 +X1_Y128= 396.3580592 42.3380185 -69.93155041 +X128_Y1= 325.47595 -168.4681907 -170.173991 +X128_Y128= 300.062494 -124.4507935 -206.1140454 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 298.1743456 215.7559566 -208.7842904 +X1_Y128= 272.7608897 171.7385595 -244.7243447 +X128_Y1= 394.4699109 48.96714468 -72.60179535 +X128_Y128= 369.0564549 4.949747536 -108.5418497 +VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 +ParisCluster + X1_Y1= 98.726594 -1.999477 -218.617387 + X1_Y128= -47.631699 -86.499477 -218.617387 + X128_Y1= 167.720555 -121.500523 -121.045191 + X128_Y128= 21.362262 -206.000523 -121.045191 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 8 +ShieldClParis +X1_Y1= -88.45370297 -148.1215245 -386.374701 +X1_Y128= -63.28928301 -192.2820779 -350.4350294 +X128_Y1= 116.2622157 -30.95491938 -385.7462932 +X128_Y128= 141.4266357 -75.11547275 -349.8066216 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 32.83111694 -365.7589147 -210.2189031 +X1_Y128= 86.85789358 -334.8373623 -210.0530594 +X128_Y1= -62.52081164 -198.4276612 -346.3999479 +X128_Y128= -8.494035002 -167.5061088 -346.2341042 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 298.6092008 -215.8784752 -208.0348102 +X1_Y128= 273.4447809 -171.7179219 -243.9744817 +X128_Y1= 93.89328213 -333.0450804 -208.663218 +X128_Y128= 68.72886217 -288.884527 -244.6028895 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 177.3243809 1.758914928 -384.190608 +X1_Y128= 123.2976043 -29.16263747 -384.3564517 +X128_Y1= 272.6763096 -165.5723385 -248.0095632 +X128_Y128= 218.6495329 -196.4938909 -248.175407 +VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 +ParisCluster + X1_Y1= 50.418664 -87.327687 217.661051 + X1_Y128= 188.406586 -87.327687 120.088856 + X128_Y1= -18.575297 -206.828733 120.088856 + X128_Y128= 119.412625 -206.828733 22.51666 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 9 +ShieldClParis +X1_Y1= 334.9677226 -148.6692001 211.5267049 +X1_Y128= 309.5542665 -192.6865973 175.5866508 +X128_Y1= 142.3765917 -148.6692 347.7091998 +X128_Y128= 116.9631356 -192.6865972 311.7691457 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 212.3401425 -364.4251571 33.99149755 +X1_Y128= 161.5132303 -364.4251571 69.93155184 +X128_Y1= 308.6357079 -197.6363448 170.173992 +X128_Y128= 257.8087958 -197.6363448 206.1140463 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -37.7629664 -366.1045357 208.7842917 +X1_Y128= -12.34951033 -322.0871385 244.7243459 +X128_Y1= 154.8281645 -366.1045357 72.6017968 +X128_Y128= 180.2416206 -322.0871385 108.541851 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 84.86461374 -150.3485787 386.3194991 +X1_Y128= 135.6915259 -150.3485787 350.3794448 +X128_Y1= -11.43095178 -317.137391 250.1370047 +X128_Y128= 39.39596036 -317.137391 214.1969504 +VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 +ParisCluster + X1_Y1= 190.237216 -86.499477 117.780059 + X1_Y128= 239.023313 -1.999477 -20.207863 + X128_Y1= 121.243255 -206.000523 20.207863 + X128_Y128= 170.029352 -121.500523 -117.780059 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 10 +ShieldClParis +X1_Y1= 421.6181269 2.264017214 -35.81176364 +X1_Y128= 396.1220195 -41.89653617 -71.51689679 +X128_Y1= 353.971956 -114.9025878 157.4057249 +X128_Y128= 328.4758486 -159.0631412 121.7005917 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 297.3273652 -213.013897 -212.7697599 +X1_Y128= 279.4747986 -243.9354494 -161.7775451 +X128_Y1= 393.9361094 -45.68264357 -77.47741798 +X128_Y128= 376.0835428 -76.60419593 -26.48520322 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 208.8483671 -366.2640172 35.81176364 +X1_Y128= 234.3444744 -322.1034638 71.51689679 +X128_Y1= 276.494538 -249.0974122 -157.4057249 +X128_Y128= 301.9906454 -204.9368588 -121.7005917 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 333.1391288 -150.9861029 212.7697599 +X1_Y128= 350.9916954 -120.0645506 161.7775451 +X128_Y1= 236.5303846 -318.3173564 77.47741806 +X128_Y128= 254.3829511 -287.3958041 26.48520328 +VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 +ParisCluster + X1_Y1= 167.720555 121.500523 -121.045191 + X1_Y128= 21.362262 206.000523 -121.045191 + X128_Y1= 98.726594 1.999477 -218.617387 + X128_Y128= -47.631699 86.499477 -218.617387 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 11 +ShieldClParis +X1_Y1= 35.85246778 366.2640171 -208.8413835 +X1_Y128= 10.68804787 322.1034637 -244.7810551 +X128_Y1= 240.5683866 249.0974121 -208.2129755 +X128_Y128= 215.4039666 204.9368587 -244.1526471 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -89.5548772 150.9861028 -385.009836 +X1_Y128= -35.52810055 120.0645505 -384.8439923 +X128_Y1= 5.797051298 318.3173563 -248.8287913 +X128_Y128= 59.82382795 287.395804 -248.6629475 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 174.3030301 -2.264017362 -385.5681276 +X1_Y128= 199.46745 41.89653603 -349.6284561 +X128_Y1= -30.41288869 114.9025876 -386.1965356 +X128_Y128= -5.248468782 159.063141 -350.256864 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 299.7103751 213.013897 -209.399675 +X1_Y128= 245.6835984 243.9354493 -209.5655188 +X128_Y1= 204.3584466 45.68264341 -345.5807198 +X128_Y128= 150.33167 76.60419575 -345.7465636 +VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 +ParisCluster + X1_Y1= 18.575297 206.828733 -120.088856 + X1_Y128= -119.412625 206.828733 -22.51666 + X128_Y1= -50.418664 87.327687 -217.661051 + X128_Y128= -188.406586 87.327687 -120.088856 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 12 +ShieldClParis +X1_Y1= -209.4313732 366.1045359 -33.99149673 +X1_Y128= -234.8448293 322.0871387 -69.93155092 +X128_Y1= -16.84024247 366.104536 -170.1739919 +X128_Y128= -42.25369861 322.0871388 -206.1140461 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -335.9373126 150.3485792 -208.7842904 +X1_Y128= -285.1104005 150.3485792 -244.7243447 +X128_Y1= -239.6417468 317.1373913 -72.60179588 +X128_Y128= -188.8148347 317.1373913 -108.5418502 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -87.77338339 148.6692006 -386.3194987 +X1_Y128= -62.35992725 192.6865977 -350.3794445 +X128_Y1= -280.3645141 148.6692005 -250.1370036 +X128_Y128= -254.951058 192.6865977 -214.1969494 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 38.73255596 364.4251573 -211.5267051 +X1_Y128= -12.09435614 364.4251573 -175.5866507 +X128_Y1= -57.56300972 197.6363452 -347.7091996 +X128_Y128= -108.3899218 197.6363452 -311.7691452 +VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 +ParisCluster + X1_Y1= -121.243255 206.000523 -20.207863 + X1_Y128= -170.029352 121.500523 117.780059 + X128_Y1= -190.237216 86.499477 -117.780059 + X128_Y128= -239.023313 1.999477 20.207863 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 13 +ShieldClParis +X1_Y1= -295.6735001 215.8784753 212.1865178 +X1_Y128= -321.1696075 171.717922 176.4813846 +X128_Y1= -228.0273291 333.0450805 18.96902942 +X128_Y128= -253.5234365 288.8845271 -16.73610377 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -421.3265059 -1.758914768 39.11949374 +X1_Y128= -403.4739393 29.16263761 -11.87272101 +X128_Y1= -324.7177617 165.5723387 174.4118357 +X128_Y128= -306.8651951 196.493891 123.419621 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -334.7929938 148.1215246 -212.1865178 +X1_Y128= -309.2968865 192.282078 -176.4813846 +X128_Y1= -402.4391648 30.95491952 -18.96902942 +X128_Y128= -376.9430575 75.11547288 16.73610377 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -209.1399881 365.7589148 -39.11949372 +X1_Y128= -226.9925547 334.8373624 11.87272102 +X128_Y1= -305.7487323 198.4276614 -174.4118358 +X128_Y128= -323.6012989 167.506109 -123.419621 +VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 +ParisCluster + X1_Y1= -98.726594 -1.999477 218.617387 + X1_Y128= 47.631699 -86.499477 218.617387 + X128_Y1= -167.720555 -121.500523 121.045191 + X128_Y128= -21.362262 -206.000523 121.045191 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 14 +ShieldClParis +X1_Y1= 88.45370297 -148.1215245 386.374701 +X1_Y128= 63.28928301 -192.2820779 350.4350294 +X128_Y1= -116.2622157 -30.95491938 385.7462932 +X128_Y128= -141.4266357 -75.11547275 349.8066216 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -32.83111694 -365.7589147 210.2189031 +X1_Y128= -86.85789358 -334.8373623 210.0530594 +X128_Y1= 62.52081164 -198.4276612 346.3999479 +X128_Y128= 8.494035002 -167.5061088 346.2341042 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -298.6092008 -215.8784752 208.0348102 +X1_Y128= -273.4447809 -171.7179219 243.9744817 +X128_Y1= -93.89328213 -333.0450804 208.663218 +X128_Y128= -68.72886217 -288.884527 244.6028895 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -177.3243809 1.758914928 384.190608 +X1_Y128= -123.2976043 -29.16263747 384.3564517 +X128_Y1= -272.6763096 -165.5723385 248.0095632 +X128_Y128= -218.6495329 -196.4938909 248.175407 +VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 +ParisCluster + X1_Y1= 189.082817 -84.5 121.045191 + X1_Y128= 51.094895 -84.5 218.617387 + X128_Y1= 189.082817 84.5 121.045191 + X128_Y128= 51.094895 84.5 218.617387 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 15 +ShieldClParis +X1_Y1= 333.7526679 153.75 209.8083586 +X1_Y128= 333.7526678 91.49999999 209.8083586 +X128_Y1= 141.1615368 153.7500001 345.9908533 +X128_Y128= 141.1615367 91.50000008 345.9908533 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 335.6918472 -151.375 208.4371517 +X1_Y128= 284.864935 -151.375 244.377206 +X128_Y1= 335.6918472 84.49999999 208.4371517 +X128_Y128= 284.8649351 84.5 244.3772059 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 86.55832786 -153.75 384.6011525 +X1_Y128= 86.55832788 -91.49999999 384.6011525 +X128_Y1= 279.1494589 -153.7500001 248.4186578 +X128_Y128= 279.149459 -91.50000008 248.4186578 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 84.61914852 151.375 385.9723594 +X1_Y128= 135.4460607 151.375 350.0323051 +X128_Y1= 84.6191484 -84.49999996 385.9723595 +X128_Y128= 135.4460606 -84.5 350.0323052 +VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 +ParisCluster + X1_Y1= 117.780059 208 20.207863 + X1_Y128= -20.207863 208 117.780059 + X128_Y1= 20.207863 208 -117.780059 + X128_Y128= -117.780059 208 -20.207863 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 16 +ShieldClParis +X1_Y1= 35.81176366 364 -212.7697599 +X1_Y128= 71.51689679 364 -161.7775451 +X128_Y1= -157.4057249 364 -77.47741806 +X128_Y128= -121.7005917 364 -26.48520328 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 212.7697599 364 35.81176364 +X1_Y128= 161.7775451 364 71.51689679 +X128_Y1= 77.47741802 364 -157.4057249 +X128_Y128= 26.48520325 364 -121.7005917 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -35.81176363 364 212.7697599 +X1_Y128= -71.51689678 364 161.7775451 +X128_Y1= 157.4057248 364 77.47741798 +X128_Y128= 121.7005917 364 26.48520322 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -212.7697599 364 -35.81176364 +X1_Y128= -161.7775451 364 -71.51689679 +X128_Y1= -77.47741802 364 157.4057249 +X128_Y128= -26.48520325 364 121.7005917 +VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 +ParisCluster + X1_Y1= -51.094895 84.5 -218.617387 + X1_Y128= -189.082817 84.5 -121.045191 + X128_Y1= -51.094895 -84.5 -218.617387 + X128_Y128= -189.082817 -84.5 -121.045191 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 17 +ShieldClParis +X1_Y1= -333.7526679 153.75 -209.8083586 +X1_Y128= -333.7526678 91.49999999 -209.8083586 +X128_Y1= -141.1615368 153.7500001 -345.9908533 +X128_Y128= -141.1615367 91.50000008 -345.9908533 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -335.6918472 -151.375 -208.4371517 +X1_Y128= -284.864935 -151.375 -244.377206 +X128_Y1= -335.6918472 84.49999999 -208.4371517 +X128_Y128= -284.8649351 84.5 -244.3772059 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -86.55832786 -153.75 -384.6011525 +X1_Y128= -86.55832788 -91.49999999 -384.6011525 +X128_Y1= -279.1494589 -153.7500001 -248.4186578 +X128_Y128= -279.149459 -91.50000008 -248.4186578 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -84.61914852 151.375 -385.9723594 +X1_Y128= -135.4460607 151.375 -350.0323051 +X128_Y1= -84.6191484 -84.49999996 -385.9723595 +X128_Y128= -135.4460606 -84.5 -350.0323052 +VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18 +ParisCluster + X1_Y1= 20.207863 -208 -117.780059 + X1_Y128= -117.780059 -208 -20.207863 + X128_Y1= 117.780059 -208 20.207863 + X128_Y128= -20.207863 -208 117.780059 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%% 18 +ShieldClParis +X1_Y1= 212.1865178 -364 39.11949374 +X1_Y128= 176.4813846 -364 -11.87272101 +X128_Y1= 18.96902938 -364 174.4118357 +X128_Y128= -16.73610379 -364 123.419621 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= 39.11949373 -364 -212.1865178 +X1_Y128= -11.87272101 -364 -176.4813846 +X128_Y1= 174.4118357 -364 -18.96902942 +X128_Y128= 123.419621 -364 16.73610377 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -212.1865178 -364 -39.11949372 +X1_Y128= -176.4813846 -364 11.87272102 +X128_Y1= -18.96902945 -364 -174.4118358 +X128_Y128= 16.73610374 -364 -123.419621 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis +X1_Y1= -39.11949373 -364 212.1865178 +X1_Y128= 11.87272101 -364 176.4813846 +X128_Y1= -174.4118357 -364 18.96902942 +X128_Y128= -123.419621 -364 -16.73610377 +VIS=all +%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/Paris3by3module.detector b/Projects/Paris/DetectorConfigurtation/Paris3by3module.detector similarity index 73% rename from Inputs/DetectorConfiguration/Paris3by3module.detector rename to Projects/Paris/DetectorConfigurtation/Paris3by3module.detector index 59dca7e8485745fe1ee2f7f6c095e180028dffe1..4f6ca3ed85d6edb2a1ffd6dd8b3266cfa805d58e 100644 --- a/Inputs/DetectorConfiguration/Paris3by3module.detector +++ b/Projects/Paris/DetectorConfigurtation/Paris3by3module.detector @@ -9,14 +9,14 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2l - NBLAYERS= 50 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 10.3 + ANGLE= 0 + RADIUS= 12 + MATERIAL= CD2l + NBLAYERS= 50 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% %%Position and R given in mm %%Angle given in degree @@ -27,9 +27,9 @@ Target Paris %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 ParisCluster - X1_Y1= -84.5 -235 84.5 - X1_Y128= 84.5 -235 84.5 - X128_Y1= -84.5 -235 -84.5 - X128_Y128= 84.5 -235 -84.5 - VIS= all + X1_Y1= -84.5 -235 84.5 + X1_Y128= 84.5 -235 84.5 + X128_Y1= -84.5 -235 -84.5 + X128_Y128= 84.5 -235 -84.5 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 diff --git a/Projects/Paris/DetectorConfigurtation/ParisAll_208.detector b/Projects/Paris/DetectorConfigurtation/ParisAll_208.detector new file mode 100644 index 0000000000000000000000000000000000000000..fed778f5c98e20bf917787e8941670ca67954479 --- /dev/null +++ b/Projects/Paris/DetectorConfigurtation/ParisAll_208.detector @@ -0,0 +1,792 @@ +%Fichier de configuration manip E225 +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and R given in mm +%%Angle given in degree +%%Option: 0,1 for Si SiLi and CsI +%%Option: all or sensible for VISualisation +%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 +%Thickness in micrometer +%Radius in mm +%Temperature in K, Pressure in bar +%Material name according to the target library + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 10.3 + ANGLE= 0 + RADIUS= 12 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 + NBLAYERS= 50 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ParisCluster + X1_Y1= -84.5 -208 84.5 + X1_Y128= 84.5 -208 84.5 + X128_Y1= -84.5 -208 -84.5 + X128_Y128= 84.5 -208 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + X1_Y1= -206.8287414 -87.3276796 84.5 + X1_Y128= -87.32769537 -206.8287256 84.5 + X128_Y1= -206.8287414 -87.3276796 -84.5 + X128_Y128= -87.32769537 -206.8287256 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -208 84.50001115 84.5 + X1_Y128= -208 -84.49998885 84.5 + X128_Y1= -208 84.50001115 -84.5 + X128_Y128= -208 -84.49998885 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -87.3276796 206.8287414 84.5 + X1_Y128= -206.8287256 87.32769537 84.5 + X128_Y1= -87.3276796 206.8287414 -84.5 + X128_Y128= -206.8287256 87.32769537 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 84.50000557 208 84.5 + X1_Y128= -84.49999443 208 84.5 + X128_Y1= 84.50000557 208 -84.5 + X128_Y128= -84.49999443 208 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 206.8287335 87.32768749 84.5 + X1_Y128= 87.32768749 206.8287335 84.5 + X128_Y1= 206.8287335 87.32768749 -84.5 + X128_Y128= 87.32768749 206.8287335 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 208 -84.50002229 84.5 + X1_Y128= 208 84.49997771 84.5 + X128_Y1= 208 -84.50002229 -84.5 + X128_Y128= 208 84.49997771 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 87.32767172 -206.8287493 84.5 + X1_Y128= 206.8287177 -87.32770325 84.5 + X128_Y1= 87.32767172 -206.8287493 -84.5 + X128_Y128= 206.8287177 -87.32770325 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 84.5 84.5 -208 + X1_Y128= -84.5 84.5 -208 + X128_Y1= 84.5 -84.5 -208 + X128_Y128= -84.5 -84.5 -208 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 206.8287335 84.49998424 -87.32768749 + X1_Y128= 87.32768749 84.49998424 -206.8287335 + X128_Y1= 206.8287335 -84.50001576 -87.32768749 + X128_Y128= 87.32768749 -84.50001576 -206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 87.32768749 84.49998424 206.8287335 + X1_Y128= 206.8287335 84.49998424 87.32768749 + X128_Y1= 87.32768749 -84.50001576 206.8287335 + X128_Y128= 206.8287335 -84.50001576 87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.5 84.5 208 + X1_Y128= 84.5 84.5 208 + X128_Y1= -84.5 -84.5 208 + X128_Y128= 84.5 -84.5 208 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -206.8287335 84.50000788 87.32768749 + X1_Y128= -87.32768749 84.50000788 206.8287335 + X128_Y1= -206.8287335 -84.49999212 87.32768749 + X128_Y128= -87.32768749 -84.49999212 206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -87.32768749 84.50000788 -206.8287335 + X1_Y128= -206.8287335 84.50000788 -87.32768749 + X128_Y1= -87.32768749 -84.49999212 -206.8287335 + X128_Y128= -206.8287335 -84.49999212 -87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.49999606 87.32768749 -206.8287335 + X1_Y128= 84.50000394 87.32768749 -206.8287335 + X128_Y1= -84.49999606 206.8287335 -87.32768749 + X128_Y128= 84.50000394 206.8287335 -87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.49999606 206.8287335 87.32768749 + X1_Y128= 84.50000394 206.8287335 87.32768749 + X128_Y1= -84.49999606 87.32768749 206.8287335 + X128_Y128= 84.50000394 87.32768749 206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.50001182 -87.32768749 206.8287335 + X1_Y128= 84.49998818 -87.32768749 206.8287335 + X128_Y1= -84.50001182 -206.8287335 87.32768749 + X128_Y128= 84.49998818 -206.8287335 87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.50001182 -206.8287335 -87.32768749 + X1_Y128= 84.49998818 -206.8287335 -87.32768749 + X128_Y1= -84.50001182 -87.32768749 -206.8287335 + X128_Y128= 84.49998818 -87.32768749 -206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -128.6063166 143.3590149 -88.30123599 + X1_Y128= -151.8764696 96.81870993 -111.571389 + X128_Y1= -88.30122956 143.3590149 -128.606323 + X128_Y128= -111.5713826 96.81870993 -151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -88.30122956 143.3590149 128.606323 + X1_Y128= -111.5713826 96.81870993 151.876476 + X128_Y1= -128.6063166 143.3590149 88.30123599 + X128_Y128= -151.8764696 96.81870993 111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 128.606323 143.3590085 88.30123599 + X1_Y128= 151.876476 96.81870349 111.571389 + X128_Y1= 88.30123599 143.3590085 128.606323 + X128_Y128= 111.571389 96.81870349 151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 88.30123599 143.3590085 -128.606323 + X1_Y128= 111.571389 96.81870349 -151.876476 + X128_Y1= 128.606323 143.3590085 -88.30123599 + X128_Y128= 151.876476 96.81870349 -111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -88.30124243 -143.3590021 -128.606323 + X1_Y128= -111.5713954 -96.81869706 -151.876476 + X128_Y1= -128.6063294 -143.3590021 -88.30123599 + X128_Y128= -151.8764824 -96.81869706 -111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 128.6063101 -143.3590214 -88.30123599 + X1_Y128= 151.8764631 -96.81871636 -111.571389 + X128_Y1= 88.30122312 -143.3590214 -128.606323 + X128_Y128= 111.5713761 -96.81871636 -151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 88.30122312 -143.3590214 128.606323 + X1_Y128= 111.5713761 -96.81871636 151.876476 + X128_Y1= 128.6063101 -143.3590214 88.30123599 + X128_Y128= 151.8764631 -96.81871636 111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -128.6063294 -143.3590021 88.30123599 + X1_Y128= -151.8764824 -96.81869706 111.571389 + X128_Y1= -88.30124243 -143.3590021 128.606323 + X128_Y128= -111.5713954 -96.81869706 151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Shield +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ShieldClParis + X1_Y1= 151.375 153.75 364 + X1_Y128= 151.375 91.5 364 + X128_Y1= -84.5 153.75 364 + X128_Y128= -84.5 91.5 364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 -151.375 364 + X1_Y128= 91.49999999 -151.375 364 + X128_Y1= 153.75 84.49999999 364 + X128_Y128= 91.50000004 84.5 364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 -153.75 364 + X1_Y128= -151.375 -91.49999999 364 + X128_Y1= 84.49999997 -153.7500001 364 + X128_Y128= 84.5 -91.50000008 364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 151.375 364 + X1_Y128= -91.49999998 151.375 364 + X128_Y1= -153.7500001 -84.49999996 364 + X128_Y128= -91.50000013 -84.5 364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ShieldClParis + X1_Y1= 151.375 -148.6692007 366.104536 + X1_Y128= 151.375 -192.6865979 322.0871388 + X128_Y1= -84.5 -148.6692007 366.104536 + X128_Y128= -84.5 -192.6865979 322.0871388 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 -364.4251574 150.3485793 + X1_Y128= 91.49999999 -364.4251574 150.3485793 + X128_Y1= 153.75 -197.6363454 317.1373914 + X128_Y128= 91.50000004 -197.6363453 317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 -366.104536 148.6692008 + X1_Y128= -151.375 -322.0871388 192.6865979 + X128_Y1= 84.49999997 -366.104536 148.6692007 + X128_Y128= 84.5 -322.0871389 192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 -150.3485793 364.4251574 + X1_Y128= -91.49999998 -150.3485793 364.4251574 + X128_Y1= -153.7500001 -317.1373913 197.6363454 + X128_Y128= -91.50000013 -317.1373914 197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +ShieldClParis + X1_Y1= 151.375 -364 153.75 + X1_Y128= 151.375 -364 91.5 + X128_Y1= -84.5 -364 153.75 + X128_Y128= -84.5 -364 91.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 -364 -151.375 + X1_Y128= 91.49999999 -364 -151.375 + X128_Y1= 153.75 -364 84.49999999 + X128_Y128= 91.50000004 -364 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 -364 -153.75 + X1_Y128= -151.375 -364 -91.49999999 + X128_Y1= 84.49999997 -364 -153.7500001 + X128_Y128= 84.5 -364 -91.50000008 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 -364 151.375 + X1_Y128= -91.49999998 -364 151.375 + X128_Y1= -153.7500001 -364 -84.49999996 + X128_Y128= -91.50000013 -364 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +ShieldClParis + X1_Y1= 151.375 -366.104536 -148.6692007 + X1_Y128= 151.375 -322.0871388 -192.6865979 + X128_Y1= -84.5 -366.104536 -148.6692007 + X128_Y128= -84.5 -322.0871388 -192.6865979 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 -150.3485793 -364.4251574 + X1_Y128= 91.49999999 -150.3485793 -364.4251574 + X128_Y1= 153.75 -317.1373914 -197.6363454 + X128_Y128= 91.50000004 -317.1373914 -197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 -148.6692008 -366.104536 + X1_Y128= -151.375 -192.6865979 -322.0871388 + X128_Y1= 84.49999997 -148.6692007 -366.104536 + X128_Y128= 84.5 -192.6865978 -322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 -364.4251574 -150.3485793 + X1_Y128= -91.49999998 -364.4251574 -150.3485793 + X128_Y1= -153.7500001 -197.6363454 -317.1373913 + X128_Y128= -91.50000013 -197.6363453 -317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +ShieldClParis + X1_Y1= 151.375 -153.75 -364 + X1_Y128= 151.375 -91.5 -364 + X128_Y1= -84.5 -153.75 -364 + X128_Y128= -84.5 -91.5 -364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 151.375 -364 + X1_Y128= 91.49999999 151.375 -364 + X128_Y1= 153.75 -84.49999999 -364 + X128_Y128= 91.50000004 -84.5 -364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 153.75 -364 + X1_Y128= -151.375 91.49999999 -364 + X128_Y1= 84.49999997 153.7500001 -364 + X128_Y128= 84.5 91.50000008 -364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 -151.375 -364 + X1_Y128= -91.49999998 -151.375 -364 + X128_Y1= -153.7500001 84.49999996 -364 + X128_Y128= -91.50000013 84.5 -364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +ShieldClParis + X1_Y1= 151.375 148.6692007 -366.104536 + X1_Y128= 151.375 192.6865979 -322.0871388 + X128_Y1= -84.5 148.6692007 -366.104536 + X128_Y128= -84.5 192.6865979 -322.0871388 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 364.4251574 -150.3485793 + X1_Y128= 91.49999999 364.4251574 -150.3485793 + X128_Y1= 153.75 197.6363454 -317.1373914 + X128_Y128= 91.50000004 197.6363453 -317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 366.104536 -148.6692008 + X1_Y128= -151.375 322.0871388 -192.6865979 + X128_Y1= 84.49999997 366.104536 -148.6692007 + X128_Y128= 84.5 322.0871389 -192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 150.3485793 -364.4251574 + X1_Y128= -91.49999998 150.3485793 -364.4251574 + X128_Y1= -153.7500001 317.1373913 -197.6363454 + X128_Y128= -91.50000013 317.1373914 -197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +ShieldClParis + X1_Y1= 151.375 364 -153.75 + X1_Y128= 151.375 364 -91.5 + X128_Y1= -84.5 364 -153.75 + X128_Y128= -84.5 364 -91.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 364 151.375 + X1_Y128= 91.49999999 364 151.375 + X128_Y1= 153.75 364 -84.49999999 + X128_Y128= 91.50000004 364 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 364 153.75 + X1_Y128= -151.375 364 91.49999999 + X128_Y1= 84.49999997 364 153.7500001 + X128_Y128= 84.5 364 91.50000008 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 364 -151.375 + X1_Y128= -91.49999998 364 -151.375 + X128_Y1= -153.7500001 364 84.49999996 + X128_Y128= -91.50000013 364 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +ShieldClParis + X1_Y1= 151.375 366.104536 148.6692007 + X1_Y128= 151.375 322.0871388 192.6865979 + X128_Y1= -84.5 366.104536 148.6692007 + X128_Y128= -84.5 322.0871388 192.6865979 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 150.3485793 364.4251574 + X1_Y128= 91.49999999 150.3485793 364.4251574 + X128_Y1= 153.75 317.1373914 197.6363454 + X128_Y128= 91.50000004 317.1373914 197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 148.6692008 366.104536 + X1_Y128= -151.375 192.6865979 322.0871388 + X128_Y1= 84.49999997 148.6692007 366.104536 + X128_Y128= 84.5 192.6865978 322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 364.4251574 150.3485793 + X1_Y128= -91.49999998 364.4251574 150.3485793 + X128_Y1= -153.7500001 197.6363454 317.1373913 + X128_Y128= -91.50000013 197.6363453 317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 +ShieldClParis + X1_Y1= -150.3485793 153.75 364.4251574 + X1_Y128= -150.3485793 91.5 364.4251574 + X128_Y1= -317.1373914 153.75 197.6363453 + X128_Y128= -317.1373914 91.5 197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -148.6692007 -151.375 366.104536 + X1_Y128= -192.6865979 -151.375 322.0871388 + X128_Y1= -148.6692007 84.49999999 366.104536 + X128_Y128= -192.6865978 84.5 322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364.4251574 -153.75 150.3485793 + X1_Y128= -364.4251574 -91.49999999 150.3485793 + X128_Y1= -197.6363454 -153.7500001 317.1373913 + X128_Y128= -197.6363453 -91.50000008 317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -366.1045359 151.375 148.6692008 + X1_Y128= -322.0871388 151.375 192.6865979 + X128_Y1= -366.104536 -84.49999996 148.6692007 + X128_Y128= -322.0871389 -84.5 192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 +ShieldClParis + X1_Y1= -364 153.75 151.375 + X1_Y128= -364 91.5 151.375 + X128_Y1= -364 153.75 -84.5 + X128_Y128= -364 91.5 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364 -151.375 153.75 + X1_Y128= -364 -151.375 91.49999999 + X128_Y1= -364 84.49999999 153.75 + X128_Y128= -364 84.5 91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364 -153.75 -151.375 + X1_Y128= -364 -91.49999999 -151.375 + X128_Y1= -364 -153.7500001 84.49999997 + X128_Y128= -364 -91.50000008 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364 151.375 -153.75 + X1_Y128= -364 151.375 -91.49999998 + X128_Y1= -364 -84.49999996 -153.7500001 + X128_Y128= -364 -84.5 -91.50000013 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 +ShieldClParis + X1_Y1= -364.4251574 153.75 -150.3485793 + X1_Y128= -364.4251574 91.5 -150.3485793 + X128_Y1= -197.6363453 153.75 -317.1373914 + X128_Y128= -197.6363453 91.5 -317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -366.104536 -151.375 -148.6692007 + X1_Y128= -322.0871388 -151.375 -192.6865979 + X128_Y1= -366.104536 84.49999999 -148.6692007 + X128_Y128= -322.0871389 84.5 -192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -150.3485793 -153.75 -364.4251574 + X1_Y128= -150.3485793 -91.49999999 -364.4251574 + X128_Y1= -317.1373913 -153.7500001 -197.6363454 + X128_Y128= -317.1373914 -91.50000008 -197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -148.6692008 151.375 -366.1045359 + X1_Y128= -192.6865979 151.375 -322.0871388 + X128_Y1= -148.6692007 -84.49999996 -366.104536 + X128_Y128= -192.6865978 -84.5 -322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 +ShieldClParis + X1_Y1= 150.3485793 153.75 -364.4251574 + X1_Y128= 150.3485793 91.5 -364.4251574 + X128_Y1= 317.1373914 153.75 -197.6363453 + X128_Y128= 317.1373914 91.5 -197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 148.6692007 -151.375 -366.104536 + X1_Y128= 192.6865979 -151.375 -322.0871388 + X128_Y1= 148.6692007 84.49999999 -366.104536 + X128_Y128= 192.6865978 84.5 -322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364.4251574 -153.75 -150.3485793 + X1_Y128= 364.4251574 -91.49999999 -150.3485793 + X128_Y1= 197.6363454 -153.7500001 -317.1373913 + X128_Y128= 197.6363453 -91.50000008 -317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 366.1045359 151.375 -148.6692008 + X1_Y128= 322.0871388 151.375 -192.6865979 + X128_Y1= 366.104536 -84.49999996 -148.6692007 + X128_Y128= 322.0871389 -84.5 -192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 +ShieldClParis + X1_Y1= 364 153.75 -151.375 + X1_Y128= 364 91.5 -151.375 + X128_Y1= 364 153.75 84.5 + X128_Y128= 364 91.5 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364 -151.375 -153.75 + X1_Y128= 364 -151.375 -91.49999999 + X128_Y1= 364 84.49999999 -153.75 + X128_Y128= 364 84.5 -91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364 -153.75 151.375 + X1_Y128= 364 -91.49999999 151.375 + X128_Y1= 364 -153.7500001 -84.49999997 + X128_Y128= 364 -91.50000008 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364 151.375 153.75 + X1_Y128= 364 151.375 91.49999998 + X128_Y1= 364 -84.49999996 153.7500001 + X128_Y128= 364 -84.5 91.50000013 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 +ShieldClParis + X1_Y1= 364.4251574 153.75 150.3485793 + X1_Y128= 364.4251574 91.5 150.3485793 + X128_Y1= 197.6363453 153.75 317.1373914 + X128_Y128= 197.6363453 91.5 317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 366.104536 -151.375 148.6692007 + X1_Y128= 322.0871388 -151.375 192.6865979 + X128_Y1= 366.104536 84.49999999 148.6692007 + X128_Y128= 322.0871389 84.5 192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 150.3485793 -153.75 364.4251574 + X1_Y128= 150.3485793 -91.49999999 364.4251574 + X128_Y1= 317.1373913 -153.7500001 197.6363454 + X128_Y128= 317.1373914 -91.50000008 197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 148.6692008 151.375 366.1045359 + X1_Y128= 192.6865979 151.375 322.0871388 + X128_Y1= 148.6692007 -84.49999996 366.104536 + X128_Y128= 192.6865978 -84.5 322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 +ShieldClParis + X1_Y1= -366.104536 -148.6692007 151.375 + X1_Y128= -322.0871388 -192.6865979 151.375 + X128_Y1= -366.104536 -148.6692007 -84.5 + X128_Y128= -322.0871388 -192.6865979 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -150.3485793 -364.4251574 153.75 + X1_Y128= -150.3485793 -364.4251574 91.49999999 + X128_Y1= -317.1373914 -197.6363454 153.75 + X128_Y128= -317.1373914 -197.6363453 91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -148.6692008 -366.104536 -151.375 + X1_Y128= -192.6865979 -322.0871388 -151.375 + X128_Y1= -148.6692007 -366.104536 84.49999997 + X128_Y128= -192.6865978 -322.0871389 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364.4251574 -150.3485793 -153.75 + X1_Y128= -364.4251574 -150.3485793 -91.49999998 + X128_Y1= -197.6363454 -317.1373913 -153.7500001 + X128_Y128= -197.6363453 -317.1373914 -91.50000013 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 +ShieldClParis + X1_Y1= 366.104536 -148.6692007 -151.375 + X1_Y128= 322.0871388 -192.6865979 -151.375 + X128_Y1= 366.104536 -148.6692007 84.5 + X128_Y128= 322.0871388 -192.6865979 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 150.3485793 -364.4251574 -153.75 + X1_Y128= 150.3485793 -364.4251574 -91.49999999 + X128_Y1= 317.1373914 -197.6363454 -153.75 + X128_Y128= 317.1373914 -197.6363453 -91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 148.6692008 -366.104536 151.375 + X1_Y128= 192.6865979 -322.0871388 151.375 + X128_Y1= 148.6692007 -366.104536 -84.49999997 + X128_Y128= 192.6865978 -322.0871389 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364.4251574 -150.3485793 153.75 + X1_Y128= 364.4251574 -150.3485793 91.49999998 + X128_Y1= 197.6363454 -317.1373913 153.7500001 + X128_Y128= 197.6363453 -317.1373914 91.50000013 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 +ShieldClParis + X1_Y1= -148.6692007 366.104536 151.375 + X1_Y128= -192.6865979 322.0871388 151.375 + X128_Y1= -148.6692007 366.104536 -84.5 + X128_Y128= -192.6865979 322.0871388 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364.4251574 150.3485793 153.75 + X1_Y128= -364.4251574 150.3485793 91.49999999 + X128_Y1= -197.6363454 317.1373914 153.75 + X128_Y128= -197.6363453 317.1373914 91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -366.104536 148.6692008 -151.375 + X1_Y128= -322.0871388 192.6865979 -151.375 + X128_Y1= -366.104536 148.6692007 84.49999997 + X128_Y128= -322.0871389 192.6865978 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -150.3485793 364.4251574 -153.75 + X1_Y128= -150.3485793 364.4251574 -91.49999998 + X128_Y1= -317.1373913 197.6363454 -153.7500001 + X128_Y128= -317.1373914 197.6363453 -91.50000013 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 +ShieldClParis + X1_Y1= 148.6692007 366.104536 -151.375 + X1_Y128= 192.6865979 322.0871388 -151.375 + X128_Y1= 148.6692007 366.104536 84.5 + X128_Y128= 192.6865979 322.0871388 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364.4251574 150.3485793 -153.75 + X1_Y128= 364.4251574 150.3485793 -91.49999999 + X128_Y1= 197.6363454 317.1373914 -153.75 + X128_Y128= 197.6363453 317.1373914 -91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 366.104536 148.6692008 151.375 + X1_Y128= 322.0871388 192.6865979 151.375 + X128_Y1= 366.104536 148.6692007 -84.49999997 + X128_Y128= 322.0871389 192.6865978 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 150.3485793 364.4251574 153.75 + X1_Y128= 150.3485793 364.4251574 91.49999998 + X128_Y1= 317.1373913 197.6363454 153.7500001 + X128_Y128= 317.1373914 197.6363453 91.50000013 + VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ShieldPhParis + THETA= 54.73 + PHI= 45.02 + R= 248 + BETA= 0 0 -30 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ShieldPhParis + THETA= 54.73 + PHI= 134.98 + R= 248 + BETA= 0 0 210 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +ShieldPhParis + THETA= 54.73 + PHI= 225 + R= 248 + BETA= 0 0 -30 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +ShieldPhParis + THETA= 54.73 + PHI= 315 + R= 248 + BETA= 0 0 210 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +ShieldPhParis + THETA= 125.26 + PHI= 45.02 + R= 248 + BETA= 0 0 30 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +ShieldPhParis + THETA= 125.26 + PHI= 134.98 + R= 248 + BETA= 0 0 -210 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +ShieldPhParis + THETA= 125.26 + PHI= 225 + R= 248 + BETA= 0 0 30 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +ShieldPhParis + THETA= 125.26 + PHI= 315 + R= 248 + BETA= 0 0 -210 + VIS= all diff --git a/Projects/Paris/DetectorConfigurtation/ParisAll_208pipe1.detector b/Projects/Paris/DetectorConfigurtation/ParisAll_208pipe1.detector new file mode 100644 index 0000000000000000000000000000000000000000..7c77a09a521a1e0c978b34c643687a2b8122998f --- /dev/null +++ b/Projects/Paris/DetectorConfigurtation/ParisAll_208pipe1.detector @@ -0,0 +1,792 @@ +%Fichier de configuration manip E225 +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and R given in mm +%%Angle given in degree +%%Option: 0,1 for Si SiLi and CsI +%%Option: all or sensible for VISualisation +%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 +%Thickness in micrometer +%Radius in mm +%Temperature in K, Pressure in bar +%Material name according to the target library + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 10.3 + ANGLE= 0 + RADIUS= 12 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 + NBLAYERS= 50 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ParisCluster + X1_Y1= -84.5 -208 84.5 + X1_Y128= 84.5 -208 84.5 + X128_Y1= -84.5 -208 -84.5 + X128_Y128= 84.5 -208 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + X1_Y1= -206.8287414 -87.3276796 84.5 + X1_Y128= -87.32769537 -206.8287256 84.5 + X128_Y1= -206.8287414 -87.3276796 -84.5 + X128_Y128= -87.32769537 -206.8287256 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -208 84.50001115 84.5 + X1_Y128= -208 -84.49998885 84.5 + X128_Y1= -208 84.50001115 -84.5 + X128_Y128= -208 -84.49998885 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -87.3276796 206.8287414 84.5 + X1_Y128= -206.8287256 87.32769537 84.5 + X128_Y1= -87.3276796 206.8287414 -84.5 + X128_Y128= -206.8287256 87.32769537 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 84.50000557 208 84.5 + X1_Y128= -84.49999443 208 84.5 + X128_Y1= 84.50000557 208 -84.5 + X128_Y128= -84.49999443 208 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 206.8287335 87.32768749 84.5 + X1_Y128= 87.32768749 206.8287335 84.5 + X128_Y1= 206.8287335 87.32768749 -84.5 + X128_Y128= 87.32768749 206.8287335 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 208 -84.50002229 84.5 + X1_Y128= 208 84.49997771 84.5 + X128_Y1= 208 -84.50002229 -84.5 + X128_Y128= 208 84.49997771 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 87.32767172 -206.8287493 84.5 + X1_Y128= 206.8287177 -87.32770325 84.5 + X128_Y1= 87.32767172 -206.8287493 -84.5 + X128_Y128= 206.8287177 -87.32770325 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%ParisCluster +% X1_Y1= 84.5 84.5 -208 +% X1_Y128= -84.5 84.5 -208 +% X128_Y1= 84.5 -84.5 -208 +% X128_Y128= -84.5 -84.5 -208 +% VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 206.8287335 84.49998424 -87.32768749 + X1_Y128= 87.32768749 84.49998424 -206.8287335 + X128_Y1= 206.8287335 -84.50001576 -87.32768749 + X128_Y128= 87.32768749 -84.50001576 -206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 87.32768749 84.49998424 206.8287335 + X1_Y128= 206.8287335 84.49998424 87.32768749 + X128_Y1= 87.32768749 -84.50001576 206.8287335 + X128_Y128= 206.8287335 -84.50001576 87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%ParisCluster +% X1_Y1= -84.5 84.5 208 +% X1_Y128= 84.5 84.5 208 +% X128_Y1= -84.5 -84.5 208 +% X128_Y128= 84.5 -84.5 208 +% VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -206.8287335 84.50000788 87.32768749 + X1_Y128= -87.32768749 84.50000788 206.8287335 + X128_Y1= -206.8287335 -84.49999212 87.32768749 + X128_Y128= -87.32768749 -84.49999212 206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -87.32768749 84.50000788 -206.8287335 + X1_Y128= -206.8287335 84.50000788 -87.32768749 + X128_Y1= -87.32768749 -84.49999212 -206.8287335 + X128_Y128= -206.8287335 -84.49999212 -87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.49999606 87.32768749 -206.8287335 + X1_Y128= 84.50000394 87.32768749 -206.8287335 + X128_Y1= -84.49999606 206.8287335 -87.32768749 + X128_Y128= 84.50000394 206.8287335 -87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.49999606 206.8287335 87.32768749 + X1_Y128= 84.50000394 206.8287335 87.32768749 + X128_Y1= -84.49999606 87.32768749 206.8287335 + X128_Y128= 84.50000394 87.32768749 206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.50001182 -87.32768749 206.8287335 + X1_Y128= 84.49998818 -87.32768749 206.8287335 + X128_Y1= -84.50001182 -206.8287335 87.32768749 + X128_Y128= 84.49998818 -206.8287335 87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.50001182 -206.8287335 -87.32768749 + X1_Y128= 84.49998818 -206.8287335 -87.32768749 + X128_Y1= -84.50001182 -87.32768749 -206.8287335 + X128_Y128= 84.49998818 -87.32768749 -206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -128.6063166 143.3590149 -88.30123599 + X1_Y128= -151.8764696 96.81870993 -111.571389 + X128_Y1= -88.30122956 143.3590149 -128.606323 + X128_Y128= -111.5713826 96.81870993 -151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -88.30122956 143.3590149 128.606323 + X1_Y128= -111.5713826 96.81870993 151.876476 + X128_Y1= -128.6063166 143.3590149 88.30123599 + X128_Y128= -151.8764696 96.81870993 111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 128.606323 143.3590085 88.30123599 + X1_Y128= 151.876476 96.81870349 111.571389 + X128_Y1= 88.30123599 143.3590085 128.606323 + X128_Y128= 111.571389 96.81870349 151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 88.30123599 143.3590085 -128.606323 + X1_Y128= 111.571389 96.81870349 -151.876476 + X128_Y1= 128.606323 143.3590085 -88.30123599 + X128_Y128= 151.876476 96.81870349 -111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -88.30124243 -143.3590021 -128.606323 + X1_Y128= -111.5713954 -96.81869706 -151.876476 + X128_Y1= -128.6063294 -143.3590021 -88.30123599 + X128_Y128= -151.8764824 -96.81869706 -111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 128.6063101 -143.3590214 -88.30123599 + X1_Y128= 151.8764631 -96.81871636 -111.571389 + X128_Y1= 88.30122312 -143.3590214 -128.606323 + X128_Y128= 111.5713761 -96.81871636 -151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 88.30122312 -143.3590214 128.606323 + X1_Y128= 111.5713761 -96.81871636 151.876476 + X128_Y1= 128.6063101 -143.3590214 88.30123599 + X128_Y128= 151.8764631 -96.81871636 111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -128.6063294 -143.3590021 88.30123599 + X1_Y128= -151.8764824 -96.81869706 111.571389 + X128_Y1= -88.30124243 -143.3590021 128.606323 + X128_Y128= -111.5713954 -96.81869706 151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Shield +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ShieldClParis + X1_Y1= 151.375 153.75 364 + X1_Y128= 151.375 91.5 364 + X128_Y1= -84.5 153.75 364 + X128_Y128= -84.5 91.5 364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 -151.375 364 + X1_Y128= 91.49999999 -151.375 364 + X128_Y1= 153.75 84.49999999 364 + X128_Y128= 91.50000004 84.5 364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 -153.75 364 + X1_Y128= -151.375 -91.49999999 364 + X128_Y1= 84.49999997 -153.7500001 364 + X128_Y128= 84.5 -91.50000008 364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 151.375 364 + X1_Y128= -91.49999998 151.375 364 + X128_Y1= -153.7500001 -84.49999996 364 + X128_Y128= -91.50000013 -84.5 364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ShieldClParis + X1_Y1= 151.375 -148.6692007 366.104536 + X1_Y128= 151.375 -192.6865979 322.0871388 + X128_Y1= -84.5 -148.6692007 366.104536 + X128_Y128= -84.5 -192.6865979 322.0871388 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 -364.4251574 150.3485793 + X1_Y128= 91.49999999 -364.4251574 150.3485793 + X128_Y1= 153.75 -197.6363454 317.1373914 + X128_Y128= 91.50000004 -197.6363453 317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 -366.104536 148.6692008 + X1_Y128= -151.375 -322.0871388 192.6865979 + X128_Y1= 84.49999997 -366.104536 148.6692007 + X128_Y128= 84.5 -322.0871389 192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 -150.3485793 364.4251574 + X1_Y128= -91.49999998 -150.3485793 364.4251574 + X128_Y1= -153.7500001 -317.1373913 197.6363454 + X128_Y128= -91.50000013 -317.1373914 197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +ShieldClParis + X1_Y1= 151.375 -364 153.75 + X1_Y128= 151.375 -364 91.5 + X128_Y1= -84.5 -364 153.75 + X128_Y128= -84.5 -364 91.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 -364 -151.375 + X1_Y128= 91.49999999 -364 -151.375 + X128_Y1= 153.75 -364 84.49999999 + X128_Y128= 91.50000004 -364 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 -364 -153.75 + X1_Y128= -151.375 -364 -91.49999999 + X128_Y1= 84.49999997 -364 -153.7500001 + X128_Y128= 84.5 -364 -91.50000008 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 -364 151.375 + X1_Y128= -91.49999998 -364 151.375 + X128_Y1= -153.7500001 -364 -84.49999996 + X128_Y128= -91.50000013 -364 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +ShieldClParis + X1_Y1= 151.375 -366.104536 -148.6692007 + X1_Y128= 151.375 -322.0871388 -192.6865979 + X128_Y1= -84.5 -366.104536 -148.6692007 + X128_Y128= -84.5 -322.0871388 -192.6865979 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 -150.3485793 -364.4251574 + X1_Y128= 91.49999999 -150.3485793 -364.4251574 + X128_Y1= 153.75 -317.1373914 -197.6363454 + X128_Y128= 91.50000004 -317.1373914 -197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 -148.6692008 -366.104536 + X1_Y128= -151.375 -192.6865979 -322.0871388 + X128_Y1= 84.49999997 -148.6692007 -366.104536 + X128_Y128= 84.5 -192.6865978 -322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 -364.4251574 -150.3485793 + X1_Y128= -91.49999998 -364.4251574 -150.3485793 + X128_Y1= -153.7500001 -197.6363454 -317.1373913 + X128_Y128= -91.50000013 -197.6363453 -317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +ShieldClParis + X1_Y1= 151.375 -153.75 -364 + X1_Y128= 151.375 -91.5 -364 + X128_Y1= -84.5 -153.75 -364 + X128_Y128= -84.5 -91.5 -364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 151.375 -364 + X1_Y128= 91.49999999 151.375 -364 + X128_Y1= 153.75 -84.49999999 -364 + X128_Y128= 91.50000004 -84.5 -364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 153.75 -364 + X1_Y128= -151.375 91.49999999 -364 + X128_Y1= 84.49999997 153.7500001 -364 + X128_Y128= 84.5 91.50000008 -364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 -151.375 -364 + X1_Y128= -91.49999998 -151.375 -364 + X128_Y1= -153.7500001 84.49999996 -364 + X128_Y128= -91.50000013 84.5 -364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +ShieldClParis + X1_Y1= 151.375 148.6692007 -366.104536 + X1_Y128= 151.375 192.6865979 -322.0871388 + X128_Y1= -84.5 148.6692007 -366.104536 + X128_Y128= -84.5 192.6865979 -322.0871388 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 364.4251574 -150.3485793 + X1_Y128= 91.49999999 364.4251574 -150.3485793 + X128_Y1= 153.75 197.6363454 -317.1373914 + X128_Y128= 91.50000004 197.6363453 -317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 366.104536 -148.6692008 + X1_Y128= -151.375 322.0871388 -192.6865979 + X128_Y1= 84.49999997 366.104536 -148.6692007 + X128_Y128= 84.5 322.0871389 -192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 150.3485793 -364.4251574 + X1_Y128= -91.49999998 150.3485793 -364.4251574 + X128_Y1= -153.7500001 317.1373913 -197.6363454 + X128_Y128= -91.50000013 317.1373914 -197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +ShieldClParis + X1_Y1= 151.375 364 -153.75 + X1_Y128= 151.375 364 -91.5 + X128_Y1= -84.5 364 -153.75 + X128_Y128= -84.5 364 -91.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 364 151.375 + X1_Y128= 91.49999999 364 151.375 + X128_Y1= 153.75 364 -84.49999999 + X128_Y128= 91.50000004 364 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 364 153.75 + X1_Y128= -151.375 364 91.49999999 + X128_Y1= 84.49999997 364 153.7500001 + X128_Y128= 84.5 364 91.50000008 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 364 -151.375 + X1_Y128= -91.49999998 364 -151.375 + X128_Y1= -153.7500001 364 84.49999996 + X128_Y128= -91.50000013 364 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +ShieldClParis + X1_Y1= 151.375 366.104536 148.6692007 + X1_Y128= 151.375 322.0871388 192.6865979 + X128_Y1= -84.5 366.104536 148.6692007 + X128_Y128= -84.5 322.0871388 192.6865979 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 150.3485793 364.4251574 + X1_Y128= 91.49999999 150.3485793 364.4251574 + X128_Y1= 153.75 317.1373914 197.6363454 + X128_Y128= 91.50000004 317.1373914 197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 148.6692008 366.104536 + X1_Y128= -151.375 192.6865979 322.0871388 + X128_Y1= 84.49999997 148.6692007 366.104536 + X128_Y128= 84.5 192.6865978 322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 364.4251574 150.3485793 + X1_Y128= -91.49999998 364.4251574 150.3485793 + X128_Y1= -153.7500001 197.6363454 317.1373913 + X128_Y128= -91.50000013 197.6363453 317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 +ShieldClParis + X1_Y1= -150.3485793 153.75 364.4251574 + X1_Y128= -150.3485793 91.5 364.4251574 + X128_Y1= -317.1373914 153.75 197.6363453 + X128_Y128= -317.1373914 91.5 197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -148.6692007 -151.375 366.104536 + X1_Y128= -192.6865979 -151.375 322.0871388 + X128_Y1= -148.6692007 84.49999999 366.104536 + X128_Y128= -192.6865978 84.5 322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364.4251574 -153.75 150.3485793 + X1_Y128= -364.4251574 -91.49999999 150.3485793 + X128_Y1= -197.6363454 -153.7500001 317.1373913 + X128_Y128= -197.6363453 -91.50000008 317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -366.1045359 151.375 148.6692008 + X1_Y128= -322.0871388 151.375 192.6865979 + X128_Y1= -366.104536 -84.49999996 148.6692007 + X128_Y128= -322.0871389 -84.5 192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 +ShieldClParis + X1_Y1= -364 153.75 151.375 + X1_Y128= -364 91.5 151.375 + X128_Y1= -364 153.75 -84.5 + X128_Y128= -364 91.5 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364 -151.375 153.75 + X1_Y128= -364 -151.375 91.49999999 + X128_Y1= -364 84.49999999 153.75 + X128_Y128= -364 84.5 91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364 -153.75 -151.375 + X1_Y128= -364 -91.49999999 -151.375 + X128_Y1= -364 -153.7500001 84.49999997 + X128_Y128= -364 -91.50000008 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364 151.375 -153.75 + X1_Y128= -364 151.375 -91.49999998 + X128_Y1= -364 -84.49999996 -153.7500001 + X128_Y128= -364 -84.5 -91.50000013 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 +ShieldClParis + X1_Y1= -364.4251574 153.75 -150.3485793 + X1_Y128= -364.4251574 91.5 -150.3485793 + X128_Y1= -197.6363453 153.75 -317.1373914 + X128_Y128= -197.6363453 91.5 -317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -366.104536 -151.375 -148.6692007 + X1_Y128= -322.0871388 -151.375 -192.6865979 + X128_Y1= -366.104536 84.49999999 -148.6692007 + X128_Y128= -322.0871389 84.5 -192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -150.3485793 -153.75 -364.4251574 + X1_Y128= -150.3485793 -91.49999999 -364.4251574 + X128_Y1= -317.1373913 -153.7500001 -197.6363454 + X128_Y128= -317.1373914 -91.50000008 -197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -148.6692008 151.375 -366.1045359 + X1_Y128= -192.6865979 151.375 -322.0871388 + X128_Y1= -148.6692007 -84.49999996 -366.104536 + X128_Y128= -192.6865978 -84.5 -322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 +ShieldClParis + X1_Y1= 150.3485793 153.75 -364.4251574 + X1_Y128= 150.3485793 91.5 -364.4251574 + X128_Y1= 317.1373914 153.75 -197.6363453 + X128_Y128= 317.1373914 91.5 -197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 148.6692007 -151.375 -366.104536 + X1_Y128= 192.6865979 -151.375 -322.0871388 + X128_Y1= 148.6692007 84.49999999 -366.104536 + X128_Y128= 192.6865978 84.5 -322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364.4251574 -153.75 -150.3485793 + X1_Y128= 364.4251574 -91.49999999 -150.3485793 + X128_Y1= 197.6363454 -153.7500001 -317.1373913 + X128_Y128= 197.6363453 -91.50000008 -317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 366.1045359 151.375 -148.6692008 + X1_Y128= 322.0871388 151.375 -192.6865979 + X128_Y1= 366.104536 -84.49999996 -148.6692007 + X128_Y128= 322.0871389 -84.5 -192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 +ShieldClParis + X1_Y1= 364 153.75 -151.375 + X1_Y128= 364 91.5 -151.375 + X128_Y1= 364 153.75 84.5 + X128_Y128= 364 91.5 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364 -151.375 -153.75 + X1_Y128= 364 -151.375 -91.49999999 + X128_Y1= 364 84.49999999 -153.75 + X128_Y128= 364 84.5 -91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364 -153.75 151.375 + X1_Y128= 364 -91.49999999 151.375 + X128_Y1= 364 -153.7500001 -84.49999997 + X128_Y128= 364 -91.50000008 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364 151.375 153.75 + X1_Y128= 364 151.375 91.49999998 + X128_Y1= 364 -84.49999996 153.7500001 + X128_Y128= 364 -84.5 91.50000013 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 +ShieldClParis + X1_Y1= 364.4251574 153.75 150.3485793 + X1_Y128= 364.4251574 91.5 150.3485793 + X128_Y1= 197.6363453 153.75 317.1373914 + X128_Y128= 197.6363453 91.5 317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 366.104536 -151.375 148.6692007 + X1_Y128= 322.0871388 -151.375 192.6865979 + X128_Y1= 366.104536 84.49999999 148.6692007 + X128_Y128= 322.0871389 84.5 192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 150.3485793 -153.75 364.4251574 + X1_Y128= 150.3485793 -91.49999999 364.4251574 + X128_Y1= 317.1373913 -153.7500001 197.6363454 + X128_Y128= 317.1373914 -91.50000008 197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 148.6692008 151.375 366.1045359 + X1_Y128= 192.6865979 151.375 322.0871388 + X128_Y1= 148.6692007 -84.49999996 366.104536 + X128_Y128= 192.6865978 -84.5 322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 +ShieldClParis + X1_Y1= -366.104536 -148.6692007 151.375 + X1_Y128= -322.0871388 -192.6865979 151.375 + X128_Y1= -366.104536 -148.6692007 -84.5 + X128_Y128= -322.0871388 -192.6865979 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -150.3485793 -364.4251574 153.75 + X1_Y128= -150.3485793 -364.4251574 91.49999999 + X128_Y1= -317.1373914 -197.6363454 153.75 + X128_Y128= -317.1373914 -197.6363453 91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -148.6692008 -366.104536 -151.375 + X1_Y128= -192.6865979 -322.0871388 -151.375 + X128_Y1= -148.6692007 -366.104536 84.49999997 + X128_Y128= -192.6865978 -322.0871389 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364.4251574 -150.3485793 -153.75 + X1_Y128= -364.4251574 -150.3485793 -91.49999998 + X128_Y1= -197.6363454 -317.1373913 -153.7500001 + X128_Y128= -197.6363453 -317.1373914 -91.50000013 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 +ShieldClParis + X1_Y1= 366.104536 -148.6692007 -151.375 + X1_Y128= 322.0871388 -192.6865979 -151.375 + X128_Y1= 366.104536 -148.6692007 84.5 + X128_Y128= 322.0871388 -192.6865979 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 150.3485793 -364.4251574 -153.75 + X1_Y128= 150.3485793 -364.4251574 -91.49999999 + X128_Y1= 317.1373914 -197.6363454 -153.75 + X128_Y128= 317.1373914 -197.6363453 -91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 148.6692008 -366.104536 151.375 + X1_Y128= 192.6865979 -322.0871388 151.375 + X128_Y1= 148.6692007 -366.104536 -84.49999997 + X128_Y128= 192.6865978 -322.0871389 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364.4251574 -150.3485793 153.75 + X1_Y128= 364.4251574 -150.3485793 91.49999998 + X128_Y1= 197.6363454 -317.1373913 153.7500001 + X128_Y128= 197.6363453 -317.1373914 91.50000013 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 +ShieldClParis + X1_Y1= -148.6692007 366.104536 151.375 + X1_Y128= -192.6865979 322.0871388 151.375 + X128_Y1= -148.6692007 366.104536 -84.5 + X128_Y128= -192.6865979 322.0871388 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364.4251574 150.3485793 153.75 + X1_Y128= -364.4251574 150.3485793 91.49999999 + X128_Y1= -197.6363454 317.1373914 153.75 + X128_Y128= -197.6363453 317.1373914 91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -366.104536 148.6692008 -151.375 + X1_Y128= -322.0871388 192.6865979 -151.375 + X128_Y1= -366.104536 148.6692007 84.49999997 + X128_Y128= -322.0871389 192.6865978 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -150.3485793 364.4251574 -153.75 + X1_Y128= -150.3485793 364.4251574 -91.49999998 + X128_Y1= -317.1373913 197.6363454 -153.7500001 + X128_Y128= -317.1373914 197.6363453 -91.50000013 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 +ShieldClParis + X1_Y1= 148.6692007 366.104536 -151.375 + X1_Y128= 192.6865979 322.0871388 -151.375 + X128_Y1= 148.6692007 366.104536 84.5 + X128_Y128= 192.6865979 322.0871388 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364.4251574 150.3485793 -153.75 + X1_Y128= 364.4251574 150.3485793 -91.49999999 + X128_Y1= 197.6363454 317.1373914 -153.75 + X128_Y128= 197.6363453 317.1373914 -91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 366.104536 148.6692008 151.375 + X1_Y128= 322.0871388 192.6865979 151.375 + X128_Y1= 366.104536 148.6692007 -84.49999997 + X128_Y128= 322.0871389 192.6865978 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 150.3485793 364.4251574 153.75 + X1_Y128= 150.3485793 364.4251574 91.49999998 + X128_Y1= 317.1373913 197.6363454 153.7500001 + X128_Y128= 317.1373914 197.6363453 91.50000013 + VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ShieldPhParis + THETA= 54.73 + PHI= 45.02 + R= 248 + BETA= 0 0 -30 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ShieldPhParis + THETA= 54.73 + PHI= 134.98 + R= 248 + BETA= 0 0 210 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +ShieldPhParis + THETA= 54.73 + PHI= 225 + R= 248 + BETA= 0 0 -30 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +ShieldPhParis + THETA= 54.73 + PHI= 315 + R= 248 + BETA= 0 0 210 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +ShieldPhParis + THETA= 125.26 + PHI= 45.02 + R= 248 + BETA= 0 0 30 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +ShieldPhParis + THETA= 125.26 + PHI= 134.98 + R= 248 + BETA= 0 0 -210 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +ShieldPhParis + THETA= 125.26 + PHI= 225 + R= 248 + BETA= 0 0 30 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +ShieldPhParis + THETA= 125.26 + PHI= 315 + R= 248 + BETA= 0 0 -210 + VIS= all diff --git a/Projects/Paris/DetectorConfigurtation/ParisAll_208pipe1noshield.detector b/Projects/Paris/DetectorConfigurtation/ParisAll_208pipe1noshield.detector new file mode 100644 index 0000000000000000000000000000000000000000..55b87da60705fdf3c2e0c668189a92adc3682051 --- /dev/null +++ b/Projects/Paris/DetectorConfigurtation/ParisAll_208pipe1noshield.detector @@ -0,0 +1,212 @@ +%Fichier de configuration manip E225 +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and R given in mm +%%Angle given in degree +%%Option: 0,1 for Si SiLi and CsI +%%Option: all or sensible for VISualisation +%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 +%Thickness in micrometer +%Radius in mm +%Temperature in K, Pressure in bar +%Material name according to the target library + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 10.3 + ANGLE= 0 + RADIUS= 12 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 + NBLAYERS= 50 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ParisCluster + X1_Y1= -84.5 -208 84.5 + X1_Y128= 84.5 -208 84.5 + X128_Y1= -84.5 -208 -84.5 + X128_Y128= 84.5 -208 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + X1_Y1= -206.8287414 -87.3276796 84.5 + X1_Y128= -87.32769537 -206.8287256 84.5 + X128_Y1= -206.8287414 -87.3276796 -84.5 + X128_Y128= -87.32769537 -206.8287256 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -208 84.50001115 84.5 + X1_Y128= -208 -84.49998885 84.5 + X128_Y1= -208 84.50001115 -84.5 + X128_Y128= -208 -84.49998885 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -87.3276796 206.8287414 84.5 + X1_Y128= -206.8287256 87.32769537 84.5 + X128_Y1= -87.3276796 206.8287414 -84.5 + X128_Y128= -206.8287256 87.32769537 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 84.50000557 208 84.5 + X1_Y128= -84.49999443 208 84.5 + X128_Y1= 84.50000557 208 -84.5 + X128_Y128= -84.49999443 208 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 206.8287335 87.32768749 84.5 + X1_Y128= 87.32768749 206.8287335 84.5 + X128_Y1= 206.8287335 87.32768749 -84.5 + X128_Y128= 87.32768749 206.8287335 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 208 -84.50002229 84.5 + X1_Y128= 208 84.49997771 84.5 + X128_Y1= 208 -84.50002229 -84.5 + X128_Y128= 208 84.49997771 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 87.32767172 -206.8287493 84.5 + X1_Y128= 206.8287177 -87.32770325 84.5 + X128_Y1= 87.32767172 -206.8287493 -84.5 + X128_Y128= 206.8287177 -87.32770325 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%ParisCluster +% X1_Y1= 84.5 84.5 -208 +% X1_Y128= -84.5 84.5 -208 +% X128_Y1= 84.5 -84.5 -208 +% X128_Y128= -84.5 -84.5 -208 +% VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 206.8287335 84.49998424 -87.32768749 + X1_Y128= 87.32768749 84.49998424 -206.8287335 + X128_Y1= 206.8287335 -84.50001576 -87.32768749 + X128_Y128= 87.32768749 -84.50001576 -206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 87.32768749 84.49998424 206.8287335 + X1_Y128= 206.8287335 84.49998424 87.32768749 + X128_Y1= 87.32768749 -84.50001576 206.8287335 + X128_Y128= 206.8287335 -84.50001576 87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%ParisCluster +% X1_Y1= -84.5 84.5 208 +% X1_Y128= 84.5 84.5 208 +% X128_Y1= -84.5 -84.5 208 +% X128_Y128= 84.5 -84.5 208 +% VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -206.8287335 84.50000788 87.32768749 + X1_Y128= -87.32768749 84.50000788 206.8287335 + X128_Y1= -206.8287335 -84.49999212 87.32768749 + X128_Y128= -87.32768749 -84.49999212 206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -87.32768749 84.50000788 -206.8287335 + X1_Y128= -206.8287335 84.50000788 -87.32768749 + X128_Y1= -87.32768749 -84.49999212 -206.8287335 + X128_Y128= -206.8287335 -84.49999212 -87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.49999606 87.32768749 -206.8287335 + X1_Y128= 84.50000394 87.32768749 -206.8287335 + X128_Y1= -84.49999606 206.8287335 -87.32768749 + X128_Y128= 84.50000394 206.8287335 -87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.49999606 206.8287335 87.32768749 + X1_Y128= 84.50000394 206.8287335 87.32768749 + X128_Y1= -84.49999606 87.32768749 206.8287335 + X128_Y128= 84.50000394 87.32768749 206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.50001182 -87.32768749 206.8287335 + X1_Y128= 84.49998818 -87.32768749 206.8287335 + X128_Y1= -84.50001182 -206.8287335 87.32768749 + X128_Y128= 84.49998818 -206.8287335 87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.50001182 -206.8287335 -87.32768749 + X1_Y128= 84.49998818 -206.8287335 -87.32768749 + X128_Y1= -84.50001182 -87.32768749 -206.8287335 + X128_Y128= 84.49998818 -87.32768749 -206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -128.6063166 143.3590149 -88.30123599 + X1_Y128= -151.8764696 96.81870993 -111.571389 + X128_Y1= -88.30122956 143.3590149 -128.606323 + X128_Y128= -111.5713826 96.81870993 -151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -88.30122956 143.3590149 128.606323 + X1_Y128= -111.5713826 96.81870993 151.876476 + X128_Y1= -128.6063166 143.3590149 88.30123599 + X128_Y128= -151.8764696 96.81870993 111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 128.606323 143.3590085 88.30123599 + X1_Y128= 151.876476 96.81870349 111.571389 + X128_Y1= 88.30123599 143.3590085 128.606323 + X128_Y128= 111.571389 96.81870349 151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 88.30123599 143.3590085 -128.606323 + X1_Y128= 111.571389 96.81870349 -151.876476 + X128_Y1= 128.606323 143.3590085 -88.30123599 + X128_Y128= 151.876476 96.81870349 -111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -88.30124243 -143.3590021 -128.606323 + X1_Y128= -111.5713954 -96.81869706 -151.876476 + X128_Y1= -128.6063294 -143.3590021 -88.30123599 + X128_Y128= -151.8764824 -96.81869706 -111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 128.6063101 -143.3590214 -88.30123599 + X1_Y128= 151.8764631 -96.81871636 -111.571389 + X128_Y1= 88.30122312 -143.3590214 -128.606323 + X128_Y128= 111.5713761 -96.81871636 -151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 88.30122312 -143.3590214 128.606323 + X1_Y128= 111.5713761 -96.81871636 151.876476 + X128_Y1= 128.6063101 -143.3590214 88.30123599 + X128_Y128= 151.8764631 -96.81871636 111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -128.6063294 -143.3590021 88.30123599 + X1_Y128= -151.8764824 -96.81869706 111.571389 + X128_Y1= -88.30124243 -143.3590021 128.606323 + X128_Y128= -111.5713954 -96.81869706 151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Projects/Paris/DetectorConfigurtation/ParisAll_208pipe2.detector b/Projects/Paris/DetectorConfigurtation/ParisAll_208pipe2.detector new file mode 100644 index 0000000000000000000000000000000000000000..538513ec47c29cdbf48610a8380d5c570c19ffdf --- /dev/null +++ b/Projects/Paris/DetectorConfigurtation/ParisAll_208pipe2.detector @@ -0,0 +1,792 @@ +%Fichier de configuration manip E225 +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and R given in mm +%%Angle given in degree +%%Option: 0,1 for Si SiLi and CsI +%%Option: all or sensible for VISualisation +%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 +%Thickness in micrometer +%Radius in mm +%Temperature in K, Pressure in bar +%Material name according to the target library + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 10.3 + ANGLE= 0 + RADIUS= 12 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 + NBLAYERS= 50 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ParisCluster + X1_Y1= -84.5 -208 84.5 + X1_Y128= 84.5 -208 84.5 + X128_Y1= -84.5 -208 -84.5 + X128_Y128= 84.5 -208 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + X1_Y1= -206.8287414 -87.3276796 84.5 + X1_Y128= -87.32769537 -206.8287256 84.5 + X128_Y1= -206.8287414 -87.3276796 -84.5 + X128_Y128= -87.32769537 -206.8287256 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -208 84.50001115 84.5 + X1_Y128= -208 -84.49998885 84.5 + X128_Y1= -208 84.50001115 -84.5 + X128_Y128= -208 -84.49998885 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -87.3276796 206.8287414 84.5 + X1_Y128= -206.8287256 87.32769537 84.5 + X128_Y1= -87.3276796 206.8287414 -84.5 + X128_Y128= -206.8287256 87.32769537 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 84.50000557 208 84.5 + X1_Y128= -84.49999443 208 84.5 + X128_Y1= 84.50000557 208 -84.5 + X128_Y128= -84.49999443 208 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 206.8287335 87.32768749 84.5 + X1_Y128= 87.32768749 206.8287335 84.5 + X128_Y1= 206.8287335 87.32768749 -84.5 + X128_Y128= 87.32768749 206.8287335 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 208 -84.50002229 84.5 + X1_Y128= 208 84.49997771 84.5 + X128_Y1= 208 -84.50002229 -84.5 + X128_Y128= 208 84.49997771 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 87.32767172 -206.8287493 84.5 + X1_Y128= 206.8287177 -87.32770325 84.5 + X128_Y1= 87.32767172 -206.8287493 -84.5 + X128_Y128= 206.8287177 -87.32770325 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 84.5 84.5 -208 + X1_Y128= -84.5 84.5 -208 + X128_Y1= 84.5 -84.5 -208 + X128_Y128= -84.5 -84.5 -208 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 206.8287335 84.49998424 -87.32768749 + X1_Y128= 87.32768749 84.49998424 -206.8287335 + X128_Y1= 206.8287335 -84.50001576 -87.32768749 + X128_Y128= 87.32768749 -84.50001576 -206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 87.32768749 84.49998424 206.8287335 + X1_Y128= 206.8287335 84.49998424 87.32768749 + X128_Y1= 87.32768749 -84.50001576 206.8287335 + X128_Y128= 206.8287335 -84.50001576 87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.5 84.5 208 + X1_Y128= 84.5 84.5 208 + X128_Y1= -84.5 -84.5 208 + X128_Y128= 84.5 -84.5 208 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -206.8287335 84.50000788 87.32768749 + X1_Y128= -87.32768749 84.50000788 206.8287335 + X128_Y1= -206.8287335 -84.49999212 87.32768749 + X128_Y128= -87.32768749 -84.49999212 206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -87.32768749 84.50000788 -206.8287335 + X1_Y128= -206.8287335 84.50000788 -87.32768749 + X128_Y1= -87.32768749 -84.49999212 -206.8287335 + X128_Y128= -206.8287335 -84.49999212 -87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.49999606 87.32768749 -206.8287335 + X1_Y128= 84.50000394 87.32768749 -206.8287335 + X128_Y1= -84.49999606 206.8287335 -87.32768749 + X128_Y128= 84.50000394 206.8287335 -87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.49999606 206.8287335 87.32768749 + X1_Y128= 84.50000394 206.8287335 87.32768749 + X128_Y1= -84.49999606 87.32768749 206.8287335 + X128_Y128= 84.50000394 87.32768749 206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.50001182 -87.32768749 206.8287335 + X1_Y128= 84.49998818 -87.32768749 206.8287335 + X128_Y1= -84.50001182 -206.8287335 87.32768749 + X128_Y128= 84.49998818 -206.8287335 87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.50001182 -206.8287335 -87.32768749 + X1_Y128= 84.49998818 -206.8287335 -87.32768749 + X128_Y1= -84.50001182 -87.32768749 -206.8287335 + X128_Y128= 84.49998818 -87.32768749 -206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -128.6063166 143.3590149 -88.30123599 + X1_Y128= -151.8764696 96.81870993 -111.571389 + X128_Y1= -88.30122956 143.3590149 -128.606323 + X128_Y128= -111.5713826 96.81870993 -151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -88.30122956 143.3590149 128.606323 + X1_Y128= -111.5713826 96.81870993 151.876476 + X128_Y1= -128.6063166 143.3590149 88.30123599 + X128_Y128= -151.8764696 96.81870993 111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 128.606323 143.3590085 88.30123599 + X1_Y128= 151.876476 96.81870349 111.571389 + X128_Y1= 88.30123599 143.3590085 128.606323 + X128_Y128= 111.571389 96.81870349 151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%ParisPhoswich +% X1_Y1= 88.30123599 143.3590085 -128.606323 +% X1_Y128= 111.571389 96.81870349 -151.876476 +% X128_Y1= 128.606323 143.3590085 -88.30123599 +% X128_Y128= 151.876476 96.81870349 -111.571389 +% VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -88.30124243 -143.3590021 -128.606323 + X1_Y128= -111.5713954 -96.81869706 -151.876476 + X128_Y1= -128.6063294 -143.3590021 -88.30123599 + X128_Y128= -151.8764824 -96.81869706 -111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 128.6063101 -143.3590214 -88.30123599 + X1_Y128= 151.8764631 -96.81871636 -111.571389 + X128_Y1= 88.30122312 -143.3590214 -128.606323 + X128_Y128= 111.5713761 -96.81871636 -151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 88.30122312 -143.3590214 128.606323 + X1_Y128= 111.5713761 -96.81871636 151.876476 + X128_Y1= 128.6063101 -143.3590214 88.30123599 + X128_Y128= 151.8764631 -96.81871636 111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%ParisPhoswich +% X1_Y1= -128.6063294 -143.3590021 88.30123599 +% X1_Y128= -151.8764824 -96.81869706 111.571389 +% X128_Y1= -88.30124243 -143.3590021 128.606323 +% X128_Y128= -111.5713954 -96.81869706 151.876476 +% VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Shield +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ShieldClParis + X1_Y1= 151.375 153.75 364 + X1_Y128= 151.375 91.5 364 + X128_Y1= -84.5 153.75 364 + X128_Y128= -84.5 91.5 364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 -151.375 364 + X1_Y128= 91.49999999 -151.375 364 + X128_Y1= 153.75 84.49999999 364 + X128_Y128= 91.50000004 84.5 364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 -153.75 364 + X1_Y128= -151.375 -91.49999999 364 + X128_Y1= 84.49999997 -153.7500001 364 + X128_Y128= 84.5 -91.50000008 364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 151.375 364 + X1_Y128= -91.49999998 151.375 364 + X128_Y1= -153.7500001 -84.49999996 364 + X128_Y128= -91.50000013 -84.5 364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ShieldClParis + X1_Y1= 151.375 -148.6692007 366.104536 + X1_Y128= 151.375 -192.6865979 322.0871388 + X128_Y1= -84.5 -148.6692007 366.104536 + X128_Y128= -84.5 -192.6865979 322.0871388 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 -364.4251574 150.3485793 + X1_Y128= 91.49999999 -364.4251574 150.3485793 + X128_Y1= 153.75 -197.6363454 317.1373914 + X128_Y128= 91.50000004 -197.6363453 317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 -366.104536 148.6692008 + X1_Y128= -151.375 -322.0871388 192.6865979 + X128_Y1= 84.49999997 -366.104536 148.6692007 + X128_Y128= 84.5 -322.0871389 192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 -150.3485793 364.4251574 + X1_Y128= -91.49999998 -150.3485793 364.4251574 + X128_Y1= -153.7500001 -317.1373913 197.6363454 + X128_Y128= -91.50000013 -317.1373914 197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +ShieldClParis + X1_Y1= 151.375 -364 153.75 + X1_Y128= 151.375 -364 91.5 + X128_Y1= -84.5 -364 153.75 + X128_Y128= -84.5 -364 91.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 -364 -151.375 + X1_Y128= 91.49999999 -364 -151.375 + X128_Y1= 153.75 -364 84.49999999 + X128_Y128= 91.50000004 -364 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 -364 -153.75 + X1_Y128= -151.375 -364 -91.49999999 + X128_Y1= 84.49999997 -364 -153.7500001 + X128_Y128= 84.5 -364 -91.50000008 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 -364 151.375 + X1_Y128= -91.49999998 -364 151.375 + X128_Y1= -153.7500001 -364 -84.49999996 + X128_Y128= -91.50000013 -364 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +ShieldClParis + X1_Y1= 151.375 -366.104536 -148.6692007 + X1_Y128= 151.375 -322.0871388 -192.6865979 + X128_Y1= -84.5 -366.104536 -148.6692007 + X128_Y128= -84.5 -322.0871388 -192.6865979 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 -150.3485793 -364.4251574 + X1_Y128= 91.49999999 -150.3485793 -364.4251574 + X128_Y1= 153.75 -317.1373914 -197.6363454 + X128_Y128= 91.50000004 -317.1373914 -197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 -148.6692008 -366.104536 + X1_Y128= -151.375 -192.6865979 -322.0871388 + X128_Y1= 84.49999997 -148.6692007 -366.104536 + X128_Y128= 84.5 -192.6865978 -322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 -364.4251574 -150.3485793 + X1_Y128= -91.49999998 -364.4251574 -150.3485793 + X128_Y1= -153.7500001 -197.6363454 -317.1373913 + X128_Y128= -91.50000013 -197.6363453 -317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +ShieldClParis + X1_Y1= 151.375 -153.75 -364 + X1_Y128= 151.375 -91.5 -364 + X128_Y1= -84.5 -153.75 -364 + X128_Y128= -84.5 -91.5 -364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 151.375 -364 + X1_Y128= 91.49999999 151.375 -364 + X128_Y1= 153.75 -84.49999999 -364 + X128_Y128= 91.50000004 -84.5 -364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 153.75 -364 + X1_Y128= -151.375 91.49999999 -364 + X128_Y1= 84.49999997 153.7500001 -364 + X128_Y128= 84.5 91.50000008 -364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 -151.375 -364 + X1_Y128= -91.49999998 -151.375 -364 + X128_Y1= -153.7500001 84.49999996 -364 + X128_Y128= -91.50000013 84.5 -364 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +ShieldClParis + X1_Y1= 151.375 148.6692007 -366.104536 + X1_Y128= 151.375 192.6865979 -322.0871388 + X128_Y1= -84.5 148.6692007 -366.104536 + X128_Y128= -84.5 192.6865979 -322.0871388 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 364.4251574 -150.3485793 + X1_Y128= 91.49999999 364.4251574 -150.3485793 + X128_Y1= 153.75 197.6363454 -317.1373914 + X128_Y128= 91.50000004 197.6363453 -317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 366.104536 -148.6692008 + X1_Y128= -151.375 322.0871388 -192.6865979 + X128_Y1= 84.49999997 366.104536 -148.6692007 + X128_Y128= 84.5 322.0871389 -192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 150.3485793 -364.4251574 + X1_Y128= -91.49999998 150.3485793 -364.4251574 + X128_Y1= -153.7500001 317.1373913 -197.6363454 + X128_Y128= -91.50000013 317.1373914 -197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +ShieldClParis + X1_Y1= 151.375 364 -153.75 + X1_Y128= 151.375 364 -91.5 + X128_Y1= -84.5 364 -153.75 + X128_Y128= -84.5 364 -91.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 364 151.375 + X1_Y128= 91.49999999 364 151.375 + X128_Y1= 153.75 364 -84.49999999 + X128_Y128= 91.50000004 364 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 364 153.75 + X1_Y128= -151.375 364 91.49999999 + X128_Y1= 84.49999997 364 153.7500001 + X128_Y128= 84.5 364 91.50000008 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 364 -151.375 + X1_Y128= -91.49999998 364 -151.375 + X128_Y1= -153.7500001 364 84.49999996 + X128_Y128= -91.50000013 364 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +ShieldClParis + X1_Y1= 151.375 366.104536 148.6692007 + X1_Y128= 151.375 322.0871388 192.6865979 + X128_Y1= -84.5 366.104536 148.6692007 + X128_Y128= -84.5 322.0871388 192.6865979 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 153.75 150.3485793 364.4251574 + X1_Y128= 91.49999999 150.3485793 364.4251574 + X128_Y1= 153.75 317.1373914 197.6363454 + X128_Y128= 91.50000004 317.1373914 197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -151.375 148.6692008 366.104536 + X1_Y128= -151.375 192.6865979 322.0871388 + X128_Y1= 84.49999997 148.6692007 366.104536 + X128_Y128= 84.5 192.6865978 322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -153.75 364.4251574 150.3485793 + X1_Y128= -91.49999998 364.4251574 150.3485793 + X128_Y1= -153.7500001 197.6363454 317.1373913 + X128_Y128= -91.50000013 197.6363453 317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 +ShieldClParis + X1_Y1= -150.3485793 153.75 364.4251574 + X1_Y128= -150.3485793 91.5 364.4251574 + X128_Y1= -317.1373914 153.75 197.6363453 + X128_Y128= -317.1373914 91.5 197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -148.6692007 -151.375 366.104536 + X1_Y128= -192.6865979 -151.375 322.0871388 + X128_Y1= -148.6692007 84.49999999 366.104536 + X128_Y128= -192.6865978 84.5 322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364.4251574 -153.75 150.3485793 + X1_Y128= -364.4251574 -91.49999999 150.3485793 + X128_Y1= -197.6363454 -153.7500001 317.1373913 + X128_Y128= -197.6363453 -91.50000008 317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -366.1045359 151.375 148.6692008 + X1_Y128= -322.0871388 151.375 192.6865979 + X128_Y1= -366.104536 -84.49999996 148.6692007 + X128_Y128= -322.0871389 -84.5 192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 +ShieldClParis + X1_Y1= -364 153.75 151.375 + X1_Y128= -364 91.5 151.375 + X128_Y1= -364 153.75 -84.5 + X128_Y128= -364 91.5 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364 -151.375 153.75 + X1_Y128= -364 -151.375 91.49999999 + X128_Y1= -364 84.49999999 153.75 + X128_Y128= -364 84.5 91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364 -153.75 -151.375 + X1_Y128= -364 -91.49999999 -151.375 + X128_Y1= -364 -153.7500001 84.49999997 + X128_Y128= -364 -91.50000008 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364 151.375 -153.75 + X1_Y128= -364 151.375 -91.49999998 + X128_Y1= -364 -84.49999996 -153.7500001 + X128_Y128= -364 -84.5 -91.50000013 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 +ShieldClParis + X1_Y1= -364.4251574 153.75 -150.3485793 + X1_Y128= -364.4251574 91.5 -150.3485793 + X128_Y1= -197.6363453 153.75 -317.1373914 + X128_Y128= -197.6363453 91.5 -317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -366.104536 -151.375 -148.6692007 + X1_Y128= -322.0871388 -151.375 -192.6865979 + X128_Y1= -366.104536 84.49999999 -148.6692007 + X128_Y128= -322.0871389 84.5 -192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -150.3485793 -153.75 -364.4251574 + X1_Y128= -150.3485793 -91.49999999 -364.4251574 + X128_Y1= -317.1373913 -153.7500001 -197.6363454 + X128_Y128= -317.1373914 -91.50000008 -197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -148.6692008 151.375 -366.1045359 + X1_Y128= -192.6865979 151.375 -322.0871388 + X128_Y1= -148.6692007 -84.49999996 -366.104536 + X128_Y128= -192.6865978 -84.5 -322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 +ShieldClParis + X1_Y1= 150.3485793 153.75 -364.4251574 + X1_Y128= 150.3485793 91.5 -364.4251574 + X128_Y1= 317.1373914 153.75 -197.6363453 + X128_Y128= 317.1373914 91.5 -197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 148.6692007 -151.375 -366.104536 + X1_Y128= 192.6865979 -151.375 -322.0871388 + X128_Y1= 148.6692007 84.49999999 -366.104536 + X128_Y128= 192.6865978 84.5 -322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364.4251574 -153.75 -150.3485793 + X1_Y128= 364.4251574 -91.49999999 -150.3485793 + X128_Y1= 197.6363454 -153.7500001 -317.1373913 + X128_Y128= 197.6363453 -91.50000008 -317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 366.1045359 151.375 -148.6692008 + X1_Y128= 322.0871388 151.375 -192.6865979 + X128_Y1= 366.104536 -84.49999996 -148.6692007 + X128_Y128= 322.0871389 -84.5 -192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 +ShieldClParis + X1_Y1= 364 153.75 -151.375 + X1_Y128= 364 91.5 -151.375 + X128_Y1= 364 153.75 84.5 + X128_Y128= 364 91.5 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364 -151.375 -153.75 + X1_Y128= 364 -151.375 -91.49999999 + X128_Y1= 364 84.49999999 -153.75 + X128_Y128= 364 84.5 -91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364 -153.75 151.375 + X1_Y128= 364 -91.49999999 151.375 + X128_Y1= 364 -153.7500001 -84.49999997 + X128_Y128= 364 -91.50000008 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364 151.375 153.75 + X1_Y128= 364 151.375 91.49999998 + X128_Y1= 364 -84.49999996 153.7500001 + X128_Y128= 364 -84.5 91.50000013 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 +ShieldClParis + X1_Y1= 364.4251574 153.75 150.3485793 + X1_Y128= 364.4251574 91.5 150.3485793 + X128_Y1= 197.6363453 153.75 317.1373914 + X128_Y128= 197.6363453 91.5 317.1373914 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 366.104536 -151.375 148.6692007 + X1_Y128= 322.0871388 -151.375 192.6865979 + X128_Y1= 366.104536 84.49999999 148.6692007 + X128_Y128= 322.0871389 84.5 192.6865978 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 150.3485793 -153.75 364.4251574 + X1_Y128= 150.3485793 -91.49999999 364.4251574 + X128_Y1= 317.1373913 -153.7500001 197.6363454 + X128_Y128= 317.1373914 -91.50000008 197.6363453 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 148.6692008 151.375 366.1045359 + X1_Y128= 192.6865979 151.375 322.0871388 + X128_Y1= 148.6692007 -84.49999996 366.104536 + X128_Y128= 192.6865978 -84.5 322.0871389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 +ShieldClParis + X1_Y1= -366.104536 -148.6692007 151.375 + X1_Y128= -322.0871388 -192.6865979 151.375 + X128_Y1= -366.104536 -148.6692007 -84.5 + X128_Y128= -322.0871388 -192.6865979 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -150.3485793 -364.4251574 153.75 + X1_Y128= -150.3485793 -364.4251574 91.49999999 + X128_Y1= -317.1373914 -197.6363454 153.75 + X128_Y128= -317.1373914 -197.6363453 91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -148.6692008 -366.104536 -151.375 + X1_Y128= -192.6865979 -322.0871388 -151.375 + X128_Y1= -148.6692007 -366.104536 84.49999997 + X128_Y128= -192.6865978 -322.0871389 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364.4251574 -150.3485793 -153.75 + X1_Y128= -364.4251574 -150.3485793 -91.49999998 + X128_Y1= -197.6363454 -317.1373913 -153.7500001 + X128_Y128= -197.6363453 -317.1373914 -91.50000013 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 +ShieldClParis + X1_Y1= 366.104536 -148.6692007 -151.375 + X1_Y128= 322.0871388 -192.6865979 -151.375 + X128_Y1= 366.104536 -148.6692007 84.5 + X128_Y128= 322.0871388 -192.6865979 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 150.3485793 -364.4251574 -153.75 + X1_Y128= 150.3485793 -364.4251574 -91.49999999 + X128_Y1= 317.1373914 -197.6363454 -153.75 + X128_Y128= 317.1373914 -197.6363453 -91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 148.6692008 -366.104536 151.375 + X1_Y128= 192.6865979 -322.0871388 151.375 + X128_Y1= 148.6692007 -366.104536 -84.49999997 + X128_Y128= 192.6865978 -322.0871389 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364.4251574 -150.3485793 153.75 + X1_Y128= 364.4251574 -150.3485793 91.49999998 + X128_Y1= 197.6363454 -317.1373913 153.7500001 + X128_Y128= 197.6363453 -317.1373914 91.50000013 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 +ShieldClParis + X1_Y1= -148.6692007 366.104536 151.375 + X1_Y128= -192.6865979 322.0871388 151.375 + X128_Y1= -148.6692007 366.104536 -84.5 + X128_Y128= -192.6865979 322.0871388 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -364.4251574 150.3485793 153.75 + X1_Y128= -364.4251574 150.3485793 91.49999999 + X128_Y1= -197.6363454 317.1373914 153.75 + X128_Y128= -197.6363453 317.1373914 91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -366.104536 148.6692008 -151.375 + X1_Y128= -322.0871388 192.6865979 -151.375 + X128_Y1= -366.104536 148.6692007 84.49999997 + X128_Y128= -322.0871389 192.6865978 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= -150.3485793 364.4251574 -153.75 + X1_Y128= -150.3485793 364.4251574 -91.49999998 + X128_Y1= -317.1373913 197.6363454 -153.7500001 + X128_Y128= -317.1373914 197.6363453 -91.50000013 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 +ShieldClParis + X1_Y1= 148.6692007 366.104536 -151.375 + X1_Y128= 192.6865979 322.0871388 -151.375 + X128_Y1= 148.6692007 366.104536 84.5 + X128_Y128= 192.6865979 322.0871388 84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 364.4251574 150.3485793 -153.75 + X1_Y128= 364.4251574 150.3485793 -91.49999999 + X128_Y1= 197.6363454 317.1373914 -153.75 + X128_Y128= 197.6363453 317.1373914 -91.50000004 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 366.104536 148.6692008 151.375 + X1_Y128= 322.0871388 192.6865979 151.375 + X128_Y1= 366.104536 148.6692007 -84.49999997 + X128_Y128= 322.0871389 192.6865978 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ShieldClParis + X1_Y1= 150.3485793 364.4251574 153.75 + X1_Y128= 150.3485793 364.4251574 91.49999998 + X128_Y1= 317.1373913 197.6363454 153.7500001 + X128_Y128= 317.1373914 197.6363453 91.50000013 + VIS=all + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ShieldPhParis + THETA= 54.73 + PHI= 45.02 + R= 248 + BETA= 0 0 -30 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ShieldPhParis + THETA= 54.73 + PHI= 134.98 + R= 248 + BETA= 0 0 210 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +%ShieldPhParis +% THETA= 54.73 +% PHI= 225 +% R= 248 +% BETA= 0 0 -30 +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +ShieldPhParis + THETA= 54.73 + PHI= 315 + R= 248 + BETA= 0 0 210 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +%ShieldPhParis +% THETA= 125.26 +% PHI= 45.02 +% R= 248 +% BETA= 0 0 30 +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +ShieldPhParis + THETA= 125.26 + PHI= 134.98 + R= 248 + BETA= 0 0 -210 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +ShieldPhParis + THETA= 125.26 + PHI= 225 + R= 248 + BETA= 0 0 30 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +ShieldPhParis + THETA= 125.26 + PHI= 315 + R= 248 + BETA= 0 0 -210 + VIS= all diff --git a/Projects/Paris/DetectorConfigurtation/ParisAll_208pipe2noshield.detector b/Projects/Paris/DetectorConfigurtation/ParisAll_208pipe2noshield.detector new file mode 100644 index 0000000000000000000000000000000000000000..df9815c347276910108392dcf852088b4571e574 --- /dev/null +++ b/Projects/Paris/DetectorConfigurtation/ParisAll_208pipe2noshield.detector @@ -0,0 +1,211 @@ +%Fichier de configuration manip E225 +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and R given in mm +%%Angle given in degree +%%Option: 0,1 for Si SiLi and CsI +%%Option: all or sensible for VISualisation +%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 +%Thickness in micrometer +%Radius in mm +%Temperature in K, Pressure in bar +%Material name according to the target library + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 10.3 + ANGLE= 0 + RADIUS= 12 + MATERIAL= CD2 + X= 0 + Y= 0 + Z= 0 + NBLAYERS= 50 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ParisCluster + X1_Y1= -84.5 -208 84.5 + X1_Y128= 84.5 -208 84.5 + X128_Y1= -84.5 -208 -84.5 + X128_Y128= 84.5 -208 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + X1_Y1= -206.8287414 -87.3276796 84.5 + X1_Y128= -87.32769537 -206.8287256 84.5 + X128_Y1= -206.8287414 -87.3276796 -84.5 + X128_Y128= -87.32769537 -206.8287256 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -208 84.50001115 84.5 + X1_Y128= -208 -84.49998885 84.5 + X128_Y1= -208 84.50001115 -84.5 + X128_Y128= -208 -84.49998885 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -87.3276796 206.8287414 84.5 + X1_Y128= -206.8287256 87.32769537 84.5 + X128_Y1= -87.3276796 206.8287414 -84.5 + X128_Y128= -206.8287256 87.32769537 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 84.50000557 208 84.5 + X1_Y128= -84.49999443 208 84.5 + X128_Y1= 84.50000557 208 -84.5 + X128_Y128= -84.49999443 208 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 206.8287335 87.32768749 84.5 + X1_Y128= 87.32768749 206.8287335 84.5 + X128_Y1= 206.8287335 87.32768749 -84.5 + X128_Y128= 87.32768749 206.8287335 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 208 -84.50002229 84.5 + X1_Y128= 208 84.49997771 84.5 + X128_Y1= 208 -84.50002229 -84.5 + X128_Y128= 208 84.49997771 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 87.32767172 -206.8287493 84.5 + X1_Y128= 206.8287177 -87.32770325 84.5 + X128_Y1= 87.32767172 -206.8287493 -84.5 + X128_Y128= 206.8287177 -87.32770325 -84.5 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 84.5 84.5 -208 + X1_Y128= -84.5 84.5 -208 + X128_Y1= 84.5 -84.5 -208 + X128_Y128= -84.5 -84.5 -208 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 206.8287335 84.49998424 -87.32768749 + X1_Y128= 87.32768749 84.49998424 -206.8287335 + X128_Y1= 206.8287335 -84.50001576 -87.32768749 + X128_Y128= 87.32768749 -84.50001576 -206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= 87.32768749 84.49998424 206.8287335 + X1_Y128= 206.8287335 84.49998424 87.32768749 + X128_Y1= 87.32768749 -84.50001576 206.8287335 + X128_Y128= 206.8287335 -84.50001576 87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.5 84.5 208 + X1_Y128= 84.5 84.5 208 + X128_Y1= -84.5 -84.5 208 + X128_Y128= 84.5 -84.5 208 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -206.8287335 84.50000788 87.32768749 + X1_Y128= -87.32768749 84.50000788 206.8287335 + X128_Y1= -206.8287335 -84.49999212 87.32768749 + X128_Y128= -87.32768749 -84.49999212 206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -87.32768749 84.50000788 -206.8287335 + X1_Y128= -206.8287335 84.50000788 -87.32768749 + X128_Y1= -87.32768749 -84.49999212 -206.8287335 + X128_Y128= -206.8287335 -84.49999212 -87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.49999606 87.32768749 -206.8287335 + X1_Y128= 84.50000394 87.32768749 -206.8287335 + X128_Y1= -84.49999606 206.8287335 -87.32768749 + X128_Y128= 84.50000394 206.8287335 -87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.49999606 206.8287335 87.32768749 + X1_Y128= 84.50000394 206.8287335 87.32768749 + X128_Y1= -84.49999606 87.32768749 206.8287335 + X128_Y128= 84.50000394 87.32768749 206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.50001182 -87.32768749 206.8287335 + X1_Y128= 84.49998818 -87.32768749 206.8287335 + X128_Y1= -84.50001182 -206.8287335 87.32768749 + X128_Y128= 84.49998818 -206.8287335 87.32768749 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisCluster + X1_Y1= -84.50001182 -206.8287335 -87.32768749 + X1_Y128= 84.49998818 -206.8287335 -87.32768749 + X128_Y1= -84.50001182 -87.32768749 -206.8287335 + X128_Y128= 84.49998818 -87.32768749 -206.8287335 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -128.6063166 143.3590149 -88.30123599 + X1_Y128= -151.8764696 96.81870993 -111.571389 + X128_Y1= -88.30122956 143.3590149 -128.606323 + X128_Y128= -111.5713826 96.81870993 -151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -88.30122956 143.3590149 128.606323 + X1_Y128= -111.5713826 96.81870993 151.876476 + X128_Y1= -128.6063166 143.3590149 88.30123599 + X128_Y128= -151.8764696 96.81870993 111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 128.606323 143.3590085 88.30123599 + X1_Y128= 151.876476 96.81870349 111.571389 + X128_Y1= 88.30123599 143.3590085 128.606323 + X128_Y128= 111.571389 96.81870349 151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%ParisPhoswich +% X1_Y1= 88.30123599 143.3590085 -128.606323 +% X1_Y128= 111.571389 96.81870349 -151.876476 +% X128_Y1= 128.606323 143.3590085 -88.30123599 +% X128_Y128= 151.876476 96.81870349 -111.571389 +% VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= -88.30124243 -143.3590021 -128.606323 + X1_Y128= -111.5713954 -96.81869706 -151.876476 + X128_Y1= -128.6063294 -143.3590021 -88.30123599 + X128_Y128= -151.8764824 -96.81869706 -111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 128.6063101 -143.3590214 -88.30123599 + X1_Y128= 151.8764631 -96.81871636 -111.571389 + X128_Y1= 88.30122312 -143.3590214 -128.606323 + X128_Y128= 111.5713761 -96.81871636 -151.876476 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ParisPhoswich + X1_Y1= 88.30122312 -143.3590214 128.606323 + X1_Y128= 111.5713761 -96.81871636 151.876476 + X128_Y1= 128.6063101 -143.3590214 88.30123599 + X128_Y128= 151.8764631 -96.81871636 111.571389 + VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%ParisPhoswich +% X1_Y1= -128.6063294 -143.3590021 88.30123599 +% X1_Y128= -151.8764824 -96.81869706 111.571389 +% X128_Y1= -88.30124243 -143.3590021 128.606323 +% X128_Y128= -111.5713954 -96.81869706 151.876476 +% VIS=all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Projects/Paris/DetectorConfigurtation/ParisAll_208tilt.detector b/Projects/Paris/DetectorConfigurtation/ParisAll_208tilt.detector new file mode 100644 index 0000000000000000000000000000000000000000..5919341a85ee843330e477071172386fc973781f --- /dev/null +++ b/Projects/Paris/DetectorConfigurtation/ParisAll_208tilt.detector @@ -0,0 +1,220 @@ +%Fichier de configuration manip E225 +%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 +%Thickness in micrometer +%Radius in mm +%Temperature in K, Pressure in bar +%Material name according to the target library + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 10.3 + ANGLE= 0 + RADIUS= 12 + MATERIAL= CD2 + NBLAYERS= 50 + X= 0 + Y= 0 + Z= 0 + + +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and R given in mm +%%Angle given in degree +%%Option: 0,1 for Si SiLi and CsI +%%Option: all or sensible for VISualisation + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ParisCluster + X1_Y1= -50.418664 -87.327687 -217.661051 + X1_Y128= -188.406586 -87.327687 -120.088856 + X128_Y1= 18.575297 -206.828733 -120.088856 + X128_Y128= -119.412625 -206.828733 -22.51666 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisClShield + X1_Y1= 151.375 153.75 364 + X1_Y128= 151.375 91.5 364 + X128_Y1= -84.5 153.75 364 + X128_Y128= -84.5 91.5 364 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + X1_Y1= -190.237216 -86.499477 -117.780059 + X1_Y128= -239.023313 -1.999477 20.207863 + X128_Y1= -121.243255 -206.000523 -20.207863 + X128_Y128= -170.029352 -121.500523 117.780059 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +ParisCluster + X1_Y1= -238.82525 0 22.51666 + X1_Y128= -169.831289 119.501046 120.088856 + X128_Y1= -169.831289 -119.501046 120.088856 + X128_Y128= -100.837328 0 217.661051 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +ParisCluster + X1_Y1= -167.720555 121.500523 121.045191 + X1_Y128= -21.362262 206.000523 121.045191 + X128_Y1= -98.726594 1.999477 218.617387 + X128_Y128= 47.631699 86.499477 218.617387 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +ParisCluster + X1_Y1= -18.575297 206.828733 120.088856 + X1_Y128= 119.412625 206.828733 22.51666 + X128_Y1= 50.418664 87.327687 217.661051 + X128_Y128= 188.406586 87.327687 120.088856 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +ParisCluster + X1_Y1= 121.243255 206.000523 20.207863 + X1_Y128= 170.029352 121.500523 -117.780059 + X128_Y1= 190.237216 86.499477 117.780059 + X128_Y128= 239.023313 1.999477 -20.207863 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +ParisCluster + X1_Y1= 169.831289 119.501046 -120.088856 + X1_Y128= 100.837328 0 -217.661051 + X128_Y1= 238.82525 0 -22.51666 + X128_Y128= 169.831289 -119.501046 -120.088856 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +ParisCluster + X1_Y1= 98.726594 -1.999477 -218.617387 + X1_Y128= -47.631699 -86.499477 -218.617387 + X128_Y1= 167.720555 -121.500523 -121.045191 + X128_Y128= 21.362262 -206.000523 -121.045191 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 +ParisCluster + X1_Y1= 50.418664 -87.327687 217.661051 + X1_Y128= 188.406586 -87.327687 120.088856 + X128_Y1= -18.575297 -206.828733 120.088856 + X128_Y128= 119.412625 -206.828733 22.51666 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 +ParisCluster + X1_Y1= 190.237216 -86.499477 117.780059 + X1_Y128= 239.023313 -1.999477 -20.207863 + X128_Y1= 121.243255 -206.000523 20.207863 + X128_Y128= 170.029352 -121.500523 -117.780059 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 +ParisCluster + X1_Y1= 167.720555 121.500523 -121.045191 + X1_Y128= 21.362262 206.000523 -121.045191 + X128_Y1= 98.726594 1.999477 -218.617387 + X128_Y128= -47.631699 86.499477 -218.617387 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 +ParisCluster + X1_Y1= 18.575297 206.828733 -120.088856 + X1_Y128= -119.412625 206.828733 -22.51666 + X128_Y1= -50.418664 87.327687 -217.661051 + X128_Y128= -188.406586 87.327687 -120.088856 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 +ParisCluster + X1_Y1= -121.243255 206.000523 -20.207863 + X1_Y128= -170.029352 121.500523 117.780059 + X128_Y1= -190.237216 86.499477 -117.780059 + X128_Y128= -239.023313 1.999477 20.207863 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 +ParisCluster + X1_Y1= -98.726594 -1.999477 218.617387 + X1_Y128= 47.631699 -86.499477 218.617387 + X128_Y1= -167.720555 -121.500523 121.045191 + X128_Y128= -21.362262 -206.000523 121.045191 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 +ParisCluster + X1_Y1= 189.082817 -84.5 121.045191 + X1_Y128= 51.094895 -84.5 218.617387 + X128_Y1= 189.082817 84.5 121.045191 + X128_Y128= 51.094895 84.5 218.617387 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 +ParisCluster + X1_Y1= 117.780059 208 20.207863 + X1_Y128= -20.207863 208 117.780059 + X128_Y1= 20.207863 208 -117.780059 + X128_Y128= -117.780059 208 -20.207863 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 +ParisCluster + X1_Y1= -51.094895 84.5 -218.617387 + X1_Y128= -189.082817 84.5 -121.045191 + X128_Y1= -51.094895 -84.5 -218.617387 + X128_Y128= -189.082817 -84.5 -121.045191 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 +ParisCluster + X1_Y1= 20.207863 -208 -117.780059 + X1_Y128= -117.780059 -208 -20.207863 + X128_Y1= 117.780059 -208 20.207863 + X128_Y128= -20.207863 -208 117.780059 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ParisPhoswich + X1_Y1= -130.029382 -147.354047 79.168457 + X1_Y128= -82.529382 -163.80853 106.038515 + X128_Y1= -113.574899 -175.854047 32.628152 + X128_Y128= -66.074899 -192.30853 59.49821 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisPhoswich + X1_Y1= 68.620416 -175.854047 -96.203391 + X1_Y128= 78.120416 -192.30853 -42.463276 + X128_Y1= 117.983864 -147.354047 -96.203391 + X128_Y128= 127.483864 -163.80853 -42.463276 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +ParisPhoswich + X1_Y1= 209.081522 10.431724 32.628152 + X1_Y128= 199.581522 -38.931724 59.49821 + X128_Y1= 192.627039 38.931724 79.168457 + X128_Y128= 183.127039 -10.431724 106.038515 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +%ParisPhoswich +% X1_Y1= 10.431724 38.931724 208 +% X1_Y128= 38.931724 -10.431724 208 +% X128_Y1= -38.931724 10.431724 208 +% X128_Y128= -10.431724 -38.931724 208 +% VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +%ParisPhoswich +% X1_Y1= -38.931724 10.431724 -208.000012 +% X1_Y128= -10.431724 -38.931724 -208.000012 +% X128_Y1= 10.431724 38.931724 -208.000012 +% X128_Y128= 38.931724 -10.431724 -208.000012 +% VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +ParisPhoswich + X1_Y1= 82.529387 163.80854 -106.038519 + X1_Y128= 130.029387 147.354057 -79.168461 + X128_Y1= 66.074904 192.30854 -59.498213 + X128_Y128= 113.574904 175.854057 -32.628156 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +ParisPhoswich + X1_Y1= -78.120422 192.30854 42.46328 + X1_Y128= -68.620422 175.854057 96.203395 + X128_Y1= -127.48387 163.80854 42.46328 + X128_Y128= -117.98387 147.354057 96.203395 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +ParisPhoswich + X1_Y1= -199.581533 38.931724 -59.498213 + X1_Y128= -209.081533 -10.431724 -32.628156 + X128_Y1= -183.12705 10.431724 -106.038519 + X128_Y128= -192.62705 -38.931724 -79.168461 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Projects/Paris/DetectorConfigurtation/ParisAll_235.detector b/Projects/Paris/DetectorConfigurtation/ParisAll_235.detector new file mode 100644 index 0000000000000000000000000000000000000000..bba3ba507e6928d236f6024b5d3a47449fb932ac --- /dev/null +++ b/Projects/Paris/DetectorConfigurtation/ParisAll_235.detector @@ -0,0 +1,340 @@ +%Fichier de configuration manip E225 +%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 +%Thickness in micrometer +%Radius in mm +%Temperature in K, Pressure in bar +%Material name according to the target library + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 10.3 + ANGLE= 0 + RADIUS= 12 + MATERIAL= CD2 + NBLAYERS= 50 + X= 0 + Y= 0 + Z= 0 + + +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and R given in mm +%%Angle given in degree +%%Option: 0,1 for Si SiLi and CsI +%%Option: all or sensible for VISualisation + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GeneralChamber +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Chamber + Rmin= 200 + Rmax= 201 + PhiMin= 0. + PhiMax= 6.14318 + ThetaMin= 0. + ThetaMax= 3.14159 + MATERIAL= Cu + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ParisCluster + X1_Y1= -84.5 -235 84.5 + X1_Y128= 84.5 -235 84.5 + X128_Y1= -84.5 -235 -84.5 + X128_Y128= 84.5 -235 -84.5 + VIS= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + X1_Y1= -225.920617 -106.419571 84.5 + X1_Y128= -106.419571 -225.920617 84.5 + X128_Y1= -225.920617 -106.419571 -84.5 + X128_Y128= -106.419571 -225.920617 -84.5 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +ParisCluster + X1_Y1= -235 84.5 84.5 + X1_Y128= -235 -84.5 84.5 + X128_Y1= -235 84.5 -84.5 + X128_Y128= -235 -84.5 -84.5 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +ParisCluster + X1_Y1= -106.419571 225.920617 84.5 + X1_Y128= -225.920617 106.419571 84.5 + X128_Y1= -106.419571 225.920617 -84.5 + X128_Y128= -225.920617 106.419571 -84.5 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +ParisCluster + X1_Y1= 84.5 235 84.5 + X1_Y128= -84.5 235 84.5 + X128_Y1= 84.5 235 -84.5 + X128_Y128= -84.5 235 -84.5 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +ParisCluster + X1_Y1= 225.920617 106.419571 84.5 + X1_Y128= 106.419571 225.920617 84.5 + X128_Y1= 225.920617 106.419571 -84.5 + X128_Y128= 106.419571 225.920617 -84.5 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +ParisCluster + X1_Y1= 235 -84.5 84.5 + X1_Y128= 235 84.5 84.5 + X128_Y1= 235 -84.5 -84.5 + X128_Y128= 235 84.5 -84.5 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +ParisCluster + X1_Y1= 106.419571 -225.920617 84.5 + X1_Y128= 225.920617 -106.419571 84.5 + X128_Y1= 106.419571 -225.920617 -84.5 + X128_Y128= 225.920617 -106.419571 -84.5 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 +ParisCluster + X1_Y1= 84.5 84.5 -235 + X1_Y128= -84.5 84.5 -235 + X128_Y1= 84.5 -84.5 -235 + X128_Y128= -84.5 -84.5 -235 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 +ParisCluster + X1_Y1= 225.920617 84.5 -106.419571 + X1_Y128= 106.419571 84.5 -225.920617 + X128_Y1= 225.920617 -84.5 -106.419571 + X128_Y128= 106.419571 -84.5 -225.920617 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 +ParisCluster + X1_Y1= 106.419571 84.5 225.920617 + X1_Y128= 225.920617 84.5 106.419571 + X128_Y1= 106.419571 -84.5 225.920617 + X128_Y128= 225.920617 -84.5 106.419571 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 +ParisCluster + X1_Y1= -84.5 84.5 235 + X1_Y128= 84.5 84.5 235 + X128_Y1= -84.5 -84.5 235 + X128_Y128= 84.5 -84.5 235 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 +ParisCluster + X1_Y1= -225.920617 84.5 106.419571 + X1_Y128= -106.419571 84.5 225.920617 + X128_Y1= -225.920617 -84.5 106.419571 + X128_Y128= -106.419571 -84.5 225.920617 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 +ParisCluster + X1_Y1= -106.419571 84.5 -225.920617 + X1_Y128= -225.920617 84.5 -106.419571 + X128_Y1= -106.419571 -84.5 -225.920617 + X128_Y128= -225.920617 -84.5 -106.419571 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 +ParisCluster + X1_Y1= -84.5 106.419571 -225.920617 + X1_Y128= 84.5 106.419571 -225.920617 + X128_Y1= -84.5 225.920617 -106.419571 + X128_Y128= 84.5 225.920617 -106.419571 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 +ParisCluster + X1_Y1= -84.5 225.920617 106.419571 + X1_Y128= 84.5 225.920617 106.419571 + X128_Y1= -84.5 106.419571 225.920617 + X128_Y128= 84.5 106.419571 225.920617 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 +ParisCluster + X1_Y1= -84.5 -106.419571 225.920617 + X1_Y128= 84.5 -106.419571 225.920617 + X128_Y1= -84.5 -225.920617 106.419571 + X128_Y128= 84.5 -225.920617 106.419571 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 +ParisCluster + X1_Y1= -84.5 -225.920617 -106.419571 + X1_Y128= 84.5 -225.920617 -106.419571 + X128_Y1= -84.5 -106.419571 -225.920617 + X128_Y128= 84.5 -106.419571 -225.920617 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ParisPhoswich + X1_Y1= -175.9824 135.677313 -95.372227 + X1_Y128= -199.252552 89.137008 -118.642379 + X128_Y1= -135.677313 135.677313 -135.677313 + X128_Y128= -158.947466 89.137008 -158.947466 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisPhoswich + X1_Y1= -135.677313 135.677313 -135.677313 + X1_Y128= -158.947466 89.137008 -158.947466 + X128_Y1= -95.372227 135.677313 -175.9824 + X128_Y128= -118.642379 89.137008 -199.252552 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +ParisPhoswich + X1_Y1= -132.559704 182.217618 -92.254617 + X1_Y128= -155.829857 135.677313 -115.52477 + X128_Y1= -92.254617 182.217618 -132.559704 + X128_Y128= -115.52477 135.677313 -155.829857 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +ParisPhoswich + X1_Y1= -95.372227 135.677313 175.9824 + X1_Y128= -118.642379 89.137008 199.252552 + X128_Y1= -135.677313 135.677313 135.677313 + X128_Y128= -158.947466 89.137008 158.947466 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +ParisPhoswich + X1_Y1= -135.677313 135.677313 135.677313 + X1_Y128= -158.947466 89.137008 158.947466 + X128_Y1= -175.9824 135.677313 95.372227 + X128_Y128= -199.252552 89.137008 118.642379 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +ParisPhoswich + X1_Y1= -92.254617 182.217618 132.559704 + X1_Y128= -115.52477 135.677313 155.829857 + X128_Y1= -132.559704 182.217618 92.254617 + X128_Y128= -155.829857 135.677313 115.52477 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +%ParisPhoswich +% X1_Y1= 175.9824 135.677313 95.372227 +% X1_Y128= 199.252552 89.137008 118.642379 +% X128_Y1= 135.677313 135.677313 135.677313 +% X128_Y128= 158.947466 89.137008 158.947466 +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +%ParisPhoswich +% X1_Y1= 135.677313 135.677313 135.677313 +% X1_Y128= 158.947466 89.137008 158.947466 +% X128_Y1= 95.372227 135.677313 175.9824 +% X128_Y128= 118.642379 89.137008 199.252552 +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8 +%ParisPhoswich +% X1_Y1= 132.559704 182.217618 92.254617 +% X1_Y128= 155.829857 135.677313 115.52477 +% X128_Y1= 92.254617 182.217618 132.559704 +% X128_Y128= 115.52477 135.677313 155.829857 +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 +ParisPhoswich + X1_Y1= 95.372227 135.677313 -175.9824 + X1_Y128= 118.642379 89.137008 -199.252552 + X128_Y1= 135.677313 135.677313 -135.677313 + X128_Y128= 158.947466 89.137008 -158.947466 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10 +ParisPhoswich + X1_Y1= 135.677313 135.677313 -135.677313 + X1_Y128= 158.947466 89.137008 -158.947466 + X128_Y1= 175.9824 135.677313 -95.372227 + X128_Y128= 199.252552 89.137008 -118.642379 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11 +ParisPhoswich + X1_Y1= 92.254617 182.217618 -132.559704 + X1_Y128= 115.52477 135.677313 -155.829857 + X128_Y1= 132.559704 182.217618 -92.254617 + X128_Y128= 155.829857 135.677313 -115.52477 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12 +%ParisPhoswich +% X1_Y1= -95.372227 -135.677313 -175.9824 +% X1_Y128= -118.642379 -89.137008 -199.252552 +% X128_Y1= -135.677313 -135.677313 -135.677313 +% X128_Y128= -158.947466 -89.137008 -158.947466 +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13 +%ParisPhoswich +% X1_Y1= -135.677313 -135.677313 -135.677313 +% X1_Y128= -158.947466 -89.137008 -158.947466 +% X128_Y1= -175.9824 -135.677313 -95.372227 +% X128_Y128= -199.252552 -89.137008 -118.642379 +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14 +%ParisPhoswich +% X1_Y1= -92.254617 -182.217618 -132.559704 +% X1_Y128= -115.52477 -135.677313 -155.829857 +% X128_Y1= -132.559704 -182.217618 -92.254617 +% X128_Y128= -155.829857 -135.677313 -115.52477 +% VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15 +ParisPhoswich + X1_Y1= 175.9824 -135.677313 -95.372227 + X1_Y128= 199.252552 -89.137008 -118.642379 + X128_Y1= 135.677313 -135.677313 -135.677313 + X128_Y128= 158.947466 -89.137008 -158.947466 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16 +ParisPhoswich + X1_Y1= 135.677313 -135.677313 -135.677313 + X1_Y128= 158.947466 -89.137008 -158.947466 + X128_Y1= 95.372227 -135.677313 -175.9824 + X128_Y128= 118.642379 -89.137008 -199.252552 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17 +ParisPhoswich + X1_Y1= 132.559704 -182.217618 -92.254617 + X1_Y128= 155.829857 -135.677313 -115.52477 + X128_Y1= 92.254617 -182.217618 -132.559704 + X128_Y128= 115.52477 -135.677313 -155.829857 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18 +ParisPhoswich + X1_Y1= 95.372227 -135.677313 175.9824 + X1_Y128= 118.642379 -89.137008 199.252552 + X128_Y1= 135.677313 -135.677313 135.677313 + X128_Y128= 158.947466 -89.137008 158.947466 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%19 +ParisPhoswich + X1_Y1= 135.677313 -135.677313 135.677313 + X1_Y128= 158.947466 -89.137008 158.947466 + X128_Y1= 175.9824 -135.677313 95.372227 + X128_Y128= 199.252552 -89.137008 118.642379 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%20 +ParisPhoswich + X1_Y1= 92.254617 -182.217618 132.559704 + X1_Y128= 115.52477 -135.677313 155.829857 + X128_Y1= 132.559704 -182.217618 92.254617 + X128_Y128= 155.829857 -135.677313 115.52477 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%21 +ParisPhoswich + X1_Y1= -175.9824 -135.677313 95.372227 + X1_Y128= -199.252552 -89.137008 118.642379 + X128_Y1= -135.677313 -135.677313 135.677313 + X128_Y128= -158.947466 -89.137008 158.947466 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22 +ParisPhoswich + X1_Y1= -135.677313 -135.677313 135.677313 + X1_Y128= -158.947466 -89.137008 158.947466 + X128_Y1= -95.372227 -135.677313 175.9824 + X128_Y128= -118.642379 -89.137008 199.252552 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%23 +ParisPhoswich + X1_Y1= -132.559704 -182.217618 92.254617 + X1_Y128= -155.829857 -135.677313 115.52477 + X128_Y1= -92.254617 -182.217618 132.559704 + X128_Y128= -115.52477 -135.677313 155.829857 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Projects/Paris/DetectorConfigurtation/ParisAll_278.detector b/Projects/Paris/DetectorConfigurtation/ParisAll_278.detector new file mode 100644 index 0000000000000000000000000000000000000000..b3977df16362c11a289d6131c6b3df83904cd6dd --- /dev/null +++ b/Projects/Paris/DetectorConfigurtation/ParisAll_278.detector @@ -0,0 +1,213 @@ +%Fichier de configuration manip E225 +%%%%%%%%%%%Target%%%%%%%%%%%%%%%%%%%1 +%Thickness in micrometer +%Radius in mm +%Temperature in K, Pressure in bar +%Material name according to the target library + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +GeneralTarget +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Target + THICKNESS= 10.3 + ANGLE= 0 + RADIUS= 12 + MATERIAL= CD2 + NBLAYERS= 50 + X= 0 + Y= 0 + Z= 0 + + +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%Position and R given in mm +%%Angle given in degree +%%Option: 0,1 for Si SiLi and CsI +%%Option: all or sensible for VISualisation + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Paris +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 +ParisCluster + X1_Y1= -87.401156 -247.587661 -124.767336 + X1_Y128= -224.125028 -149.474941 -109.227808 + X128_Y1= -87.401156 -274.025085 42.151993 + X128_Y128= -224.125028 -175.912365 57.691522 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +ParisCluster + X1_Y1= -225.918041 -147.037454 -108.841748 + X1_Y128= -278.141913 11.712262 -83.698263 + X128_Y1= -225.918041 -173.474878 58.077582 + X128_Y128= -278.141913 -14.725162 83.221067 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +ParisCluster + X1_Y1= -278.141913 14.725162 -83.221067 + X1_Y128= -225.918041 173.474878 -58.077582 + X128_Y1= -278.141913 -11.712262 83.698263 + X128_Y128= -225.918041 147.037454 108.841748 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +ParisCluster + X1_Y1= -224.125028 175.912365 -57.691522 + X1_Y128= -87.401156 274.025085 -42.151993 + X128_Y1= -224.125028 149.474941 109.227808 + X128_Y128= -87.401156 247.587661 124.767336 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +ParisCluster + X1_Y1= 87.401156 274.025085 -42.151993 + X1_Y128= 224.125028 175.912365 -57.691522 + X128_Y1= 87.401156 247.587661 124.767336 + X128_Y128= 224.125028 149.474941 109.227808 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +ParisCluster + X1_Y1= 225.918041 173.474878 -58.077582 + X1_Y128= 278.141913 14.725162 -83.221067 + X128_Y1= 225.918041 147.037454 108.841748 + X128_Y128= 278.141913 -11.712262 83.698263 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 +ParisCluster + X1_Y1= 278.141913 11.712262 -83.698263 + X1_Y128= 225.918041 -147.037454 -108.841748 + X128_Y1= 278.141913 -14.725162 83.221067 + X128_Y128= 225.918041 -173.474878 58.077582 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 +ParisCluster + X1_Y1= 224.125028 -149.474941 -109.227808 + X1_Y128= 87.401156 -247.587661 -124.767336 + X128_Y1= 224.125028 -175.912365 57.691522 + X128_Y128= 87.401156 -274.025085 42.151993 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%8ok +ParisCluster + X1_Y1= 84.5 87.401156 264.057357 + X1_Y128= -84.5 87.401156 264.057357 + X128_Y1= 84.5 224.125028 164.72165 + X128_Y128= -84.5 224.125028 164.72165 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9ok +ParisCluster + X1_Y1= 84.5 225.918041 162.253779 + X1_Y128= -84.5 225.918041 162.253779 + X128_Y1= 84.5 278.141913 1.525228 + X128_Y128= -84.5 278.141913 1.525228 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%10ok +ParisCluster + X1_Y1= 84.5 278.141913 -1.525228 + X1_Y128= -84.5 278.141913 -1.525228 + X128_Y1= 84.5 225.918041 -162.253779 + X128_Y128= -84.5 225.918041 -162.253779 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%11ok +ParisCluster + X1_Y1= 84.5 224.125028 -164.72165 + X1_Y128= -84.5 224.125028 -164.72165 + X128_Y1= 84.5 87.401156 -264.057357 + X128_Y128= -84.5 87.401156 -264.057357 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%12ok +ParisCluster + X1_Y1= 84.5 84.5 -265 + X1_Y128= -84.5 84.5 -265 + X128_Y1= 84.5 -84.5 -265 + X128_Y128= -84.5 -84.5 -265 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13ok +ParisCluster + X1_Y1= 84.5 -87.401156 -264.057357 + X1_Y128= -84.5 -87.401156 -264.057357 + X128_Y1= 84.5 -224.125028 -164.72165 + X128_Y128= -84.5 -224.125028 -164.72165 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%14ok +ParisCluster + X1_Y1= 84.5 -225.918041 -162.253779 + X1_Y128= -84.5 -225.918041 -162.253779 + X128_Y1= 84.5 -278.141913 -1.525228 + X128_Y128= -84.5 -278.141913 -1.525228 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%15ok +ParisCluster + X1_Y1= 84.5 -278.141913 1.525228 + X1_Y128= -84.5 -278.141913 1.525228 + X128_Y1= 84.5 -225.918041 162.253779 + X128_Y128= -84.5 -225.918041 162.253779 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%16ok +ParisCluster + X1_Y1= 84.5 -224.125028 164.72165 + X1_Y128= -84.5 -224.125028 164.72165 + X128_Y1= 84.5 -87.401156 264.057357 + X128_Y128= -84.5 -87.401156 264.057357 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%17OK +ParisCluster + X1_Y1= 84.5 -84.5 265 + X1_Y128= -84.5 -84.5 265 + X128_Y1= 84.5 84.5 265 + X128_Y128= -84.5 84.5 265 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18ok +ParisCluster + X1_Y1= -256.780109 22.871011 -134.651931 + X1_Y128= -137.279063 41.565093 -252.681721 + X128_Y1= -219.852255 175.843938 -73.035235 + X128_Y128= -100.351209 194.53802 -191.065025 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%19ok +ParisCluster + X1_Y1= -99.997656 -125.919004 -242.178392 + X1_Y128= -136.92551 38.607501 -253.508118 + X128_Y1= -219.498702 -144.613086 -124.148602 + X128_Y128= -256.426556 19.913419 -135.478328 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%20ok +ParisCluster + X1_Y1= -136.571956 -38.662809 253.857318 + X1_Y128= -256.073002 -19.968727 135.827528 + X128_Y1= -99.644102 125.863696 242.527592 + X128_Y128= -219.145148 144.557778 124.497802 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%21ok +ParisCluster + X1_Y1= -219.498702 -175.899246 73.384435 + X1_Y128= -256.426556 -22.926319 135.001131 + X128_Y1= -99.997656 -194.593328 191.414225 + X128_Y128= -136.92551 -41.620401 253.030921 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%22ok +ParisCluster + X1_Y1= 256.780109 -19.858111 135.129127 + X1_Y128= 137.279063 -38.552193 253.158917 + X128_Y1= 219.852255 144.668394 123.799401 + X128_Y128= 100.351209 125.974312 241.829191 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%23ok +ParisCluster + X1_Y1= 99.997656 -194.593328 191.414225 + X1_Y128= 136.92551 -41.620401 253.030921 + X128_Y1= 219.498702 -175.899246 73.384435 + X128_Y128= 256.426556 -22.926319 135.001131 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24ok +ParisCluster + X1_Y1= 136.571956 41.675709 -253.380122 + X1_Y128= 256.073002 22.981627 -135.350332 + X128_Y1= 99.644102 194.648636 -191.763426 + X128_Y128= 219.145148 175.954554 -73.733636 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%25ok +ParisCluster + X1_Y1= 219.498702 -144.613086 -124.148602 + X1_Y128= 256.426556 19.913419 -135.478328 + X128_Y1= 99.997656 -125.919004 -242.178392 + X128_Y128= 136.92551 38.607501 -253.508118 + VIS= all +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/DetectorConfiguration/ParisPhShield.detector b/Projects/Paris/DetectorConfigurtation/ParisPhShield.detector similarity index 50% rename from Inputs/DetectorConfiguration/ParisPhShield.detector rename to Projects/Paris/DetectorConfigurtation/ParisPhShield.detector index 71a04c201abd9256b2fdd81a3f4251b38297ef03..329803461d1dc97e1c6312da7032ed0895772f4b 100644 --- a/Inputs/DetectorConfiguration/ParisPhShield.detector +++ b/Projects/Paris/DetectorConfigurtation/ParisPhShield.detector @@ -9,14 +9,14 @@ GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Target - THICKNESS= 10.3 - ANGLE= 0 - RADIUS= 12 - MATERIAL= CD2l - NBLAYERS= 50 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 10.3 + ANGLE= 0 + RADIUS= 12 + MATERIAL= CD2l + NBLAYERS= 50 + X= 0 + Y= 0 + Z= 0 %%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% %%Position and R given in mm %%Angle given in degree @@ -27,86 +27,86 @@ Target Shield %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9 ShieldClParis - X1_Y1= -364 153.75 151.375 - X1_Y128= -364 91.5 151.375 - X128_Y1= -364 153.75 -84.5 - X128_Y128= -364 91.5 -84.5 - VIS=all + X1_Y1= -364 153.75 151.375 + X1_Y128= -364 91.5 151.375 + X128_Y1= -364 153.75 -84.5 + X128_Y128= -364 91.5 -84.5 + VIS=all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ShieldClParis - X1_Y1= -364 -151.375 153.75 - X1_Y128= -364 -151.375 91.49999999 - X128_Y1= -364 84.49999999 153.75 - X128_Y128= -364 84.5 91.50000004 - VIS=all + X1_Y1= -364 -151.375 153.75 + X1_Y128= -364 -151.375 91.49999999 + X128_Y1= -364 84.49999999 153.75 + X128_Y128= -364 84.5 91.50000004 + VIS=all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ShieldClParis - X1_Y1= -364 -153.75 -151.375 - X1_Y128= -364 -91.49999999 -151.375 - X128_Y1= -364 -153.7500001 84.49999997 - X128_Y128= -364 -91.50000008 84.5 - VIS=all + X1_Y1= -364 -153.75 -151.375 + X1_Y128= -364 -91.49999999 -151.375 + X128_Y1= -364 -153.7500001 84.49999997 + X128_Y128= -364 -91.50000008 84.5 + VIS=all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ShieldClParis - X1_Y1= -364 151.375 -153.75 - X1_Y128= -364 151.375 -91.49999998 - X128_Y1= -364 -84.49999996 -153.7500001 - X128_Y128= -364 -84.5 -91.50000013 - VIS=all + X1_Y1= -364 151.375 -153.75 + X1_Y128= -364 151.375 -91.49999998 + X128_Y1= -364 -84.49999996 -153.7500001 + X128_Y128= -364 -84.5 -91.50000013 + VIS=all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 ShieldPhParis - THETA= 54.73 - PHI= 45.02 - R= 248 - BETA= 0 0 -30 - VIS= all + THETA= 54.73 + PHI= 45.02 + R= 248 + BETA= 0 0 -30 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 ShieldPhParis - THETA= 54.73 - PHI= 134.98 - R= 248 - BETA= 0 0 210 - VIS= all + THETA= 54.73 + PHI= 134.98 + R= 248 + BETA= 0 0 210 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 ShieldPhParis - THETA= 54.73 - PHI= 225 - R= 248 - BETA= 0 0 -30 - VIS= all + THETA= 54.73 + PHI= 225 + R= 248 + BETA= 0 0 -30 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 ShieldPhParis - THETA= 54.73 - PHI= 315 - R= 248 - BETA= 0 0 210 - VIS= all + THETA= 54.73 + PHI= 315 + R= 248 + BETA= 0 0 210 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 ShieldPhParis - THETA= 125.26 - PHI= 45.02 - R= 248 - BETA= 0 0 30 - VIS= all + THETA= 125.26 + PHI= 45.02 + R= 248 + BETA= 0 0 30 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 ShieldPhParis - THETA= 125.26 - PHI= 134.98 - R= 248 - BETA= 0 0 -210 - VIS= all + THETA= 125.26 + PHI= 134.98 + R= 248 + BETA= 0 0 -210 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%6 ShieldPhParis - THETA= 125.26 - PHI= 225 - R= 248 - BETA= 0 0 30 - VIS= all + THETA= 125.26 + PHI= 225 + R= 248 + BETA= 0 0 30 + VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 ShieldPhParis - THETA= 125.26 - PHI= 315 - R= 248 - BETA= 0 0 -210 - VIS= all + THETA= 125.26 + PHI= 315 + R= 248 + BETA= 0 0 -210 + VIS= all diff --git a/Projects/T40/Analysis.cxx b/Projects/T40/Analysis.cxx index 7f91cc22c668d2d91a6c4b148cddc3380700f7b6..adcc7df1d59d923c74657bb7c5004324ff7db6a2 100644 --- a/Projects/T40/Analysis.cxx +++ b/Projects/T40/Analysis.cxx @@ -39,8 +39,8 @@ Analysis::~Analysis(){ //////////////////////////////////////////////////////////////////////////////// void Analysis::Init(){ - TH = (TTiaraHyballPhysics*) m_DetectorManager -> GetDetector("TiaraHyballWedge"); - TB = (TTiaraBarrelPhysics*) m_DetectorManager -> GetDetector("TiaraInnerBarrel="); + TH = (TTiaraHyballPhysics*) m_DetectorManager -> GetDetector("HyballWedge"); + TB = (TTiaraBarrelPhysics*) m_DetectorManager -> GetDetector("Tiara"); TF = (TFPDTamuPhysics*) m_DetectorManager -> GetDetector("FPDTamu"); //TG = (TGeTAMUPhysics*) m_DetectorManager -> GetDetector("GeTAMU"); diff --git a/Projects/T40/T40.detector b/Projects/T40/T40.detector index 6a3d54d9a0dbb5447f3c38ab2bd8d02ad1a52520..f972ae20806661b7b80d4677c2893743e197055f 100644 --- a/Projects/T40/T40.detector +++ b/Projects/T40/T40.detector @@ -4,79 +4,78 @@ GeneralTarget %0.5mg/cm2 Target - THICKNESS= 0.001 - RADIUS= 5 - MATERIAL= CD2 - ANGLE= 0 - X= 0 - Y= 0 - Z= 0 + THICKNESS= 1 micrometer + RADIUS= 5 mm + MATERIAL= CD2 + ANGLE= 0 deg + X= 0 mm + Y= 0 mm + Z= 0 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Tiara -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - TiaraInnerBarrel= 1 - TiaraOuterBarrel= 1 - TiaraChamber= 1 - TiaraHyballWedge - Z= -147 - R= 0 - Phi= 0 - TiaraHyballWedge - Z= -147 - R= 0 - Phi= 60 - TiaraHyballWedge - Z= -147 - R= 0 - Phi= 120 - TiaraHyballWedge - Z= -147 - R= 0 - Phi= 180 - TiaraHyballWedge - Z= -147 - R= 0 - Phi= 240 - TiaraHyballWedge - Z= -147 - R= 0 - Phi= 300 +Tiara Barrel + InnerBarrel= 1 + OuterBarrel= 1 + Chamber= 1 +HyballWedge + Z= -147 mm + R= 0 mm + Phi= 0 deg +HyballWedge + Z= -147 mm + R= 0 mm + Phi= 60 deg +HyballWedge + Z= -147 mm + R= 0 mm + Phi= 120 deg +HyballWedge + Z= -147 mm + R= 0 mm + Phi= 180 deg +HyballWedge + Z= -147 mm + R= 0 mm + Phi= 240 deg +HyballWedge + Z= -147 mm + R= 0 mm + Phi= 300 deg -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -FPDTamu -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% FPD TAMU % All DELTA detectors - DELTA - UPSTREAM-LEFT= +150 +00 +20 - UPSTREAM-RIGHT= -150 +00 +20 +FPDTamu DELTA + UPSTREAM-LEFT= +150 00 20 mm + UPSTREAM-RIGHT= -150 00 20 mm +%%%%%%%%%%%%%%%%%%%%% % All MICRO detectors - MICRO - UPSTREAM-LEFT= +154 +00 +340 - UPSTREAM-RIGHT= -154 +00 +340 +FPDTamu MICRO + UPSTREAM-LEFT= +154 +00 +340 mm + UPSTREAM-RIGHT= -154 +00 +340 mm +%%%%%%%%%%%%%%%%%%%%% % All AWIRE detectors - AWIRE - LEFT= +200 +00 +20 - RIGHT= -200 +00 +20 - AWIRE - LEFT= +200 +00 +171 - RIGHT= -200 +00 +171 - AWIRE - LEFT= +200 +00 +334 - RIGHT= -200 +00 +334 - AWIRE - LEFT= +200 +00 +497 - RIGHT= -200 +00 +497 +FPDTamu AWIRE + LEFT= +200 +00 +20 mm + RIGHT= -200 +00 +20 mm +FPDTamu AWIRE + LEFT= +200 +00 +171 mm + RIGHT= -200 +00 +171 mm +FPDTamu AWIRE + LEFT= +200 +00 +334 mm + RIGHT= -200 +00 +334 mm +FPDTamu AWIRE + LEFT= +200 +00 +497 mm + RIGHT= -200 +00 +497 mm +%%%%%%%%%%%%%%%%%%%%% % All Plastic detectors - PLAST - UPSTREAM-LEFT= +198 +00 +547 - UPSTREAM-RIGHT= -198 +00 +547 - +FPDTamu PLAST + UPSTREAM-LEFT= +198 +00 +547 mm + UPSTREAM-RIGHT= -198 +00 +547 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % R Radius from target % Theta polar angle % Phi azimutal angle -%GeTAMU +% GeTAMU %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% GeTAMUClover CloverId= 1 @@ -97,4 +96,4 @@ GeTAMUClover CloverId= 4 R= 60 Theta= 90 - Phi= 315 \ No newline at end of file + Phi= 315 diff --git a/Projects/macros/GeometricalEfficiency.C b/Projects/macros/GeometricalEfficiency.C index 1c0e74e57c580bbcb2501fad84a193244dc587a6..0d1d225e9ad527ad1fe979241d556322518f0e19 100644 --- a/Projects/macros/GeometricalEfficiency.C +++ b/Projects/macros/GeometricalEfficiency.C @@ -48,7 +48,7 @@ using namespace std; -void GeometricalEfficiency(const char * fname = "e09042_alphasource_nucl"){ +void GeometricalEfficiency(const char * fname = "myResult.root"){ // Open output ROOT file from NPTool simulation run TString path = gSystem->Getenv("NPTOOL"); path += "/Outputs/Simulation/";