diff --git a/Inputs/DetectorConfiguration/e628.detector b/Inputs/DetectorConfiguration/e628.detector index dc070a5ddf1aab1420710c09942820bfb0efeb9a..aae591beed318b328c41d0dc47275026167b6d51 100644 --- a/Inputs/DetectorConfiguration/e628.detector +++ b/Inputs/DetectorConfiguration/e628.detector @@ -2,16 +2,16 @@ CATSArray %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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 -1193 + X28_Y1= 36.76 -34.96 -1193 + X1_Y28= -34.36 36.16 -1193 + X28_Y28= 36.76 36.16 -1193 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%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 + 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 %%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Inputs/EventGenerator/10He.reaction b/Inputs/EventGenerator/10He.reaction index 32a211b93585c567e758cf9e411131d9d839df76..4e92aed97465ef317d592bb1a0f0cdc7f5b6b400 100644 --- a/Inputs/EventGenerator/10He.reaction +++ b/Inputs/EventGenerator/10He.reaction @@ -36,8 +36,8 @@ TwoBodyReaction Light= 3He Heavy= 10He ExcitationEnergyLight= 0.0 - ExcitationEnergyHeavy= 3.0 - CrossSectionPath= flat.txt CS10He + ExcitationEnergyHeavy= 1.3 + CrossSectionPath= 11Li(d,3He)10He.txt CS10He ShootLight= 1 ShootHeavy= 1 diff --git a/NPAnalysis/MakePhysicalTree/Analysis.cxx b/NPAnalysis/MakePhysicalTree/Analysis.cxx index 47b3da4f69845162c5351752e4708d883811f796..12ee9b6fbf18f349f4fbd1855f5d80f2a0ff705f 100644 --- a/NPAnalysis/MakePhysicalTree/Analysis.cxx +++ b/NPAnalysis/MakePhysicalTree/Analysis.cxx @@ -33,7 +33,6 @@ int main(int argc, char** argv) // Get the formed Chained Tree and Treat it TChain* Chain = RootInput:: getInstance() -> GetChain(); - TExogamPhysics *Exo = (TExogamPhysics*) myDetector -> GetDetector("EXOGAM") ; // Get number of events to treat cout << endl << "///////// Starting Analysis ///////// "<< endl; @@ -66,19 +65,6 @@ int main(int argc, char** argv) Put your code here ************************************************/ - for(int i=0; i<4; i++) EGammaDC[i]=0; - for(int i=0; i<Exo->TotalEnergy_lab.size(); i++) - { - float mytheta=Exo->GetSegmentAnglePhi(Exo->CloverNumber[i], Exo->CristalNumber[i], Exo->SegmentNumber[i]); - float myphi=Exo->GetSegmentAngleTheta(Exo->CloverNumber[i], Exo->CristalNumber[i], Exo->SegmentNumber[i]); - //myv(Exo->TotalEnergy_lab[i]*sin(mytheta)*sin(myphi),Exo->TotalEnergy_lab[i]*sin(mytheta)*cos(myphi) , Exo->TotalEnergy_lab[i]*cos(mytheta),(Exo->TotalEnergy_lab)[i]); - //cout<<Exo->TotalEnergy_lab[i]<<endl; - EGammaDC[i]=Exo->TotalEnergy_lab[i]*(1-beta*cos(mytheta*TMath::DegToRad()))/sqrt(1-beta*beta); - //TVector3 boost= imp4.BoostVector(); - //myv.Boost(-boost); - //DopplerCorrectedEnergy.push_back(myv.T()); - //h_DopplerCorrectedEnergy->Fill(myv.T()); - } RootOutput::getInstance()->GetTree()->Fill(); } diff --git a/NPAnalysis/MakePhysicalTree/RunToTreat.txt b/NPAnalysis/MakePhysicalTree/RunToTreat.txt index 7d6ccc63fa563562506ec3a1b53d3b257d6ef83b..b620b3931e9eaa0be6a5d2f58d3dee0ff3e4c525 100644 --- a/NPAnalysis/MakePhysicalTree/RunToTreat.txt +++ b/NPAnalysis/MakePhysicalTree/RunToTreat.txt @@ -1,4 +1,13 @@ TTreeName AutoTree RootFileName - /data/e628X/e628/acquisition/run_root/run_1070.root +% /data/e628X/e628/acquisition/run_root/run_1352.1.root +% /data/e628X/e628/acquisition/run_root/run_1353.0.root + /data/e628X/e628/acquisition/run_root/run_1354.0.root +% /data/e628X/e628/acquisition/run_root/run_1354.1.root +% /data/e628X/e628/acquisition/run_root/run_1355.0.root +% /data/e628X/e628/acquisition/run_root/run_1356.0.root +% /data/e628X/e628/acquisition/run_root/run_1357.0.root +% /data/e628X/e628/acquisition/run_root/run_1357.1.root +% /data/e628X/e628/acquisition/run_root/run_1358.0.root +% /data/e628X/e628/acquisition/run_root/run_1358.1.root diff --git a/NPAnalysis/e628/Calibration.txt b/NPAnalysis/e628/Calibration.txt new file mode 100644 index 0000000000000000000000000000000000000000..2e0fa0b096758e253bf01c39b2aebaeb6cf0075e --- /dev/null +++ b/NPAnalysis/e628/Calibration.txt @@ -0,0 +1,40 @@ +CalibrationFilePath +/home/e628/nptool/NPAnalysis/Exogam/calibration_Exogam_Seg_27_02_2014.cal +/home/e628/nptool/NPAnalysis/Exogam/calibration_Exogam_ECC_05_03_2014.cal +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/CATS1_X.txt +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/CATS1_Y.txt +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/CATS2_X.txt +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/CATS2_Y.txt +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/Cal_Str_X_E_MM1.cal +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/Cal_Str_X_E_MM2.cal +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/Cal_Str_X_E_MM3.cal +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/Cal_Str_X_E_MM4.cal +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/Cal_Str_Y_E_MM1.cal +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/Cal_Str_Y_E_MM2.cal +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/Cal_Str_Y_E_MM3.cal +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/Cal_Str_Y_E_MM4.cal +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/BarrelCalib.txt +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/BarrelMatchsticks.txt +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/BarrelBallistic.txt +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/Charissa.txt +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/HyballCalib.txt +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/HyballMatchstick.txt +/home/e628/ganacq_manip/e628/GRU/GRUscripts/calib/Calibration_CsI_MUST2.txt + + +%/home/e628/nptool/NPAnalysis/must2/macro/Calibration/Energy/Calibration/calib_run1007/Test_X_T1_E/Cal_Str_X_E_MM1.cal +%/home/e628/nptool/NPAnalysis/must2/macro/Calibration/Energy/Calibration/calib_run1007/Test_X_T2_E/Cal_Str_X_E_MM2.cal +%/home/e628/nptool/NPAnalysis/must2/macro/Calibration/Energy/Calibration/calib_run1007/Test_X_T3_E/Cal_Str_X_E_MM3.cal +%/home/e628/nptool/NPAnalysis/must2/macro/Calibration/Energy/Calibration/calib_run1007/Test_X_T4_E/Cal_Str_X_E_MM4.cal +%/home/e628/nptool/NPAnalysis/must2/macro/Calibration/Energy/Calibration/calib_run1007/Test_Y_T1_E/Cal_Str_Y_E_MM1.cal +%/home/e628/nptool/NPAnalysis/must2/macro/Calibration/Energy/Calibration/calib_run1007/Test_Y_T2_E/Cal_Str_Y_E_MM2.cal +%/home/e628/nptool/NPAnalysis/must2/macro/Calibration/Energy/Calibration/calib_run1007/Test_Y_T3_E/Cal_Str_Y_E_MM3.cal +%/home/e628/nptool/NPAnalysis/must2/macro/Calibration/Energy/Calibration/calib_run1007/Test_Y_T4_E/Cal_Str_Y_E_MM4.cal +%/home/e628/nptool/NPAnalysis/must2/macro/Calibration/Time/Coeff/Cal_Str_X_T_MM1.cal +%/home/e628/nptool/NPAnalysis/must2/macro/Calibration/Time/Coeff/Cal_Str_X_T_MM2.cal +%/home/e628/nptool/NPAnalysis/must2/macro/Calibration/Time/Coeff/Cal_Str_X_T_MM3.cal +%/home/e628/nptool/NPAnalysis/must2/macro/Calibration/Time/Coeff/Cal_Str_X_T_MM4.cal +%/home/e628/nptool/NPAnalysis/must2/macro/Calibration/Time/Coeff/Cal_Str_Y_T_MM1.cal +%/home/e628/nptool/NPAnalysis/must2/macro/Calibration/Time/Coeff/Cal_Str_Y_T_MM2.cal +%/home/e628/nptool/NPAnalysis/must2/macro/Calibration/Time/Coeff/Cal_Str_Y_T_MM3.cal +%/home/e628/nptool/NPAnalysis/must2/macro/Calibration/Time/Coeff/Cal_Str_Y_T_MM4.cal diff --git a/NPAnalysis/e628/Makefile b/NPAnalysis/e628/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..bdfccb1e4ff94a2d3dfe6398de9f70c90b206d31 --- /dev/null +++ b/NPAnalysis/e628/Makefile @@ -0,0 +1,30 @@ +# include same architecture file than for NPLib +# so that consistency is ensured +include $(NPTOOL)/NPLib/Makefile.arch + +# additional libraries +LIBRARY = `$(NPTOOL)/NPLib/liblist` + +PROGRAMS = Analysis + +all: $(PROGRAMS) + +Analysis: Analysis.o + $(LD) $(LDFLAGS) $^ $(LIBS) $(LIBRARY) $(OutPutOpt) $@ + @echo "$@ done" + + +# rule for creating .o from .cxx +.SUFFIXES: .$(SrcSuf) +.$(SrcSuf).$(ObjSuf): + $(CXX) $(CXXFLAGS) $(INCLUDE) -c $< + +# some cleaning +clean: + rm -rf *.o + +distclean: + make clean; rm $(PROGRAMS) + +# dependences +Analysis.o: Analysis.cxx Analysis.h diff --git a/NPAnalysis/e628/RunToTreat.txt b/NPAnalysis/e628/RunToTreat.txt new file mode 100644 index 0000000000000000000000000000000000000000..b7b97b5c094a9f14c085e17dbf2c69efda2d9753 --- /dev/null +++ b/NPAnalysis/e628/RunToTreat.txt @@ -0,0 +1,10 @@ +TTreeName + AutoTree +RootFileName + /data/e628X/e628/acquisition/run_root/run_1377.0.root + /data/e628X/e628/acquisition/run_root/run_1377.1.root +% /data/e628X/e628/acquisition/run_root/run_1336.2.root + + + + diff --git a/NPAnalysis/e628/RunToTreat_anna.txt b/NPAnalysis/e628/RunToTreat_anna.txt new file mode 100644 index 0000000000000000000000000000000000000000..c49be2afc09a4928587c8ebe66225367e9f37d3f --- /dev/null +++ b/NPAnalysis/e628/RunToTreat_anna.txt @@ -0,0 +1,4 @@ +TTreeName + AutoTree +RootFileName +% /data/e628X/e628/acquisition/run_root/run_1255.root diff --git a/NPAnalysis/e628/RunToTreat_ben.txt b/NPAnalysis/e628/RunToTreat_ben.txt new file mode 100644 index 0000000000000000000000000000000000000000..7629856a47bf9ebfa2fc32e9ef6130d476f5b476 --- /dev/null +++ b/NPAnalysis/e628/RunToTreat_ben.txt @@ -0,0 +1,4 @@ +TTreeName + AutoTree +RootFileName +% /data/e628X/e628/acquisition/run_root/run_1005.root diff --git a/NPAnalysis/e628/configs/ConfigMust2.dat b/NPAnalysis/e628/configs/ConfigMust2.dat new file mode 100644 index 0000000000000000000000000000000000000000..52b223f917c5129f6a46b2349cc96cfcd8df4b5b --- /dev/null +++ b/NPAnalysis/e628/configs/ConfigMust2.dat @@ -0,0 +1,5 @@ +ConfigMust2 + MAX_STRIP_MULTIPLICITY 1 + + + diff --git a/NPAnalysis/e628/configs/ConfigMust2.dat~ b/NPAnalysis/e628/configs/ConfigMust2.dat~ new file mode 100644 index 0000000000000000000000000000000000000000..3d0c81d7d0bd94c1233226f34e694552f95a488c --- /dev/null +++ b/NPAnalysis/e628/configs/ConfigMust2.dat~ @@ -0,0 +1,8 @@ +ConfigMust2 + MAX_STRIP_MULTIPLICITY 1 + SI_X_E_RAW_THRESHOLD 0 + SILI_E_RAW_THRESHOLD 0 + SILI_E_THRESHOLD 0 + DISABLE_CHANNEL MM4STRX3 + DISABLE_ALL MM1 + diff --git a/NPAnalysis/e628/configs/angles_exogam_clover0_01_03_2014.txt b/NPAnalysis/e628/configs/angles_exogam_clover0_01_03_2014.txt new file mode 100755 index 0000000000000000000000000000000000000000..ad7ec746ce382d11a9ff91263a32261bf4040e7d --- /dev/null +++ b/NPAnalysis/e628/configs/angles_exogam_clover0_01_03_2014.txt @@ -0,0 +1,16 @@ +exogam_seg_00A0_theta 117.844969 exogam_seg_00A0_phi -76.886864 +exogam_seg_00A1_theta 99.581160 exogam_seg_00A1_phi -76.886864 +exogam_seg_00A2_theta 101.033306 exogam_seg_00A2_phi -56.243774 +exogam_seg_00A3_theta 121.390958 exogam_seg_00A3_phi -56.243774 +exogam_seg_00B0_theta 62.155036 exogam_seg_00B0_phi -76.886864 +exogam_seg_00B1_theta 58.609034 exogam_seg_00B1_phi -56.243774 +exogam_seg_00B2_theta 78.966693 exogam_seg_00B2_phi -56.243774 +exogam_seg_00B3_theta 80.418845 exogam_seg_00B3_phi -76.886864 +exogam_seg_00C0_theta 62.155036 exogam_seg_00C0_phi -13.113146 +exogam_seg_00C1_theta 80.418845 exogam_seg_00C1_phi -13.113146 +exogam_seg_00C2_theta 78.966693 exogam_seg_00C2_phi -33.756226 +exogam_seg_00C3_theta 58.609034 exogam_seg_00C3_phi -33.756226 +exogam_seg_00D0_theta 117.844969 exogam_seg_00D0_phi -13.113146 +exogam_seg_00D1_theta 121.390958 exogam_seg_00D1_phi -33.756226 +exogam_seg_00D2_theta 101.033306 exogam_seg_00D2_phi -33.756226 +exogam_seg_00D3_theta 99.581160 exogam_seg_00D3_phi -13.113146 diff --git a/NPAnalysis/e628/configs/angles_exogam_clover1_01_03_2014.txt b/NPAnalysis/e628/configs/angles_exogam_clover1_01_03_2014.txt new file mode 100755 index 0000000000000000000000000000000000000000..bc822991a99efe59a39fa93dfa37f01aee8da52f --- /dev/null +++ b/NPAnalysis/e628/configs/angles_exogam_clover1_01_03_2014.txt @@ -0,0 +1,16 @@ +exogam_seg_01A0_theta 62.155036 exogam_seg_01A0_phi 256.886871 +exogam_seg_01A1_theta 80.418845 exogam_seg_01A1_phi 256.886871 +exogam_seg_01A2_theta 78.966693 exogam_seg_01A2_phi 236.243774 +exogam_seg_01A3_theta 58.609034 exogam_seg_01A3_phi 236.243774 +exogam_seg_01B0_theta 117.844969 exogam_seg_01B0_phi 256.886871 +exogam_seg_01B1_theta 121.390958 exogam_seg_01B1_phi 236.243774 +exogam_seg_01B2_theta 101.033306 exogam_seg_01B2_phi 236.243774 +exogam_seg_01B3_theta 99.581160 exogam_seg_01B3_phi 256.886871 +exogam_seg_01C0_theta 117.844969 exogam_seg_01C0_phi 193.113144 +exogam_seg_01C1_theta 99.581160 exogam_seg_01C1_phi 193.113144 +exogam_seg_01C2_theta 101.033306 exogam_seg_01C2_phi 213.756226 +exogam_seg_01C3_theta 121.390958 exogam_seg_01C3_phi 213.756226 +exogam_seg_01D0_theta 62.155036 exogam_seg_01D0_phi 193.113144 +exogam_seg_01D1_theta 58.609034 exogam_seg_01D1_phi 213.756226 +exogam_seg_01D2_theta 78.966693 exogam_seg_01D2_phi 213.756226 +exogam_seg_01D3_theta 80.418845 exogam_seg_01D3_phi 193.113144 diff --git a/NPAnalysis/e628/configs/angles_exogam_clover2_01_03_2014.txt b/NPAnalysis/e628/configs/angles_exogam_clover2_01_03_2014.txt new file mode 100755 index 0000000000000000000000000000000000000000..36b3bf632853403c42e35173a5dbfb04c43bb88c --- /dev/null +++ b/NPAnalysis/e628/configs/angles_exogam_clover2_01_03_2014.txt @@ -0,0 +1,17 @@ +exogam_seg_02A0_theta 117.844969 exogam_seg_02A0_phi 13.113141 +exogam_seg_02A1_theta 99.581160 exogam_seg_02A1_phi 13.113141 +exogam_seg_02A2_theta 101.033306 exogam_seg_02A2_phi 33.756229 +exogam_seg_02A3_theta 121.390958 exogam_seg_02A3_phi 33.756229 +exogam_seg_02B0_theta 62.155036 exogam_seg_02B0_phi 13.113141 +exogam_seg_02B1_theta 58.609034 exogam_seg_02B1_phi 33.756229 +exogam_seg_02B2_theta 78.966693 exogam_seg_02B2_phi 33.756229 +exogam_seg_02B3_theta 80.418845 exogam_seg_02B3_phi 13.113141 +exogam_seg_02C0_theta 62.155036 exogam_seg_02C0_phi 76.886856 +exogam_seg_02C1_theta 80.418845 exogam_seg_02C1_phi 76.886856 +exogam_seg_02C2_theta 78.966693 exogam_seg_02C2_phi 56.243771 +exogam_seg_02C3_theta 58.609034 exogam_seg_02C3_phi 56.243771 +exogam_seg_02D0_theta 117.844969 exogam_seg_02D0_phi 76.886856 +exogam_seg_02D1_theta 121.390958 exogam_seg_02D1_phi 56.243771 +exogam_seg_02D2_theta 101.033306 exogam_seg_02D2_phi 56.243771 +exogam_seg_02D3_theta 99.581160 exogam_seg_02D3_phi 76.886856 + diff --git a/NPAnalysis/e628/configs/angles_exogam_clover3_01_03_2014.txt b/NPAnalysis/e628/configs/angles_exogam_clover3_01_03_2014.txt new file mode 100755 index 0000000000000000000000000000000000000000..1d0dd1d7e27dc5d40a24da16cbe5076bb99c3707 --- /dev/null +++ b/NPAnalysis/e628/configs/angles_exogam_clover3_01_03_2014.txt @@ -0,0 +1,17 @@ +exogam_seg_03A0_theta 62.155036 exogam_seg_03A0_phi 166.886856 +exogam_seg_03A1_theta 80.418845 exogam_seg_03A1_phi 166.886856 +exogam_seg_03A2_theta 78.966693 exogam_seg_03A2_phi 146.243774 +exogam_seg_03A3_theta 58.609034 exogam_seg_03A3_phi 146.243774 +exogam_seg_03B0_theta 117.844969 exogam_seg_03B0_phi 166.886856 +exogam_seg_03B1_theta 121.390958 exogam_seg_03B1_phi 146.243774 +exogam_seg_03B2_theta 101.033306 exogam_seg_03B2_phi 146.243774 +exogam_seg_03B3_theta 99.581160 exogam_seg_03B3_phi 166.886856 +exogam_seg_03C0_theta 117.844969 exogam_seg_03C0_phi 103.113144 +exogam_seg_03C1_theta 99.581160 exogam_seg_03C1_phi 103.113144 +exogam_seg_03C2_theta 101.033306 exogam_seg_03C2_phi 123.756226 +exogam_seg_03C3_theta 121.390958 exogam_seg_03C3_phi 123.756226 +exogam_seg_03D0_theta 62.155036 exogam_seg_03D0_phi 103.113144 +exogam_seg_03D1_theta 58.609034 exogam_seg_03D1_phi 123.756226 +exogam_seg_03D2_theta 78.966693 exogam_seg_03D2_phi 123.756226 +exogam_seg_03D3_theta 80.418845 exogam_seg_03D3_phi 103.113144 + diff --git a/NPAnalysis/e628/configs/beta.txt b/NPAnalysis/e628/configs/beta.txt new file mode 100644 index 0000000000000000000000000000000000000000..2de4f59097343317909308e82ecc6f54fa3a20d0 --- /dev/null +++ b/NPAnalysis/e628/configs/beta.txt @@ -0,0 +1 @@ +0.18384 diff --git a/NPAnalysis/e628/configs/beta.txt.~1~ b/NPAnalysis/e628/configs/beta.txt.~1~ new file mode 100644 index 0000000000000000000000000000000000000000..f3b84867e0ee9f5514e434e6bbf76e08fd5a660a --- /dev/null +++ b/NPAnalysis/e628/configs/beta.txt.~1~ @@ -0,0 +1 @@ +0.18441 diff --git a/NPAnalysis/e628/configs/beta.txt.~2~ b/NPAnalysis/e628/configs/beta.txt.~2~ new file mode 100644 index 0000000000000000000000000000000000000000..ba66466c2a0d0a1080ad71d8e1a67a97f336c384 --- /dev/null +++ b/NPAnalysis/e628/configs/beta.txt.~2~ @@ -0,0 +1 @@ +0.0 diff --git a/NPAnalysis/e628/e628.detector b/NPAnalysis/e628/e628.detector new file mode 100644 index 0000000000000000000000000000000000000000..7a947800bb2937b8f10d5f6535535d8bf2f0ee78 --- /dev/null +++ b/NPAnalysis/e628/e628.detector @@ -0,0 +1,115 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +CATSArray +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +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 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%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 +%%%%%%% 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 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +EXOGAMArray +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +EXOGAMClover + ANGLES_FILE= angles_exogam_clover0_01_03_2014.txt +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +EXOGAMClover + ANGLES_FILE= angles_exogam_clover1_01_03_2014.txt +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +EXOGAMClover + ANGLES_FILE= angles_exogam_clover2_01_03_2014.txt +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +EXOGAMClover + ANGLES_FILE= angles_exogam_clover3_01_03_2014.txt +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 + +%%%%%%%%%%%%%%%%%%%%%%%%%%% +TiaraHyball +TiaraHyballWedge + Z= -154.3 + R= 0 + Phi= 0 +TiaraHyballWedge + Z= -154.3 + R= 0 + Phi= 60 +TiaraHyballWedge + Z= -154.3 + R= 0 + Phi= 120 +TiaraHyballWedge + Z= -154.3 + R= 0 + Phi= 180 +TiaraHyballWedge + Z= -154.3 + R= 0 + Phi= 240 +TiaraHyballWedge + Z= -154.3 + R= 0 + Phi= 300 +%%%%%%%%%%%%%%%%%%%%%%%%%%% +TiaraBarrel + X= 0 + Y= 0 + Z= 0 + OuterBarrel= 1 + InnerBarrel= 1 +%%%%%%%%%%%%%%%%%%%%%%%%%%% +CharissaArray +CharissaTelescope +X1_Y1= 10 -10 350 +X1_Y16= -10 -10 350 +X16_Y1= -10 10 350 +X16_Y16= 10 10 350 diff --git a/NPAnalysis/e628/e628.detector.original b/NPAnalysis/e628/e628.detector.original new file mode 100644 index 0000000000000000000000000000000000000000..282d71bb636321c487f239f35d065d4299d050d8 --- /dev/null +++ b/NPAnalysis/e628/e628.detector.original @@ -0,0 +1,88 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%% +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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +EXOGAMArray +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 +EXOGAMClover + ANGLES_FILE= angles_exogam_clover0.txt.anna +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 +EXOGAMClover + ANGLES_FILE= angles_exogam_clover1.txt.anna +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 +EXOGAMClover + ANGLES_FILE= angles_exogam_clover2.txt.anna +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%4 +EXOGAMClover + ANGLES_FILE= angles_exogam_clover3.txt.anna +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%0 + +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%TiaraHyball +%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 diff --git a/NPAnalysis/e628/out b/NPAnalysis/e628/out new file mode 100644 index 0000000000000000000000000000000000000000..9ca07b38f580d33a67b0aac842f8205d6fcd4401 --- /dev/null +++ b/NPAnalysis/e628/out @@ -0,0 +1,27492 @@ + +/////////// ROOT Input files /////////// +Initializing input TChain +Adding file /data/e628X/e628/acquisition/run_root/run_1005.root to TChain +ROOTInput: 1104370 entries loaded in the input chain +Problem opening file defaultReaction.reaction + +/////////// Calibration Information /////////// +Getting list of Calibration File +Calibration Path file :defaultCalibration.txt not found + +/////////// Detector geometry /////////// +Configuration file e628.detector loading +//////// MUST2 Array //////// + +/// +Telescope found: +X1 Y1 corner position : (10.85;105.03;146.16) +X1 Y128 corner position : (22.8;9.84;175.95) +X128 Y1 corner position : (104.09;105.03;108.76) +X128 Y128 corner position : (116.04;9.84;138.55) +/// +Telescope found: +X1 Y1 corner position : (-116.04;9.84;138.55) +X1 Y128 corner position : (-22.8;9.84;175.95) +X128 Y1 corner position : (-104.09;105.03;108.76) +X128 Y128 corner position : (-10.85;105.03;146.16) +/// +Telescope found: +X1 Y1 corner position : (-10.85;-105.03;146.16) +X1 Y128 corner position : (-22.8;-9.84;175.95) +X128 Y1 corner position : (-104.09;-105.03;108.76) +X128 Y128 corner position : (-116.04;-9.84;138.55) +/// +Telescope found: +X1 Y1 corner position : (116.04;-9.84;138.55) +X1 Y128 corner position : (22.8;-9.84;175.95) +X128 Y1 corner position : (104.09;-105.03;108.76) +X128 Y128 corner position : (10.85;-105.03;146.16) + Loading user parameters for Analysis from ConfigMust2.dat +MAXIMUN STRIP MULTIPLICITY 1 + +///////////////////////////// + +//////// Exogam //////// + +/// +EXOGAM Detector found: +File angle used : angles_exogam_clover0.txt +posz42_exp_stat_demiring/angles_exogam_clover0.txt +Clover 0: Theta=88.46 Phi=-160.381 +Clover 0: Theta=71.82 Phi=-160.381 +Clover 0: Theta=71 Phi=-143.652 +Clover 0: Theta=85.44 Phi=-143.652 +Clover 0: Theta=44.91 Phi=-160.381 +Clover 0: Theta=49.29 Phi=-143.652 +Clover 0: Theta=53.72 Phi=-143.652 +Clover 0: Theta=61.76 Phi=-160.381 +Clover 0: Theta=44.91 Phi=-109.619 +Clover 0: Theta=61.76 Phi=-109.619 +Clover 0: Theta=53.72 Phi=-126.348 +Clover 0: Theta=49.29 Phi=-126.348 +Clover 0: Theta=88.46 Phi=-109.619 +Clover 0: Theta=85.44 Phi=-126.348 +Clover 0: Theta=71 Phi=-126.348 +Clover 0: Theta=71.82 Phi=-109.619 +/// +EXOGAM Detector found: +File angle used : angles_exogam_clover1.txt +posz42_exp_stat_demiring/angles_exogam_clover1.txt +Clover 1: Theta=88.46 Phi=-160.381 +Clover 1: Theta=71.82 Phi=-160.381 +Clover 1: Theta=71 Phi=-143.652 +Clover 1: Theta=85.44 Phi=-143.652 +Clover 1: Theta=44.91 Phi=-160.381 +Clover 1: Theta=49.29 Phi=-143.652 +Clover 1: Theta=53.72 Phi=-143.652 +Clover 1: Theta=61.76 Phi=-160.381 +Clover 1: Theta=44.91 Phi=-109.619 +Clover 1: Theta=61.76 Phi=-109.619 +Clover 1: Theta=53.72 Phi=-126.348 +Clover 1: Theta=49.29 Phi=-126.348 +Clover 1: Theta=88.46 Phi=-109.619 +Clover 1: Theta=85.44 Phi=-126.348 +Clover 1: Theta=71 Phi=-126.348 +Clover 1: Theta=71.82 Phi=-109.619 +/// +EXOGAM Detector found: +File angle used : angles_exogam_clover2.txt +posz42_exp_stat_demiring/angles_exogam_clover2.txt +Clover 2: Theta=44.91 Phi=-199.619 +Clover 2: Theta=61.76 Phi=-199.619 +Clover 2: Theta=53.72 Phi=-216.348 +Clover 2: Theta=49.29 Phi=-216.348 +Clover 2: Theta=88.41 Phi=-199.619 +Clover 2: Theta=85.44 Phi=-216.348 +Clover 2: Theta=71 Phi=-216.348 +Clover 2: Theta=71.82 Phi=-199.619 +Clover 2: Theta=88.41 Phi=-250.381 +Clover 2: Theta=71.82 Phi=-250.381 +Clover 2: Theta=71 Phi=-233.652 +Clover 2: Theta=85.44 Phi=-233.652 +Clover 2: Theta=44.91 Phi=-250.381 +Clover 2: Theta=49.29 Phi=-233.652 +Clover 2: Theta=53.72 Phi=-233.652 +Clover 2: Theta=61.76 Phi=-250.381 +/// +EXOGAM Detector found: +File angle used : angles_exogam_clover3.txt +posz42_exp_stat_demiring/angles_exogam_clover3.txt +Clover 3: Theta=44.91 Phi=-199.619 +Clover 3: Theta=61.76 Phi=-199.619 +Clover 3: Theta=53.72 Phi=-216.348 +Clover 3: Theta=49.29 Phi=-216.348 +Clover 3: Theta=88.41 Phi=-199.619 +Clover 3: Theta=85.44 Phi=-216.348 +Clover 3: Theta=71 Phi=-216.348 +Clover 3: Theta=71.82 Phi=-199.619 +Clover 3: Theta=88.41 Phi=-250.381 +Clover 3: Theta=71.82 Phi=-250.381 +Clover 3: Theta=71 Phi=-233.652 +Clover 3: Theta=85.44 Phi=-233.652 +Clover 3: Theta=44.91 Phi=-250.381 +Clover 3: Theta=49.29 Phi=-233.652 +Clover 3: Theta=53.72 Phi=-233.652 +Clover 3: Theta=61.76 Phi=-250.381 + +///////// Starting Analysis ///////// + Number of Event to be treated : 1104370 +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low + Progression:0.90549 % | Remaining time : ~0scalib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low + Progression:1.811 % | Remaining time : ~54.218scalib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low + Progression:2.7165 % | Remaining time : ~35.812scalib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low + Progression:3.622 % | Remaining time : ~53.218scalib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib high +calib high +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low + Progression:4.5275 % | Remaining time : ~42.175scalib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib high +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib high +calib low +calib low +calib high +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib high +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib high +calib high +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib high +calib low +calib low +calib low +calib low +calib low +calib low +calib low +calib low diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover0.txt b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover0.txt new file mode 100755 index 0000000000000000000000000000000000000000..8dc82ed3286319ebfe77a22e488e7f77f077fcea --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover0.txt @@ -0,0 +1,16 @@ +exogam_seg_00A0_theta 105.681400 exogam_seg_00A0_phi -61.304195 +exogam_seg_00A1_theta 95.126223 exogam_seg_00A1_phi -61.304195 +exogam_seg_00A2_theta 95.316752 exogam_seg_00A2_phi -50.339787 +exogam_seg_00A3_theta 106.237179 exogam_seg_00A3_phi -50.339787 +exogam_seg_00B0_theta 74.318605 exogam_seg_00B0_phi -61.304195 +exogam_seg_00B1_theta 73.762819 exogam_seg_00B1_phi -50.339787 +exogam_seg_00B2_theta 84.683247 exogam_seg_00B2_phi -50.339787 +exogam_seg_00B3_theta 84.873782 exogam_seg_00B3_phi -61.304195 +exogam_seg_00C0_theta 74.318605 exogam_seg_00C0_phi -28.695807 +exogam_seg_00C1_theta 84.873782 exogam_seg_00C1_phi -28.695807 +exogam_seg_00C2_theta 84.683247 exogam_seg_00C2_phi -39.660213 +exogam_seg_00C3_theta 73.762819 exogam_seg_00C3_phi -39.660213 +exogam_seg_00D0_theta 105.681400 exogam_seg_00D0_phi -28.695807 +exogam_seg_00D1_theta 106.237179 exogam_seg_00D1_phi -39.660213 +exogam_seg_00D2_theta 95.316752 exogam_seg_00D2_phi -39.660213 +exogam_seg_00D3_theta 95.126223 exogam_seg_00D3_phi -28.695807 diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover0.txt.anna b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover0.txt.anna new file mode 100644 index 0000000000000000000000000000000000000000..515692bcb40bd2d046483e3737fcbfd70652b3ba --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover0.txt.anna @@ -0,0 +1,16 @@ +exogam_seg_01A0_theta 116.791221 exogam_seg_01A0_phi -75.327637 +exogam_seg_01A1_theta 99.165891 exogam_seg_01A1_phi -75.327637 +exogam_seg_01A2_theta 100.412086 exogam_seg_01A2_phi -55.588406 +exogam_seg_01A3_theta 119.900583 exogam_seg_01A3_phi -55.588406 +exogam_seg_01B0_theta 63.208784 exogam_seg_01B0_phi -75.327637 +exogam_seg_01B1_theta 60.099422 exogam_seg_01B1_phi -55.588406 +exogam_seg_01B2_theta 79.587912 exogam_seg_01B2_phi -55.588406 +exogam_seg_01B3_theta 80.834107 exogam_seg_01B3_phi -75.327637 +exogam_seg_01C0_theta 63.208784 exogam_seg_01C0_phi -14.672362 +exogam_seg_01C1_theta 80.834107 exogam_seg_01C1_phi -14.672362 +exogam_seg_01C2_theta 79.587912 exogam_seg_01C2_phi -34.411594 +exogam_seg_01C3_theta 60.099422 exogam_seg_01C3_phi -34.411594 +exogam_seg_01D0_theta 116.791221 exogam_seg_01D0_phi -14.672362 +exogam_seg_01D1_theta 119.900583 exogam_seg_01D1_phi -34.411594 +exogam_seg_01D2_theta 100.412086 exogam_seg_01D2_phi -34.411594 +exogam_seg_01D3_theta 99.165891 exogam_seg_01D3_phi -14.672362 diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover0.txt.original b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover0.txt.original new file mode 100755 index 0000000000000000000000000000000000000000..730d9ca336dc3f7906f0ac8ebfbb6fa2d12f9c9e --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover0.txt.original @@ -0,0 +1,16 @@ +exogam_seg_01A0_theta 63.208784 exogam_seg_01A0_phi -14.672362 +exogam_seg_01A1_theta 60.099422 exogam_seg_01A1_phi -14.672362 +exogam_seg_01A2_theta 79.587912 exogam_seg_01A2_phi -34.411594 +exogam_seg_01A3_theta 80.834107 exogam_seg_01A3_phi -34.411594 +exogam_seg_01B0_theta 63.208784 exogam_seg_01B0_phi -14.672362 +exogam_seg_01B1_theta 80.834107 exogam_seg_01B1_phi -14.672362 +exogam_seg_01B2_theta 79.587912 exogam_seg_01B2_phi -34.411594 +exogam_seg_01B3_theta 60.099422 exogam_seg_01B3_phi -34.411594 +exogam_seg_01C0_theta 116.791221 exogam_seg_01C0_phi -14.672362 +exogam_seg_01C1_theta 119.900583 exogam_seg_01C1_phi -34.411594 +exogam_seg_01C2_theta 100.412086 exogam_seg_01C2_phi -34.411594 +exogam_seg_01C3_theta 99.165891 exogam_seg_01C3_phi -14.672362 +exogam_seg_01D0_theta 107.123389 exogam_seg_01D0_phi -17.943989 +exogam_seg_01D1_theta 95.622573 exogam_seg_01D1_phi -17.943989 +exogam_seg_01D2_theta 95.876902 exogam_seg_01D2_phi -5.908062 +exogam_seg_01D3_theta 107.854745 exogam_seg_01D3_phi -5.908062 diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover0.txt.~1~ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover0.txt.~1~ new file mode 100755 index 0000000000000000000000000000000000000000..7f92f55dcf6bb961509b2787b123e69fcecab5ef --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover0.txt.~1~ @@ -0,0 +1,16 @@ +exogam_seg_01A0_theta 88.46 exogam_seg_01A0_phi -160.381 +exogam_seg_01A1_theta 71.82 exogam_seg_01A1_phi -160.381 +exogam_seg_01A2_theta 71.00 exogam_seg_01A2_phi -143.652 +exogam_seg_01A3_theta 85.44 exogam_seg_01A3_phi -143.652 +exogam_seg_01B0_theta 44.91 exogam_seg_01B0_phi -160.381 +exogam_seg_01B1_theta 49.29 exogam_seg_01B1_phi -143.652 +exogam_seg_01B2_theta 53.72 exogam_seg_01B2_phi -143.652 +exogam_seg_01B3_theta 61.76 exogam_seg_01B3_phi -160.381 +exogam_seg_01C0_theta 44.91 exogam_seg_01C0_phi -109.619 +exogam_seg_01C1_theta 61.76 exogam_seg_01C1_phi -109.619 +exogam_seg_01C2_theta 53.72 exogam_seg_01C2_phi -126.348 +exogam_seg_01C3_theta 49.29 exogam_seg_01C3_phi -126.348 +exogam_seg_01D0_theta 88.46 exogam_seg_01D0_phi -109.619 +exogam_seg_01D1_theta 85.44 exogam_seg_01D1_phi -126.348 +exogam_seg_01D2_theta 71.00 exogam_seg_01D2_phi -126.348 +exogam_seg_01D3_theta 71.82 exogam_seg_01D3_phi -109.619 diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover1.txt b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover1.txt new file mode 100755 index 0000000000000000000000000000000000000000..e35000e01b8a0cf121ddd57181f89821af94d2fb --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover1.txt @@ -0,0 +1,16 @@ +exogam_seg_01A0_theta 74.318605 exogam_seg_01A0_phi 241.304199 +exogam_seg_01A1_theta 84.873782 exogam_seg_01A1_phi 241.304199 +exogam_seg_01A2_theta 84.683247 exogam_seg_01A2_phi 230.339783 +exogam_seg_01A3_theta 73.762819 exogam_seg_01A3_phi 230.339783 +exogam_seg_01B0_theta 105.681400 exogam_seg_01B0_phi 241.304199 +exogam_seg_01B1_theta 106.237179 exogam_seg_01B1_phi 230.339783 +exogam_seg_01B2_theta 95.316752 exogam_seg_01B2_phi 230.339783 +exogam_seg_01B3_theta 95.126223 exogam_seg_01B3_phi 241.304199 +exogam_seg_01C0_theta 105.681400 exogam_seg_01C0_phi 208.695801 +exogam_seg_01C1_theta 95.126223 exogam_seg_01C1_phi 208.695801 +exogam_seg_01C2_theta 95.316752 exogam_seg_01C2_phi 219.660217 +exogam_seg_01C3_theta 106.237179 exogam_seg_01C3_phi 219.660217 +exogam_seg_01D0_theta 74.318605 exogam_seg_01D0_phi 208.695801 +exogam_seg_01D1_theta 73.762819 exogam_seg_01D1_phi 219.660217 +exogam_seg_01D2_theta 84.683247 exogam_seg_01D2_phi 219.660217 +exogam_seg_01D3_theta 84.873782 exogam_seg_01D3_phi 208.695801 diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover1.txt.anna b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover1.txt.anna new file mode 100644 index 0000000000000000000000000000000000000000..71d5dce58fc11c2444724de70a4a4e6ac4ae41f2 --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover1.txt.anna @@ -0,0 +1,16 @@ +exogam_seg_01A0_theta 63.208784 exogam_seg_01A0_phi 255.327637 +exogam_seg_01A1_theta 80.834107 exogam_seg_01A1_phi 255.327637 +exogam_seg_01A2_theta 79.587912 exogam_seg_01A2_phi 235.588409 +exogam_seg_01A3_theta 60.099422 exogam_seg_01A3_phi 235.588409 +exogam_seg_01B0_theta 116.791221 exogam_seg_01B0_phi 255.327637 +exogam_seg_01B1_theta 119.900583 exogam_seg_01B1_phi 235.588409 +exogam_seg_01B2_theta 100.412086 exogam_seg_01B2_phi 235.588409 +exogam_seg_01B3_theta 116.791221 exogam_seg_01B3_phi 255.327637 +exogam_seg_01C0_theta 99.165891 exogam_seg_01C0_phi 194.672363 +exogam_seg_01C1_theta 100.412086 exogam_seg_01C1_phi 194.672363 +exogam_seg_01C2_theta 119.900583 exogam_seg_01C2_phi 214.411591 +exogam_seg_01C3_theta 80.834107 exogam_seg_01C3_phi 214.411591 +exogam_seg_01D0_theta 63.208784 exogam_seg_01D0_phi 194.672363 +exogam_seg_01D1_theta 60.099422 exogam_seg_01D1_phi 214.411591 +exogam_seg_01D2_theta 79.587912 exogam_seg_01D2_phi 214.411591 +exogam_seg_01D3_theta 80.834107 exogam_seg_01D3_phi 194.672363 diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover1.txt.anna.~1~ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover1.txt.anna.~1~ new file mode 100644 index 0000000000000000000000000000000000000000..98514fe7941625ec99b09c2fbe928bfd72e67c87 --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover1.txt.anna.~1~ @@ -0,0 +1,16 @@ +exogam_seg_01A0_theta 63.208784 exogam_seg_01A0_phi 255.327637 +exogam_seg_01A1_theta 80.834107 exogam_seg_01A1_phi 255.327637 +exogam_seg_01A2_theta 79.587912 exogam_seg_01A2_phi 235.588409 +exogam_seg_01A3_theta 60.099422 exogam_seg_01A3_phi 235.588409 +exogam_seg_01B0_theta 116.791221 exogam_seg_01B0_phi 255.327637 +exogam_seg_01B1_theta 119.900583 exogam_seg_01B1_phi 235.588409 +exogam_seg_01B2_theta 100.412086 exogam_seg_01B2_phi 235.588409 +exogam_seg_01B3_theta 116.791221 exogam_seg_01B3_phi 255.327637 +exogam_seg_01C0_theta 99.165891 exogam_seg_01C0_phi 194.672363 +exogam_seg_01C1_theta 100.412086 exogam_seg_01C1_phi194.672363 +exogam_seg_01C2_theta 119.900583 exogam_seg_01C2_phi 214.411591 +exogam_seg_01C3_theta 80.834107 exogam_seg_01C3_phi 214.411591 +exogam_seg_01D0_theta 63.208784 exogam_seg_01D0_phi 194.672363 +exogam_seg_01D1_theta 60.099422 exogam_seg_01D1_phi 214.411591 +exogam_seg_01D2_theta 79.587912 exogam_seg_01D2_phi 214.411591 +exogam_seg_01D3_theta 80.834107 exogam_seg_01D3_phi 194.672363 diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover1.txt.original b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover1.txt.original new file mode 100755 index 0000000000000000000000000000000000000000..ff9afce4aabe0e77faf050d32d9e0b454769e84c --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover1.txt.original @@ -0,0 +1,16 @@ +exogam_seg_01A0_theta 116.791221 exogam_seg_01A0_phi 255.327637 +exogam_seg_01A1_theta 119.900583 exogam_seg_01A1_phi 235.588409 +exogam_seg_01A2_theta 100.412086 exogam_seg_01A2_phi 235.588409 +exogam_seg_01A3_theta 99.165891 exogam_seg_01A3_phi 255.327637 +exogam_seg_01B0_theta 116.791221 exogam_seg_01B0_phi 194.672363 +exogam_seg_01B1_theta 99.165891 exogam_seg_01B1_phi 194.672363 +exogam_seg_01B2_theta 100.412086 exogam_seg_01B2_phi 214.411591 +exogam_seg_01B3_theta 119.900583 exogam_seg_01B3_phi 214.411591 +exogam_seg_01C0_theta 63.208784 exogam_seg_01C0_phi 194.672363 +exogam_seg_01C1_theta 60.099422 exogam_seg_01C1_phi 214.411591 +exogam_seg_01C2_theta 79.587912 exogam_seg_01C2_phi 214.411591 +exogam_seg_01C3_theta 80.834107 exogam_seg_01C3_phi 194.672363 +exogam_seg_01D0_theta 72.876609 exogam_seg_01D0_phi 252.056000 +exogam_seg_01D1_theta 72.145253 exogam_seg_01D1_phi 264.091919 +exogam_seg_01D2_theta 84.123103 exogam_seg_01D2_phi 264.091919 +exogam_seg_01D3_theta 84.377432 exogam_seg_01D3_phi 252.056000 diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover1.txt.~1~ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover1.txt.~1~ new file mode 100755 index 0000000000000000000000000000000000000000..7f92f55dcf6bb961509b2787b123e69fcecab5ef --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover1.txt.~1~ @@ -0,0 +1,16 @@ +exogam_seg_01A0_theta 88.46 exogam_seg_01A0_phi -160.381 +exogam_seg_01A1_theta 71.82 exogam_seg_01A1_phi -160.381 +exogam_seg_01A2_theta 71.00 exogam_seg_01A2_phi -143.652 +exogam_seg_01A3_theta 85.44 exogam_seg_01A3_phi -143.652 +exogam_seg_01B0_theta 44.91 exogam_seg_01B0_phi -160.381 +exogam_seg_01B1_theta 49.29 exogam_seg_01B1_phi -143.652 +exogam_seg_01B2_theta 53.72 exogam_seg_01B2_phi -143.652 +exogam_seg_01B3_theta 61.76 exogam_seg_01B3_phi -160.381 +exogam_seg_01C0_theta 44.91 exogam_seg_01C0_phi -109.619 +exogam_seg_01C1_theta 61.76 exogam_seg_01C1_phi -109.619 +exogam_seg_01C2_theta 53.72 exogam_seg_01C2_phi -126.348 +exogam_seg_01C3_theta 49.29 exogam_seg_01C3_phi -126.348 +exogam_seg_01D0_theta 88.46 exogam_seg_01D0_phi -109.619 +exogam_seg_01D1_theta 85.44 exogam_seg_01D1_phi -126.348 +exogam_seg_01D2_theta 71.00 exogam_seg_01D2_phi -126.348 +exogam_seg_01D3_theta 71.82 exogam_seg_01D3_phi -109.619 diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover2.txt b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover2.txt new file mode 100755 index 0000000000000000000000000000000000000000..92caf57c60e5a54cf71b5647a8e9fa9999378103 --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover2.txt @@ -0,0 +1,17 @@ +exogam_seg_02A0_theta 105.681400 exogam_seg_02A0_phi 28.695801 +exogam_seg_02A1_theta 95.126223 exogam_seg_02A1_phi 28.695801 +exogam_seg_02A2_theta 95.316752 exogam_seg_02A2_phi 39.660210 +exogam_seg_02A3_theta 106.237179 exogam_seg_02A3_phi 39.660210 +exogam_seg_02B0_theta 74.318605 exogam_seg_02B0_phi 28.695801 +exogam_seg_02B1_theta 73.762819 exogam_seg_02B1_phi 39.660210 +exogam_seg_02B2_theta 84.683247 exogam_seg_02B2_phi 39.660210 +exogam_seg_02B3_theta 84.873782 exogam_seg_02B3_phi 28.695801 +exogam_seg_02C0_theta 74.318605 exogam_seg_02C0_phi 61.304199 +exogam_seg_02C1_theta 84.873782 exogam_seg_02C1_phi 61.304199 +exogam_seg_02C2_theta 84.683247 exogam_seg_02C2_phi 50.339794 +exogam_seg_02C3_theta 73.762819 exogam_seg_02C3_phi 50.339794 +exogam_seg_02D0_theta 105.681400 exogam_seg_02D0_phi 61.304199 +exogam_seg_02D1_theta 106.237179 exogam_seg_02D1_phi 50.339794 +exogam_seg_02D2_theta 95.316752 exogam_seg_02D2_phi 50.339794 +exogam_seg_02D3_theta 95.126223 exogam_seg_02D3_phi 61.304199 + diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover2.txt.anna b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover2.txt.anna new file mode 100644 index 0000000000000000000000000000000000000000..916f24a0bc577625c593893f1dc75d6cc519e93b --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover2.txt.anna @@ -0,0 +1,17 @@ +exogam_seg_03A0_theta 116.791221 exogam_seg_03A0_phi 14.672364 +exogam_seg_03A1_theta 99.165891 exogam_seg_03A1_phi 14.672364 +exogam_seg_03A2_theta 100.412086 exogam_seg_03A2_phi 34.411594 +exogam_seg_03A3_theta 119.900583 exogam_seg_03A3_phi 34.411594 +exogam_seg_03B0_theta 63.208784 exogam_seg_03B0_phi 14.672364 +exogam_seg_03B1_theta 60.099422 exogam_seg_03B1_phi 34.411594 +exogam_seg_03B2_theta 79.587912 exogam_seg_03B2_phi 34.411594 +exogam_seg_03B3_theta 80.834107 exogam_seg_03B3_phi 14.672364 +exogam_seg_03C0_theta 63.208784 exogam_seg_03C0_phi 75.327637 +exogam_seg_03C1_theta 80.834107 exogam_seg_03C1_phi 75.327637 +exogam_seg_03C2_theta 79.587912 exogam_seg_03C2_phi 55.588406 +exogam_seg_03C3_theta 60.099422 exogam_seg_03C3_phi 55.588406 +exogam_seg_03D0_theta 116.791221 exogam_seg_03D0_phi 75.327637 +exogam_seg_03D1_theta 119.900583 exogam_seg_03D1_phi 55.588406 +exogam_seg_03D2_theta 100.412086 exogam_seg_03D2_phi 55.588406 +exogam_seg_03D3_theta 99.165891 exogam_seg_03D3_phi 75.327637 + diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover2.txt.original b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover2.txt.original new file mode 100755 index 0000000000000000000000000000000000000000..e0b1214438263fa11a4fe6125e5fecf15ff2eed4 --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover2.txt.original @@ -0,0 +1,17 @@ +exogam_seg_03A0_theta 44.91 exogam_seg_03A0_phi -199.619 +exogam_seg_03A1_theta 61.76 exogam_seg_03A1_phi -199.619 +exogam_seg_03A2_theta 53.72 exogam_seg_03A2_phi -216.348 +exogam_seg_03A3_theta 49.29 exogam_seg_03A3_phi -216.348 +exogam_seg_03B0_theta 88.41 exogam_seg_03B0_phi -199.619 +exogam_seg_03B1_theta 85.44 exogam_seg_03B1_phi -216.348 +exogam_seg_03B2_theta 71.00 exogam_seg_03B2_phi -216.348 +exogam_seg_03B3_theta 71.82 exogam_seg_03B3_phi -199.619 +exogam_seg_03C0_theta 88.41 exogam_seg_03C0_phi -250.381 +exogam_seg_03C1_theta 71.82 exogam_seg_03C1_phi -250.381 +exogam_seg_03C2_theta 71.00 exogam_seg_03C2_phi -233.652 +exogam_seg_03C3_theta 85.44 exogam_seg_03C3_phi -233.652 +exogam_seg_03D0_theta 44.91 exogam_seg_03D0_phi -250.381 +exogam_seg_03D1_theta 49.29 exogam_seg_03D1_phi -233.652 +exogam_seg_03D2_theta 53.72 exogam_seg_03D2_phi -233.652 +exogam_seg_03D3_theta 61.76 exogam_seg_03D3_phi -250.381 + diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover2.txt.~1~ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover2.txt.~1~ new file mode 100755 index 0000000000000000000000000000000000000000..e0b1214438263fa11a4fe6125e5fecf15ff2eed4 --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover2.txt.~1~ @@ -0,0 +1,17 @@ +exogam_seg_03A0_theta 44.91 exogam_seg_03A0_phi -199.619 +exogam_seg_03A1_theta 61.76 exogam_seg_03A1_phi -199.619 +exogam_seg_03A2_theta 53.72 exogam_seg_03A2_phi -216.348 +exogam_seg_03A3_theta 49.29 exogam_seg_03A3_phi -216.348 +exogam_seg_03B0_theta 88.41 exogam_seg_03B0_phi -199.619 +exogam_seg_03B1_theta 85.44 exogam_seg_03B1_phi -216.348 +exogam_seg_03B2_theta 71.00 exogam_seg_03B2_phi -216.348 +exogam_seg_03B3_theta 71.82 exogam_seg_03B3_phi -199.619 +exogam_seg_03C0_theta 88.41 exogam_seg_03C0_phi -250.381 +exogam_seg_03C1_theta 71.82 exogam_seg_03C1_phi -250.381 +exogam_seg_03C2_theta 71.00 exogam_seg_03C2_phi -233.652 +exogam_seg_03C3_theta 85.44 exogam_seg_03C3_phi -233.652 +exogam_seg_03D0_theta 44.91 exogam_seg_03D0_phi -250.381 +exogam_seg_03D1_theta 49.29 exogam_seg_03D1_phi -233.652 +exogam_seg_03D2_theta 53.72 exogam_seg_03D2_phi -233.652 +exogam_seg_03D3_theta 61.76 exogam_seg_03D3_phi -250.381 + diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover2.txt.~2~ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover2.txt.~2~ new file mode 100755 index 0000000000000000000000000000000000000000..976c969d703bcb59e33cd98cedb6f50865593af6 --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover2.txt.~2~ @@ -0,0 +1,17 @@ +exogam_seg_02A0_theta 105.681400 28.695801 exogam_seg_02A0_phi 28.695801 +exogam_seg_02A1_theta 95.126223 28.695801 exogam_seg_02A1_phi 28.695801 +exogam_seg_02A2_theta 95.316752 39.660210 exogam_seg_02A2_phi 39.660210 +exogam_seg_02A3_theta 106.237179 39.660210 exogam_seg_02A3_phi 39.660210 +exogam_seg_02B0_theta 74.318605 28.695801 exogam_seg_02B0_phi 28.695801 +exogam_seg_02B1_theta 73.762819 39.660210 exogam_seg_02B1_phi 39.660210 +exogam_seg_02B2_theta 84.683247 39.660210 exogam_seg_02B2_phi 39.660210 +exogam_seg_02B3_theta 84.873782 28.695801 exogam_seg_02B3_phi 28.695801 +exogam_seg_02C0_theta 74.318605 61.304199 exogam_seg_02C0_phi 61.304199 +exogam_seg_02C1_theta 84.873782 61.304199 exogam_seg_02C1_phi 61.304199 +exogam_seg_02C2_theta 84.683247 50.339794 exogam_seg_02C2_phi 50.339794 +exogam_seg_02C3_theta 73.762819 50.339794 exogam_seg_02C3_phi 50.339794 +exogam_seg_02D0_theta 105.681400 61.304199 exogam_seg_02D0_phi 61.304199 +exogam_seg_02D1_theta 106.237179 50.339794 exogam_seg_02D1_phi 50.339794 +exogam_seg_02D2_theta 95.316752 50.339794 exogam_seg_02D2_phi 50.339794 +exogam_seg_02D3_theta 95.126223 61.304199 exogam_seg_02D3_phi 61.304199 + diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover3.txt b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover3.txt new file mode 100755 index 0000000000000000000000000000000000000000..bde13d09c035c26ada15942912fecd75f7a67f56 --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover3.txt @@ -0,0 +1,17 @@ +exogam_seg_03A0_theta 74.318605 exogam_seg_03A0_phi 151.304199 +exogam_seg_03A1_theta 84.873782 exogam_seg_03A1_phi 151.304199 +exogam_seg_03A2_theta 84.683247 exogam_seg_03A2_phi 140.339798 +exogam_seg_03A3_theta 73.762819 exogam_seg_03A3_phi 140.339798 +exogam_seg_03B0_theta 105.681400 exogam_seg_03B0_phi 151.304199 +exogam_seg_03B1_theta 106.237179 exogam_seg_03B1_phi 140.339798 +exogam_seg_03B2_theta 95.316752 exogam_seg_03B2_phi 140.339798 +exogam_seg_03B3_theta 95.126223 exogam_seg_03B3_phi 151.304199 +exogam_seg_03C0_theta 105.681400 exogam_seg_03C0_phi 118.695801 +exogam_seg_03C1_theta 95.126223 exogam_seg_03C1_phi 118.695801 +exogam_seg_03C2_theta 95.316752 exogam_seg_03C2_phi 129.660202 +exogam_seg_03C3_theta 106.237179 exogam_seg_03C3_phi 129.660202 +exogam_seg_03D0_theta 74.318605 exogam_seg_03D0_phi 118.695801 +exogam_seg_03D1_theta 73.762819 exogam_seg_03D1_phi 129.660202 +exogam_seg_03D2_theta 84.683247 exogam_seg_03D2_phi 129.660202 +exogam_seg_03D3_theta 84.873782 exogam_seg_03D3_phi 118.695801 + diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover3.txt.anna b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover3.txt.anna new file mode 100644 index 0000000000000000000000000000000000000000..46046159f66792085f82e980b9b698c44ee676ca --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover3.txt.anna @@ -0,0 +1,17 @@ +exogam_seg_03A0_theta 63.208784 exogam_seg_03A0_phi 165.327637 +exogam_seg_03A1_theta 80.834107 exogam_seg_03A1_phi 165.327637 +exogam_seg_03A2_theta 79.587912 exogam_seg_03A2_phi 145.588409 +exogam_seg_03A3_theta 60.099422 exogam_seg_03A3_phi 145.588409 +exogam_seg_03B0_theta 116.791221 exogam_seg_03B0_phi 165.327637 +exogam_seg_03B1_theta 119.900583 exogam_seg_03B1_phi 145.588409 +exogam_seg_03B2_theta 100.412086 exogam_seg_03B2_phi 145.588409 +exogam_seg_03B3_theta 99.165891 exogam_seg_03B3_phi 165.327637 +exogam_seg_03C0_theta 116.791221 exogam_seg_03C0_phi 104.672363 +exogam_seg_03C1_theta 99.165891 exogam_seg_03C1_phi 104.672363 +exogam_seg_03C2_theta 100.412086 exogam_seg_03C2_phi 124.411591 +exogam_seg_03C3_theta 119.900583 exogam_seg_03C3_phi 124.411591 +exogam_seg_03D0_theta 63.208784 exogam_seg_03D0_phi 104.672363 +exogam_seg_03D1_theta 60.099422 exogam_seg_03D1_phi 124.411591 +exogam_seg_03D2_theta 79.587912 exogam_seg_03D2_phi 124.411591 +exogam_seg_03D3_theta 80.834107 exogam_seg_03D3_phi 104.672363 + diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover3.txt.original b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover3.txt.original new file mode 100755 index 0000000000000000000000000000000000000000..dc7e8b5bad7369d9cee3336f7d523822d6b11a0f --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover3.txt.original @@ -0,0 +1,17 @@ +exogam_seg_03A0_theta 63.208784 exogam_seg_03A0_phi 165.327637 +exogam_seg_03A1_theta 80.834107 exogam_seg_03A1_phi 165.327637 +exogam_seg_03A2_theta 79.587912 exogam_seg_03A2_phi 145.588409 +exogam_seg_03A3_theta 60.099422 exogam_seg_03A3_phi 145.588409 +exogam_seg_03B0_theta 116.791221 exogam_seg_03B0_phi 165.327637 +exogam_seg_03B1_theta 119.900583 exogam_seg_03B1_phi 145.588409 +exogam_seg_03B2_theta 100.412086 exogam_seg_03B2_phi 145.588409 +exogam_seg_03B3_theta 99.165891 exogam_seg_03B3_phi 165.327637 +exogam_seg_03C0_theta 116.791221 exogam_seg_03C0_phi 104.672363 +exogam_seg_03C1_theta 99.165891 exogam_seg_03C1_phi 104.672363 +exogam_seg_03C2_theta 100.412086 exogam_seg_03C2_phi 124.411591 +exogam_seg_03C3_theta 119.900583 exogam_seg_03C3_phi 124.411591 +exogam_seg_03D0_theta 63.208784 exogam_seg_03D0_phi 63.208784 +exogam_seg_03D1_theta 60.099422 exogam_seg_03D1_phi 60.099422 +exogam_seg_03D2_theta 79.587912 exogam_seg_03D2_phi 79.587912 +exogam_seg_03D3_theta 80.834107 exogam_seg_03D3_phi 80.834107 + diff --git a/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover3.txt.~1~ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover3.txt.~1~ new file mode 100755 index 0000000000000000000000000000000000000000..e0b1214438263fa11a4fe6125e5fecf15ff2eed4 --- /dev/null +++ b/NPAnalysis/e628/posz42_exp_stat_demiring/angles_exogam_clover3.txt.~1~ @@ -0,0 +1,17 @@ +exogam_seg_03A0_theta 44.91 exogam_seg_03A0_phi -199.619 +exogam_seg_03A1_theta 61.76 exogam_seg_03A1_phi -199.619 +exogam_seg_03A2_theta 53.72 exogam_seg_03A2_phi -216.348 +exogam_seg_03A3_theta 49.29 exogam_seg_03A3_phi -216.348 +exogam_seg_03B0_theta 88.41 exogam_seg_03B0_phi -199.619 +exogam_seg_03B1_theta 85.44 exogam_seg_03B1_phi -216.348 +exogam_seg_03B2_theta 71.00 exogam_seg_03B2_phi -216.348 +exogam_seg_03B3_theta 71.82 exogam_seg_03B3_phi -199.619 +exogam_seg_03C0_theta 88.41 exogam_seg_03C0_phi -250.381 +exogam_seg_03C1_theta 71.82 exogam_seg_03C1_phi -250.381 +exogam_seg_03C2_theta 71.00 exogam_seg_03C2_phi -233.652 +exogam_seg_03C3_theta 85.44 exogam_seg_03C3_phi -233.652 +exogam_seg_03D0_theta 44.91 exogam_seg_03D0_phi -250.381 +exogam_seg_03D1_theta 49.29 exogam_seg_03D1_phi -233.652 +exogam_seg_03D2_theta 53.72 exogam_seg_03D2_phi -233.652 +exogam_seg_03D3_theta 61.76 exogam_seg_03D3_phi -250.381 + diff --git a/NPAnalysis/e628/test.txt b/NPAnalysis/e628/test.txt new file mode 100644 index 0000000000000000000000000000000000000000..879e174854d513aad28a825597cc4dc0537a4d1e --- /dev/null +++ b/NPAnalysis/e628/test.txt @@ -0,0 +1,7 @@ +a +c +v +b +t +d + diff --git a/NPAnalysis/e628/testRead.C b/NPAnalysis/e628/testRead.C new file mode 100644 index 0000000000000000000000000000000000000000..15a31b2b38fd5bf326f2700825f5125ca2bcccbc --- /dev/null +++ b/NPAnalysis/e628/testRead.C @@ -0,0 +1,18 @@ + +{ + ifstream in("/home/e628/nptool/NPAnalysis/test.txt"); + + string data ; + + while (!in.eof()){ + in >> data ; + cout << data << endl ; + + } + + + + + + +} diff --git a/NPAnalysis/must2/configs/ConfigMust2.dat b/NPAnalysis/must2/configs/ConfigMust2.dat index 3d0c81d7d0bd94c1233226f34e694552f95a488c..1a473ca5bc60208fd520e0548953de1e88f5e275 100644 --- a/NPAnalysis/must2/configs/ConfigMust2.dat +++ b/NPAnalysis/must2/configs/ConfigMust2.dat @@ -1,8 +1,3 @@ ConfigMust2 MAX_STRIP_MULTIPLICITY 1 - SI_X_E_RAW_THRESHOLD 0 - SILI_E_RAW_THRESHOLD 0 - SILI_E_THRESHOLD 0 - DISABLE_CHANNEL MM4STRX3 - DISABLE_ALL MM1 diff --git a/NPLib/CATS/TCATSData.h b/NPLib/CATS/TCATSData.h index d407560b45be7552cb30ff150895e418406b6fc0..39414f07dca9d53cb3dbd30aa9a31531e263f559 100644 --- a/NPLib/CATS/TCATSData.h +++ b/NPLib/CATS/TCATSData.h @@ -48,17 +48,17 @@ class TCATSData : public TObject { virtual ~TCATSData(); void Clear(); - void Clear(const Option_t*) {}; + void Clear(const Option_t*) {}; void Dump() const; ///////////////////// SETTERS //////////////////////// // X void SetCATSDetX(UShort_t DetX) {fCATS_DetX.push_back(DetX);} - void SetCATSStripX(UShort_t StripX) {fCATS_StripX.push_back(StripX);} + void SetCATSStripX(UShort_t StripX) {fCATS_StripX.push_back(StripX);} void SetCATSChargeX(UShort_t ChargeX) {fCATS_ChargeX.push_back(ChargeX);} // Y void SetCATSDetY(UShort_t DetY) {fCATS_DetY.push_back(DetY);} - void SetCATSStripY(UShort_t StripY) {fCATS_StripY.push_back(StripY);} + void SetCATSStripY(UShort_t StripY) {fCATS_StripY.push_back(StripY);} void SetCATSChargeY(UShort_t ChargeY) {fCATS_ChargeY.push_back(ChargeY);} //Q fil diff --git a/NPLib/CATS/TCATSPhysics.cxx b/NPLib/CATS/TCATSPhysics.cxx index c42b0e231193516cb9914a8bf9d47670f7f2a5f9..e0d36ef18b1a15fcd1ed78aba36f8ab0d07a6ec0 100644 --- a/NPLib/CATS/TCATSPhysics.cxx +++ b/NPLib/CATS/TCATSPhysics.cxx @@ -21,7 +21,7 @@ *****************************************************************************/ #include "TCATSPhysics.h" -using namespace LOCAL_CATS; +using namespace CATS_LOCAL; // STL #include <cmath> @@ -29,37 +29,38 @@ using namespace LOCAL_CATS; #include <sstream> #include <fstream> #include <iostream> -#include <stdlib.h> +#include <set> +#include <cstdlib> +using namespace std; // NPL #include "RootInput.h" #include "RootOutput.h" // ROOT #include "TChain.h" -#include "TRandom.h" - +#include "TF1.h" +#include "TGraph.h" ClassImp(TCATSPhysics) /////////////////////////////////////////////////////////////////////////// -TCATSPhysics::TCATSPhysics() -{ - m_EventData = new TCATSData ; - m_PreTreatedData = new TCATSData ; - m_EventPhysics = this ; - m_NumberOfCATS = 0 ; -} + TCATSPhysics::TCATSPhysics(){ + m_EventData = new TCATSData ; + m_PreTreatedData = new TCATSData ; + m_EventPhysics = this ; + m_NumberOfCATS = 0 ; + m_Spectra = NULL ; + } /////////////////////////////////////////////////////////////////////////// -TCATSPhysics::~TCATSPhysics() -{ +TCATSPhysics::~TCATSPhysics(){ } /////////////////////////////////////////////////////////////////////////// -void TCATSPhysics::PreTreat() -{ +void TCATSPhysics::PreTreat(){ ClearPreTreatedData(); gRandom->SetSeed(0); // X - for(int i = 0 ; i < m_EventData->GetCATSMultX() ; i++){ + unsigned int sizeX = m_EventData->GetCATSMultX(); + for(unsigned int i = 0 ; i < sizeX ; i++){ // Valid Channel X if(IsValidChannel("X", m_EventData->GetCATSDetX(i), m_EventData->GetCATSStripX(i)) ){ if( fCATS_Threshold_X(m_EventData , i) ){ @@ -72,15 +73,14 @@ void TCATSPhysics::PreTreat() else { m_PreTreatedData->SetCATSStripX( m_EventData->GetCATSStripX(i) ); } - m_PreTreatedData->SetCATSDetX( m_EventData->GetCATSDetX(i) ); - } } } // Y - for(int i = 0 ; i < m_EventData->GetCATSMultY() ; i++){ + unsigned int sizeY = m_EventData->GetCATSMultY(); + for(unsigned int i = 0 ; i < sizeY ; i++){ // Valid Channel Y if(IsValidChannel("Y", m_EventData->GetCATSDetY(i), m_EventData->GetCATSStripY(i))){ if( fCATS_Threshold_Y(m_EventData , i) ){ @@ -93,9 +93,7 @@ void TCATSPhysics::PreTreat() else { m_PreTreatedData->SetCATSStripY( m_EventData->GetCATSStripY(i) ); } - m_PreTreatedData->SetCATSDetY( m_EventData->GetCATSDetY(i) ); - } } } @@ -103,159 +101,159 @@ void TCATSPhysics::PreTreat() } ///////////////////////////////////////////////////////////////////////////// -void TCATSPhysics::BuildSimplePhysicalEvent() -{ +void TCATSPhysics::BuildSimplePhysicalEvent(){ BuildPhysicalEvent(); } ////////////////////////////////////////////////////////////////////////////// -void TCATSPhysics::BuildPhysicalEvent() -{ +void TCATSPhysics::BuildPhysicalEvent(){ PreTreat(); - double Pi = 3.14159265; - - // How many CATS? - int NumberOfCATSHit = 0 ; - int DetectorID = -1; - double SumChargeX[2]; - double SumChargeY[2]; - + // Look how many CATS were fired + // use a set to identify which detector has been hit + set<int> DetectorHitX; // X only + set<int> DetectorHit; // X and Y + unsigned int sizeX = m_PreTreatedData->GetCATSMultX() ; for( unsigned short i = 0 ; i < m_PreTreatedData->GetCATSMultX() ; i++ ){ - if( m_PreTreatedData->GetCATSDetX(i) != DetectorID) { - NumberOfCATSHit++; - DetectorID = m_PreTreatedData->GetCATSDetX(i); - } - if(NumberOfCATSHit == m_NumberOfCATS) break; + // Insert detector number in the set, if the key already exist, do nothing + DetectorHitX.insert(m_PreTreatedData->GetCATSDetX(i)); } + // Correspond to CATS with both X and Y + unsigned int sizeY = m_PreTreatedData->GetCATSMultY() ; + for( unsigned short i = 0 ; i < m_PreTreatedData->GetCATSMultY() ; i++ ){ + // Insert detector number in the set, if the key already exist, do nothing + // Only if the detector was hit on X as well + if(DetectorHitX.find(m_PreTreatedData->GetCATSDetY(i))!=DetectorHitX.end()) + DetectorHit.insert(m_PreTreatedData->GetCATSDetY(i)); + } + // The number of CATS hit, i.e. the number of CATS that we are going to analyse + unsigned int NumberOfCATSHit = DetectorHit.size(); - // INITIALISATION OF VECTORS : DIM = NUMBER OF CATS - for(int k = 0 ; k < NumberOfCATSHit ; k++ ){ - // X - StripMaxX.push_back(-1); - ReconstructionMethodX.push_back(NO); - SumChargeX[k] = 0; + vector<double> ChargeArray; + ChargeArray.resize(28,0); + // INITIALISATION OF VECTORS : DIM = NumberOfCATSHit + for(set<int>::iterator it=DetectorHit.begin(); it!=DetectorHit.end(); ++it){ + // Assign order for the detector number + DetMaxX.push_back(*it); + DetMaxY.push_back(*it); + // X + StripMaxX.push_back(1); + ChargeMaxX.push_back(1); + QsumX.push_back(0); // Y - StripMaxY.push_back(-1); - ReconstructionMethodY.push_back(NO); - SumChargeY[k] = 0; - } + StripMaxY.push_back(1); + ChargeMaxY.push_back(1); + QsumY.push_back(0); - for(int p = 0 ; p < m_NumberOfCATS ; p++){ - for(int z=0; z<28; z++) { - Buffer_X_Q[z][p] = -1; - Buffer_Y_Q[z][p] = -1; - } + Buffer_X_Q.push_back(ChargeArray); + Buffer_Y_Q.push_back(ChargeArray); } - for(unsigned int i = 0 ; i < m_PreTreatedData->GetCATSMultX() ; i++ ){ + // Fill up the Charge And Max field for X + for(unsigned int i = 0 ; i < sizeX ; i++ ){ int StrX = m_PreTreatedData->GetCATSStripX(i); int NX = m_PreTreatedData->GetCATSDetX(i); - double CATS_X_Q = m_PreTreatedData->GetCATSChargeX(i) ; - Buffer_X_Q[StrX-1][NX-1] = CATS_X_Q; - SumChargeX[NX-1] += CATS_X_Q; + double CATS_X_Q = m_PreTreatedData->GetCATSChargeX(i) ; ChargeX.push_back(CATS_X_Q); StripX.push_back(StrX); DetNumberX.push_back(NX); - HitX++; - if(HitX==1) - StripMaxX[NX-1] = StrX; - else if(ChargeX[HitX-1] > Buffer_X_Q[StripMaxX[NX-1] -1][NX-1] ) - StripMaxX[NX-1] = StrX ; + for(unsigned int j = 0 ; j < NumberOfCATSHit ; j++){ + if(NX == DetMaxX[j] ){ + Buffer_X_Q[j][StrX-1]= CATS_X_Q; + QsumX[j]+= CATS_X_Q; + if(CATS_X_Q > Buffer_X_Q[j][StripMaxX[j] -1]){ + StripMaxX[j] = StrX ; + ChargeMaxX[j]= CATS_X_Q; + } + } + } } - for(unsigned int j = 0 ; j < m_PreTreatedData->GetCATSMultY() ; j++ ){ - int StrY = m_PreTreatedData->GetCATSStripY(j); - int NY = m_PreTreatedData->GetCATSDetY(j); - double CATS_Y_Q = m_PreTreatedData->GetCATSChargeY(j) ; - Buffer_Y_Q[StrY-1][NY-1] = CATS_Y_Q; - SumChargeY[NY-1] += CATS_Y_Q; + // Fill up the Charge And Max field for Y + for(unsigned int i = 0 ; i < sizeY ; i++ ){ + int StrY = m_PreTreatedData->GetCATSStripY(i); + int NY = m_PreTreatedData->GetCATSDetY(i); + double CATS_Y_Q = m_PreTreatedData->GetCATSChargeY(i) ; ChargeY.push_back(CATS_Y_Q); StripY.push_back(StrY); DetNumberY.push_back(NY); - HitY++; - if(HitY==1) - StripMaxY[NY-1] = StrY; - else if(ChargeY[HitY-1] > Buffer_Y_Q[StripMaxY[NY-1] -1][NY-1] ) - StripMaxY[NY-1] = StrY ; + + for(unsigned int j = 0 ; j < NumberOfCATSHit ; j++){ + if(NY == DetMaxY[j] ){ + Buffer_Y_Q[j][StrY-1]= CATS_Y_Q; + QsumY[j]+= CATS_Y_Q; + if(CATS_Y_Q > Buffer_Y_Q[j][StripMaxY[j] -1]){ + StripMaxY[j] = StrY ; + ChargeMaxY[j]= CATS_Y_Q; + } + } + } } - double CalculatedStripX = 0, CalculatedStripY = 0; - double posX = 0 , posY = 0; +// double CalculatedStripX = 0, CalculatedStripY = 0; +// double posX = 0 , posY = 0; - for(ff = 0 ; ff < NumberOfCATSHit ; ff++ ){ - CalculatedStripX = AnalyseX(ff); - CalculatedStripY = AnalyseY(ff); + for(unsigned int i = 0 ; i < NumberOfCATSHit ; i++ ){ + // Return the position in strip unit + double PosX = ReconstructionFunctionX[DetMaxX[i]-1](Buffer_X_Q[i],StripMaxX[i]); + double PosY = ReconstructionFunctionY[DetMaxY[i]-1](Buffer_Y_Q[i],StripMaxY[i]); + StripNumberX.push_back(PosX); + StripNumberY.push_back(PosY); - posX = CalculatePositionX(CalculatedStripX, NOcor); - posY = CalculatePositionY(CalculatedStripY, NOcor); + // Convert in mm by doing a linear interpolation - DetNumberX_Position.push_back(ff+1); - DetNumberY_Position.push_back(ff+1); - DetNumberZ_Position.push_back(ff+1); + // sx and sy are the X and Y strip number between which the PosX and PosY are + int sx0 = (int) PosX; + int sx1 = sx0+1; + int sy0 = (int) PosY; + int sy1 = sy0+1; - PositionX.push_back(posX) ; - PositionY.push_back(posY) ; - PositionZ.push_back(StripPositionZ[ff]) ; + if(PosX>-1000 && PosY>-1000 && sx0 > -1 && sx1 < 28 && sy0 > -1 && sy1 < 28){ + // px and py are the x and y coordinate of strip sx and sy + double px0 = StripPositionX[DetMaxX[i]-1][sx0][sy0]; + double px1 = StripPositionX[DetMaxX[i]-1][sx1][sy1]; - QsumX.push_back(SumChargeX[ff]); - QsumY.push_back(SumChargeY[ff]); - } + double py0 = StripPositionY[DetMaxY[i]-1][sx0][sy0]; + double py1 = StripPositionY[DetMaxY[i]-1][sx1][sy1]; - if(NumberOfCATSHit > 1){ - if(PositionX[0] != -1000 && PositionY[0] != -1000 && PositionX[1] != -1000 && PositionY[1] != -1000) - { - double PositionOnTargetX_1; - double PositionOnTargetY_1; - double l = sqrt((PositionZ[0]-PositionZ[1])*(PositionZ[0]-PositionZ[1])); - double L = - PositionZ[1]; - double t = (l+L) / l; - - PositionOnTargetX_1 = PositionX[0] + (PositionX[1] - PositionX[0]) * t ; - PositionOnTargetY_1 = PositionY[0] + (PositionY[1] - PositionY[0]) * t ; - - if(m_TargetAngle != 0) - { - double a = (PositionZ[1]-PositionZ[0])/(PositionX[1]-PositionX[0]); - double b = PositionZ[0] - a*PositionX[0]; - PositionOnTargetX = b/(tan(m_TargetAngle*Pi/180.) - a); - - double t_new = (l + L + PositionOnTargetX*tan(m_TargetAngle*Pi/180.)) / l; - PositionOnTargetY = PositionY[0] + (PositionY[1] - PositionY[0]) * t_new ; - } + PositionX.push_back(px0+(px1-px0)*(PosX-sx0)); + PositionY.push_back(py0+(py1-py0)*(PosY-sy0)); + PositionZ.push_back(StripPositionZ[DetMaxX[i]-1]); + } + } - else{ - PositionOnTargetX = PositionOnTargetX_1; - PositionOnTargetY = PositionOnTargetY_1; - } - GetPositionOnTarget(); - GetBeamDirection(); + // At least two CATS need to gave back position in order to reconstruct on Target + if(PositionX.size()>1){ + if(DetMaxX[0]<DetMaxX[1]){ + double t = -PositionZ[1]/(PositionZ[1]-PositionZ[0]); + PositionOnTargetX= PositionX[1] + (PositionX[1]-PositionX[0])*t; + PositionOnTargetY= PositionY[1] + (PositionY[1]-PositionY[0])*t; + BeamDirection = GetBeamDirection(); } else{ - BeamDirection = TVector3 (1,0,0); - PositionOnTargetX = -1000 ; - PositionOnTargetY = -1000 ; + double t = -PositionZ[0]/(PositionZ[0]-PositionZ[1]); + PositionOnTargetX= PositionX[0] + (PositionX[0]-PositionX[1])*t; + PositionOnTargetY= PositionY[0] + (PositionY[0]-PositionY[1])*t; + BeamDirection = GetBeamDirection(); } } - else if(NumberOfCATSHit == 1){ + // Does not meet the conditions for target position and beam direction + else{ BeamDirection = TVector3 (1,0,0); PositionOnTargetX = -1000 ; PositionOnTargetY = -1000 ; } - return; - } /////////////////////////////////////////////////////////////////////////// // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token -void TCATSPhysics::ReadConfiguration(string Path) -{ +void TCATSPhysics::ReadConfiguration(string Path){ ifstream ConfigFile; ConfigFile.open(Path.c_str()); string LineBuffer ; @@ -393,17 +391,12 @@ void TCATSPhysics::ReadConfiguration(string Path) } InitializeStandardParameter(); ReadAnalysisConfig(); - m_method_CATS1X = StringToEnum(m_reconstruction_CATS1X); - m_method_CATS1Y = StringToEnum(m_reconstruction_CATS1Y); - m_method_CATS2X = StringToEnum(m_reconstruction_CATS2X); - m_method_CATS2Y = StringToEnum(m_reconstruction_CATS2Y); } ///////////////////////////////////////////////////////////////////// // 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 TCATSPhysics::InitializeRootInputRaw() -{ +void TCATSPhysics::InitializeRootInputRaw() { TChain* inputChain = RootInput::getInstance()->GetChain() ; inputChain->SetBranchStatus( "CATS" , true ) ; inputChain->SetBranchStatus( "fCATS_*" , true ) ; @@ -413,11 +406,9 @@ void TCATSPhysics::InitializeRootInputRaw() ///////////////////////////////////////////////////////////////////// // Activated associated Branches and link it to the private member DetectorPhysics address // In this method mother Branches (Detector) AND daughter leaf (parameter) have to be activated -void TCATSPhysics::InitializeRootInputPhysics() -{ +void TCATSPhysics::InitializeRootInputPhysics() { TChain* inputChain = RootInput::getInstance()->GetChain(); inputChain->SetBranchStatus( "CATS" , true ); - inputChain->SetBranchStatus( "ff" , true ); inputChain->SetBranchStatus( "DetNumberX" , true ); inputChain->SetBranchStatus( "StripX" , true ); inputChain->SetBranchStatus( "ChargeX" , true ); @@ -426,12 +417,13 @@ void TCATSPhysics::InitializeRootInputPhysics() inputChain->SetBranchStatus( "StripY" , true ); inputChain->SetBranchStatus( "ChargeY" , true ); inputChain->SetBranchStatus( "StripMaxY" , true ); - inputChain->SetBranchStatus( "DetNumberX_Position" , true ); - inputChain->SetBranchStatus( "DetNumberY_Position" , true ); - inputChain->SetBranchStatus( "DetNumberZ_Position" , true ); + inputChain->SetBranchStatus( "DetMaxX" , true ); + inputChain->SetBranchStatus( "DetMaxY" , true ); inputChain->SetBranchStatus( "PositionX" , true ); inputChain->SetBranchStatus( "PositionY" , true ); inputChain->SetBranchStatus( "PositionZ" , true ); + inputChain->SetBranchStatus( "StripNumberX" , true ); + inputChain->SetBranchStatus( "StripNumberY" , true ); inputChain->SetBranchStatus( "PositionOnTargetX" , true ); inputChain->SetBranchStatus( "PositionOnTargetY" , true ); inputChain->SetBranchStatus( "QsumX" , true ); @@ -442,15 +434,13 @@ void TCATSPhysics::InitializeRootInputPhysics() ///////////////////////////////////////////////////////////////////// // Create associated branches and associated private member DetectorPhysics address -void TCATSPhysics::InitializeRootOutput() -{ +void TCATSPhysics::InitializeRootOutput(){ TTree* outputTree = RootOutput::getInstance()->GetTree() ; outputTree->Branch( "CATS" , "TCATSPhysics" , &m_EventPhysics ) ; } ///////////////////////////////////////////////////////////////////// -void TCATSPhysics::AddCATS(TVector3 C_X1_Y1, TVector3 C_X28_Y1, TVector3 C_X1_Y28, TVector3 C_X28_Y28) -{ +void TCATSPhysics::AddCATS(TVector3 C_X1_Y1, TVector3 C_X28_Y1, TVector3 C_X1_Y28, TVector3 C_X28_Y28){ m_NumberOfCATS++ ; // remove warning @@ -485,13 +475,11 @@ void TCATSPhysics::AddCATS(TVector3 C_X1_Y1, TVector3 C_X28_Y1, TVector3 C_X1_Y2 // Moving StripCenter to 1.1 corner (strip center!) : Strip_1_1 = C_X1_Y1 + (U+V) * (StripPitch/2) ; - for( int i = 0 ; i < 28 ; i++ ) - { + for( int i = 0 ; i < 28 ; i++ ){ lineX.clear() ; lineY.clear() ; - for( int j = 0 ; j < 28 ; j++ ) - { + for( int j = 0 ; j < 28 ; j++ ){ StripCenter = Strip_1_1 + StripPitch*( i*U + j*V ) ; lineX.push_back( StripCenter.x() ) ; lineY.push_back( StripCenter.y() ) ; @@ -510,36 +498,33 @@ void TCATSPhysics::AddCATS(TVector3 C_X1_Y1, TVector3 C_X28_Y1, TVector3 C_X1_Y2 } /////////////////////////////////////////////////////////////// -void TCATSPhysics::Clear() -{ +void TCATSPhysics::Clear(){ DetNumberX.clear(); StripX.clear(); ChargeX.clear(); StripMaxX.clear(); + ChargeMaxX.clear(); + DetMaxX.clear(); DetNumberY.clear(); StripY.clear(); ChargeY.clear(); StripMaxY.clear(); - DetNumberX_Position.clear(); - DetNumberY_Position.clear(); - DetNumberZ_Position.clear(); + ChargeMaxY.clear(); + DetMaxY.clear(); PositionX.clear(); PositionY.clear(); PositionZ.clear(); + StripNumberX.clear(); + StripNumberY.clear(); QsumX.clear(); QsumY.clear(); - ReconstructionMethodX.clear(); - ReconstructionMethodY.clear(); - ff = 0; - HitX = 0; - HitY = 0; + Buffer_X_Q.clear(); + Buffer_Y_Q.clear(); } - //////////////////////////////////////////////////////////////////////////// -bool TCATSPhysics :: IsValidChannel(const string DetectorType, const int Detector , const int channel) -{ +bool TCATSPhysics :: IsValidChannel(const string DetectorType, const int Detector , const int channel) { if(DetectorType == "X") return *(m_XChannelStatus[Detector-1].begin()+channel-1); @@ -551,8 +536,7 @@ bool TCATSPhysics :: IsValidChannel(const string DetectorType, const int Detecto /////////////////////////////////////////////////////////////////////////////////// -void TCATSPhysics::InitializeStandardParameter() -{ +void TCATSPhysics::InitializeStandardParameter(){ // Enable all channel and no inversion vector< bool > ChannelStatus; vector< int > InversionStatus; @@ -563,13 +547,11 @@ void TCATSPhysics::InitializeStandardParameter() ChannelStatus.resize(28,true); InversionStatus.resize(28); - for(unsigned int j = 0 ; j < InversionStatus.size() ; j++) - { + for(unsigned int j = 0 ; j < InversionStatus.size() ; j++){ InversionStatus[j] = j+1; } - for(int i = 0 ; i < m_NumberOfCATS ; ++i) - { + for(int i = 0 ; i < m_NumberOfCATS ; ++i) { m_XChannelStatus[i] = ChannelStatus; m_YChannelStatus[i] = ChannelStatus; m_CATSXInversion[i] = InversionStatus; @@ -580,8 +562,7 @@ void TCATSPhysics::InitializeStandardParameter() } /////////////////////////////////////////////////////////////////////////// -void TCATSPhysics::ReadAnalysisConfig() -{ +void TCATSPhysics::ReadAnalysisConfig(){ bool ReadingStatus = false; // path to file @@ -670,94 +651,23 @@ void TCATSPhysics::ReadAnalysisConfig() else if (whatToDo == "RECONSTRUCTION_METHOD") { AnalysisConfigFile >> DataBuffer; - cout << whatToDo << " " << DataBuffer; - if (DataBuffer.compare(0,6,"CATS1X") == 0) { - AnalysisConfigFile >> DataBuffer; - cout << " " << DataBuffer << endl; - m_reconstruction_CATS1X = DataBuffer; - } + cout << whatToDo << " " << DataBuffer ; + // DataBuffer is of form CATSNX + // Look for the CATS Number removing the first 4 letters and the trailling letter + string Duplicate = DataBuffer.substr(4); // Duplicate is of form NX + Duplicate.resize(Duplicate.size()-1); // Duplicate is of form + unsigned int CATSNumber = atoi(Duplicate.c_str()); - else if (DataBuffer.compare(0,6,"CATS1Y") == 0) { - AnalysisConfigFile >> DataBuffer; - cout << " " << DataBuffer << endl; - m_reconstruction_CATS1Y = DataBuffer; - } - - else if (DataBuffer.compare(0,6,"CATS2X") == 0) { - AnalysisConfigFile >> DataBuffer; - cout << " " << DataBuffer << endl; - m_reconstruction_CATS2X = DataBuffer; - } + // Look for the X or Y part of the Detector, Basically the last character + string XorY(string(1,DataBuffer[DataBuffer.size()-1])) ; - else if (DataBuffer.compare(0,6,"CATS2Y") == 0) { - AnalysisConfigFile >> DataBuffer; - cout << " " << DataBuffer << endl; - m_reconstruction_CATS2Y = DataBuffer; - } + // Get the Reconstruction Methods Name + AnalysisConfigFile >> DataBuffer; + cout << " " << DataBuffer << endl ; + // Set the Reconstruction Methods using above information + SetReconstructionMethod(CATSNumber,XorY,DataBuffer); } - else if (whatToDo == "CORRECTION_METHOD") { - AnalysisConfigFile >> DataBuffer; - cout << whatToDo << " " << DataBuffer; - if (DataBuffer.compare(0,6,"CATS1X") == 0) { - AnalysisConfigFile >> DataBuffer; - cout << " " << DataBuffer << endl; - m_correction_CATS1X = DataBuffer; - } - - else if (DataBuffer.compare(0,6,"CATS1Y") == 0) { - AnalysisConfigFile >> DataBuffer; - cout << " " << DataBuffer << endl; - m_correction_CATS1Y = DataBuffer; - } - - else if (DataBuffer.compare(0,6,"CATS2X") == 0) { - AnalysisConfigFile >> DataBuffer; - cout << " " << DataBuffer << endl; - m_correction_CATS2X = DataBuffer; - } - - else if (DataBuffer.compare(0,6,"CATS2Y") == 0) { - AnalysisConfigFile >> DataBuffer; - cout << " " << DataBuffer << endl; - m_correction_CATS2Y = DataBuffer; - } - } - /*else if (whatToDo == "CORRECTION_METHOD") { - AnalysisConfigFile >> DataBuffer; - cout << whatToDo << " " << DataBuffer << endl; - m_correction = DataBuffer; - }*/ - - else if (whatToDo == "CORRECTION_COEF") { - AnalysisConfigFile >> DataBuffer; - cout << whatToDo << " " << DataBuffer; - if (DataBuffer.compare(0,6,"CATS1X") == 0) { - AnalysisConfigFile >> DataBuffer; - cout << " " << DataBuffer << endl; - m_CorrectionCoef_CATS1X = atof(DataBuffer.c_str()); - } - - else if (DataBuffer.compare(0,6,"CATS1Y") == 0) { - AnalysisConfigFile >> DataBuffer; - cout << " " << DataBuffer << endl; - m_CorrectionCoef_CATS1Y = atof(DataBuffer.c_str()); - } - - else if (DataBuffer.compare(0,6,"CATS2X") == 0) { - AnalysisConfigFile >> DataBuffer; - cout << " " << DataBuffer << endl; - m_CorrectionCoef_CATS2X = atof(DataBuffer.c_str()); - } - - else if (DataBuffer.compare(0,6,"CATS2Y") == 0) { - AnalysisConfigFile >> DataBuffer; - cout << " " << DataBuffer << endl; - m_CorrectionCoef_CATS2Y = atof(DataBuffer.c_str()); - } - } - - else {ReadingStatus = false;} } @@ -783,20 +693,22 @@ void TCATSPhysics::ClearSpectra(){ // To be done } /////////////////////////////////////////////////////////////////////////// -map< vector<TString> , TH1*> TCATSPhysics::GetSpectra() { - return m_Spectra->GetMapHisto(); +map< vector<string> , TH1*> TCATSPhysics::GetSpectra() { + if(m_Spectra) + return m_Spectra->GetMapHisto(); + + else{ + map< vector<string> , TH1*> empty; + return empty; + } } ///////////////////////////////////////////////////////////////////// // Add Parameter to the CalibrationManger -void TCATSPhysics::AddParameterToCalibrationManager() -{ +void TCATSPhysics::AddParameterToCalibrationManager() { CalibrationManager* Cal = CalibrationManager::getInstance(); - for(int i = 0 ; i < m_NumberOfCATS ; i++) - { - - for( int j = 0 ; j < 28 ; j++) - { + for(int i = 0 ; i < m_NumberOfCATS ; i++){ + for( int j = 0 ; j < 28 ; j++){ Cal->AddParameter("CATS", "D"+itoa(i+1)+"_X"+itoa(j+1)+"_Q","CATS_D"+itoa(i+1)+"_X"+itoa(j+1)+"_Q") ; Cal->AddParameter("CATS", "D"+itoa(i+1)+"_Y"+itoa(j+1)+"_Q","CATS_D"+itoa(i+1)+"_Y"+itoa(j+1)+"_Q") ; Cal->AddParameter("CATS", "D"+itoa(i+1)+"_X"+itoa(j+1),"CATS_D"+itoa(i+1)+"_X"+itoa(j+1)) ; @@ -808,256 +720,112 @@ void TCATSPhysics::AddParameterToCalibrationManager() } //////////////////////////////////////////////////////////////// -double TCATSPhysics::AnalyseX(int ff) -{ - double CalculatedStripX=0; - - ReconstructionMethodX[ff] = ChooseReconstruction(ff,"X"); - - if(ReconstructionMethodX[ff] == SECHS)CalculatedStripX = HyperbolicSequentMethodX(); - if(ReconstructionMethodX[ff] == GAUSS)CalculatedStripX = GaussianMethodX(); - if(ReconstructionMethodX[ff] == BAR3) CalculatedStripX = Barycentric3MethodX(); - if(ReconstructionMethodX[ff] == BAR4) CalculatedStripX = Barycentric4MethodX(); - if(ReconstructionMethodX[ff] == BAR5) CalculatedStripX = Barycentric5MethodX(); - - return(CalculatedStripX); -} - -//////////////////////////////////////////////////////////////// -double TCATSPhysics::AnalyseY(int ff) -{ - double CalculatedStripY=0; - - ReconstructionMethodY[ff] = ChooseReconstruction(ff,"Y"); - - if(ReconstructionMethodY[ff] == SECHS)CalculatedStripY = HyperbolicSequentMethodY(); - if(ReconstructionMethodY[ff] == GAUSS)CalculatedStripY = GaussianMethodY(); - if(ReconstructionMethodY[ff] == BAR3) CalculatedStripY = Barycentric3MethodY(); - if(ReconstructionMethodY[ff] == BAR4) CalculatedStripY = Barycentric4MethodY(); - if(ReconstructionMethodY[ff] == BAR5) CalculatedStripY = Barycentric5MethodY(); - +void TCATSPhysics::SetReconstructionMethod(unsigned int CATSNumber, string XorY, string MethodName){ + if(XorY=="X"){ + if(ReconstructionFunctionX.size() < CATSNumber) + ReconstructionFunctionX.resize(CATSNumber); - return(CalculatedStripY); -} - -//////////////////////////////////////////////////////////////////////// -reconstruction TCATSPhysics::ChooseReconstruction(int ff, TString type) -{ - reconstruction method = NO; - if(ff==0){ - if(type=="X"){method = m_method_CATS1X;} - else if(type=="Y"){method = m_method_CATS1Y;} + if(MethodName=="ASECH") ReconstructionFunctionX[CATSNumber-1] = &(AnalyticHyperbolicSecant); + else if(MethodName=="FSECH") ReconstructionFunctionX[CATSNumber-1] = &(FittedHyperbolicSecant); + else if(MethodName=="AGAUSS") ReconstructionFunctionX[CATSNumber-1] = &(AnalyticGaussian); + else if(MethodName=="CENTROIDE") ReconstructionFunctionX[CATSNumber-1] = &(Centroide); } - if(ff==1){ - if(type=="X"){method = m_method_CATS2X;} - else if(type=="Y"){method = m_method_CATS2Y;} - } + if(XorY=="Y"){ + if(ReconstructionFunctionY.size() < CATSNumber) + ReconstructionFunctionY.resize(CATSNumber); - return(method); -} + if(MethodName=="ASECH") ReconstructionFunctionY[CATSNumber-1] = &(AnalyticHyperbolicSecant); + else if(MethodName=="FSECH") ReconstructionFunctionY[CATSNumber-1] = &(FittedHyperbolicSecant); + else if(MethodName=="AGAUSS") ReconstructionFunctionY[CATSNumber-1] = &(AnalyticGaussian); + else if(MethodName=="CENTROIDE") ReconstructionFunctionY[CATSNumber-1] = &(Centroide); + } -///////////////////////////////////////////////////////////////////////// -reconstruction TCATSPhysics::StringToEnum(string type) -{ - reconstruction method = NO; - if(type=="GAUSS"){method = GAUSS;} - if(type=="SECHS"){method = SECHS;} - if(type=="BAR3"){method = BAR3;} - if(type=="BAR4"){method = BAR4;} - if(type=="BAR5"){method = BAR5;} - - return(method); } -////////////////////////////////////////////////////////////////////// -double TCATSPhysics::CalculatePositionX(double CalculatedStripX, correction method) -{ - double positionX=-1000; - int IStripX = 0; - - if(ReconstructionMethodX[ff] == GAUSS){positionX = CalculatedStripX;} // already in mm -> see gaussian method - - else{ - IStripX = (int) CalculatedStripX ; - - // Decimal Part - double DStripX = CalculatedStripX-IStripX ; - - if( DStripX > 0.5) {IStripX++; DStripX = DStripX-1 ;} else {DStripX = DStripX;} - - // Calculate Geometrical Position - if(IStripX > 0 && IStripX < 29){ - if(ff==0){ //CATS1 - // Warning : DStrip sign has to be determined carefully depending on the X direction - - positionX = (DStripX)*2.54 + StripPositionX[ff][IStripX-1][0] ; //init avec le moins - - if(method == NOcor) positionX = positionX; - else if(method == cor){ - if(ReconstructionMethodX[ff] == BAR3) positionX = CorrectedPositionX3(positionX, 0.60); - if(ReconstructionMethodX[ff] == BAR4) positionX = CorrectedPositionX4(positionX, 0.77); - } - } - - else if(ff==1){ //CATS2 - // Warning : DStrip sign has to be determined carefully depending on the X direction - - positionX = -(DStripX)*2.54 + StripPositionX[ff][IStripX-1][0] ; - - if(method == NOcor) positionX = positionX; - else if(method == cor){ - if(ReconstructionMethodX[ff] == BAR3) positionX = CorrectedPositionX3(positionX, 0.30); - if(ReconstructionMethodX[ff] == BAR4) positionX = CorrectedPositionX4(positionX, 0.67); - } - } - else cout << "only 2CATS!! ff = " << ff << endl; - } - - else {positionX = -1000;} - } - +/////////////////////////////////////////////////////////////// +TVector3 TCATSPhysics::GetBeamDirection(){ + TVector3 Direction; + if(PositionX.size() <2)return Direction; - if(ff==0 && CalculatedStripX != -1000){ - if(m_correction_CATS1X == "Correction3Points"){ - positionX = Corrected3PointsX(positionX,m_CorrectionCoef_CATS1X); - } - if(m_correction_CATS1X == "Correction4Points"){ - positionX = Corrected4PointsX(positionX,m_CorrectionCoef_CATS1X); - } + if(DetMaxX[0]<DetMaxX[1]){ + Direction = TVector3 (PositionX[1]-PositionX[0] , + PositionY[1]-PositionY[0] , + PositionZ[1]-PositionZ[0] ); + Direction.Unit(); } - if(ff==1 && CalculatedStripX != -1000){ - if(m_correction_CATS2X == "Correction3Points"){ - positionX = Corrected3PointsX(positionX,m_CorrectionCoef_CATS2X); - } - if(m_correction_CATS2X == "Correction4Points"){ - positionX = Corrected4PointsX(positionX,m_CorrectionCoef_CATS2X); - } + else{ + Direction = TVector3 (PositionX[0]-PositionX[1] , + PositionY[0]-PositionY[1] , + PositionZ[0]-PositionZ[1] ); + Direction.Unit(); } - - return positionX; + return(Direction) ; } -///////////////////////////////////////////////////////////////////////// -double TCATSPhysics::CalculatePositionY(double CalculatedStripY, correction method) -{ - double positionY = -1000; - - if(ReconstructionMethodY[ff] == GAUSS){positionY = CalculatedStripY;} // already in mm -> see gaussian method - - else{ - // Integer part - int IStripY = (int) CalculatedStripY ; +/////////////////////////////////////////////////////////////// +TVector3 TCATSPhysics::GetPositionOnTarget(){ + double Pi = 3.14159265; + TVector3 Position = TVector3 (GetPositionOnTargetX() , + GetPositionOnTargetY() , + GetPositionOnTargetX()*tan(m_TargetAngle*Pi/180)); + return(Position) ; +} - // Decimal Part - double DStripY = CalculatedStripY-IStripY ; +//////////////////////////////////////////////////////////////////////// +namespace CATS_LOCAL{ + //////////////////////////////////////////////////////////////////// + double AnalyticGaussian(vector<double>& Buffer_Q,int& StripMax){ + double gauss = -1000; + double Q[3]; + double StripPos[3]; + for(int j = 0; j<3 ; j++){ + Q[j] = 0; + StripPos[j] = 0; + } - if(DStripY > 0.5) {IStripY++; DStripY = DStripY-1;} - else {DStripY = DStripY; } + if(StripMax> 3 && StripMax< 26){ + // central value taken using the Strip with Max charge + Q[0] = Buffer_Q[StripMax-1] ; - // Calculate Geometrical Position - if(IStripY > 0 && IStripY < 29 ){ - positionY = (DStripY)*2.54 + StripPositionY[ff][0][IStripY-1] ; // conversion en mm initiale - if(ff ==0){ - if(method == NOcor) positionY = positionY; - else if(method == cor) { - if(ReconstructionMethodY[ff] == BAR3) positionY = CorrectedPositionY3(positionY, 0.6); - if(ReconstructionMethodY[ff] == BAR4) positionY = CorrectedPositionY4(positionY, 0.75); - } + // Look at the next strip on the left + if(Buffer_Q[StripMax-2]!=-1){ + Q[1] = Buffer_Q[StripMax-2]; + StripPos[1] = StripMax-2; } - else if(ff ==1){ - if(method == NOcor) positionY = positionY; - else if(method == cor){ - if(ReconstructionMethodY[ff] == BAR3) positionY = CorrectedPositionY3(positionY, 0.45); - if(ReconstructionMethodY[ff] == BAR4) positionY = CorrectedPositionY4(positionY, 0.7); - } + // Look at the next next strip on the left + else if(Buffer_Q[StripMax-3]!=-1){ + Q[1] = Buffer_Q[StripMax-3]; + StripPos[1] = StripMax-3; } - else cout << "only 2CATS!! ff = " << ff << endl; - } - - else {positionY = -1000;} - } - - - if(ff==0 && CalculatedStripY != -1000){ - if(m_correction_CATS1Y == "Correction3Points"){ - positionY = Corrected3PointsY(positionY,m_CorrectionCoef_CATS1Y); - } - if(m_correction_CATS1Y == "Correction4Points"){ - positionY = Corrected4PointsY(positionY,m_CorrectionCoef_CATS1Y); - } - } - - if(ff==1 && CalculatedStripY != -1000){ - if(m_correction_CATS2Y == "Correction3Points"){ - positionY = Corrected3PointsY(positionY,m_CorrectionCoef_CATS2Y); - } - if(m_correction_CATS2Y == "Correction4Points"){ - positionY = Corrected4PointsY(positionY,m_CorrectionCoef_CATS2Y); - } - } - - return positionY; - -} - -//////////////////////////////////////////////////////////////////// -double TCATSPhysics:: GaussianMethodX() -{ - int StripMax = StripMaxX[ff]; - double gauss = -1000; - double Q[3]; - double StripPos[3]; - - for(int j = 0; j<3 ; j++) - { - Q[j] = 0; - StripPos[j] = 0; - } - - - if(StripMaxX[ff]> 3 && StripMaxX[ff]< 26) - { - Q[0] = Buffer_X_Q[StripMax-1][ff] ; - StripPos[0] = StripPositionX[ff][StripMax-1][0]; - - if(Buffer_X_Q[StripMax-2][ff]!=-1){ - Q[1] = Buffer_X_Q[StripMax-2][ff]; - StripPos[1] = StripPositionX[ff][StripMax-2][0]; - } + // Look at the next next next strip on the left + else if(Buffer_Q[StripMax-4]!=-1){ + Q[1] = Buffer_Q[StripMax-4]; + StripPos[1] = StripMax-4; + } - else { - if(Buffer_X_Q[StripMax-3][ff]!=-1){ - Q[1] = Buffer_X_Q[StripMax-3][ff]; - StripPos[1] = StripPositionX[ff][StripMax-3][0]; + // Look at the next strip on the right + if(Buffer_Q[StripMax]!=-1){ + Q[2] = Buffer_Q[StripMax]; + StripPos[2] = StripMax; } - else { - if(Buffer_X_Q[StripMax-4][ff]!=-1){ - Q[1] = Buffer_X_Q[StripMax-4][ff]; - StripPos[1] = StripPositionX[ff][StripMax-4][0]; - } - } - } - if(Buffer_X_Q[StripMax][ff]!=-1){ - Q[2] = Buffer_X_Q[StripMax][ff]; - StripPos[2] = StripPositionX[ff][StripMax][0]; - } - else { - if(Buffer_X_Q[StripMax+1][ff]!=-1){ - Q[2] = Buffer_X_Q[StripMax+1][ff]; - StripPos[2] = StripPositionX[ff][StripMax+1][0]; + // Look at the next next strip on the right + else if(Buffer_Q[StripMax+1]!=-1){ + Q[2] = Buffer_Q[StripMax+1]; + StripPos[2] = StripMax+1; } - else { - if(Buffer_X_Q[StripMax+2][ff]!=-1){ - Q[2] = Buffer_X_Q[StripMax+2][ff]; - StripPos[2] = StripPositionX[ff][StripMax+2][0]; - } + + // Look at the next next next strip on the right + else if(Buffer_Q[StripMax+2]!=-1){ + Q[2] = Buffer_Q[StripMax+2]; + StripPos[2] = StripMax+2; } + } double Q0_Q1 = log(Q[0]/Q[1]); @@ -1065,568 +833,115 @@ double TCATSPhysics:: GaussianMethodX() double num = Q0_Q1 * (StripPos[2]*StripPos[2] - StripPos[0]*StripPos[0]) - Q0_Q2 * (StripPos[1]*StripPos[1] - StripPos[0]*StripPos[0]) ; double denom = Q0_Q1 * (StripPos[2] - StripPos[0]) - Q0_Q2 * (StripPos[1] - StripPos[0]) ; - if(denom != 0){ - gauss = 0.5*num / denom; - } - else{gauss = -1000;} - - } - - else { - gauss = -1000; - } - - return gauss; - -} - -///////////////////////////////////////////////////////////////////////// -double TCATSPhysics::Corrected3PointsX(double Position, double c) -{ - double Corrected_Position = 0; - int StripMax_ = StripMaxX[ff] -1; - double xmax = StripPositionX[ff][StripMax_][0] ; - - Corrected_Position = (Position - xmax) / c + xmax; - - return Corrected_Position; -} - -///////////////////////////////////////////////////////////////////////// -double TCATSPhysics::Corrected4PointsX(double Position, double d) -{ - double Corrected_Position = 0; - double xmax = 0; - int StripMax_ = StripMaxX[ff] -1; - - if(Buffer_X_Q[StripMax_+1][ff] > Buffer_X_Q[StripMax_-1][ff]) { - if(ff==0) xmax = StripPositionX[ff][StripMax_][0] - 1.27; - else xmax = StripPositionX[ff][StripMax_][0] + 1.27; - } - - else{ - if(ff==0) xmax = StripPositionX[ff][StripMax_-1][0] - 1.27; - else xmax = StripPositionX[ff][StripMax_-1][0] + 1.27; - } - - Corrected_Position = (Position - xmax) / d + xmax; - - return Corrected_Position; -} - -//////////////////////////////////////////////////////////////////////////// -double TCATSPhysics:: GaussianMethodY() -{ - double Q[3]; - double StripPos[3]; - double Q0_Q1, Q0_Q2; - double num, denom; - - for(int j = 0; j<3 ; j++) - { - Q[j] = 0; - StripPos[j] = 0; - } - - int StripMax = StripMaxY[ff]; - - double gauss = -1000; - if(StripMaxY[ff] > 2 && StripMaxY[ff]<27) - { - Q[0] = Buffer_Y_Q[StripMax-1][ff] ; - StripPos[0] = StripPositionY[ff][0][StripMax-1]; - - if(Buffer_Y_Q[StripMax-2][ff]!=-1){ - Q[1] = Buffer_Y_Q[StripMax-2][ff]; - StripPos[1] = StripPositionY[ff][0][StripMax-2]; - } - - else { - if(Buffer_Y_Q[StripMax-3][ff]!=-1){ - Q[1] = Buffer_Y_Q[StripMax-3][ff]; - StripPos[1] = StripPositionY[ff][0][StripMax-3] ; - } - else { - if(Buffer_Y_Q[StripMax-4][ff]!=-1){ - Q[1] = Buffer_Y_Q[StripMax-4][ff]; - StripPos[1] = StripPositionY[ff][0][StripMax-4] ; - } - } - } - - if(Buffer_Y_Q[StripMax][ff]!=-1){ - Q[2] = Buffer_Y_Q[StripMax][ff]; - StripPos[2] = StripPositionY[ff][0][StripMax]; - } - - else { - if(Buffer_Y_Q[StripMax+1][ff]!=-1){ - Q[2] = Buffer_Y_Q[StripMax+1][ff]; - StripPos[2] = StripPositionY[ff][0][StripMax+1] ; - } - - else { - if(Buffer_Y_Q[StripMax+2][ff]!=-1){ - Q[2] = Buffer_Y_Q[StripMax+2][ff]; - StripPos[2] = StripPositionY[ff][0][StripMax+2] ; - } - } - } - - - - Q0_Q1 = log(Q[0]/Q[1]); - Q0_Q2 = log(Q[0]/Q[2]); - - num = Q0_Q1 * (StripPos[2]*StripPos[2] - StripPos[0]*StripPos[0]) - Q0_Q2 * (StripPos[1]*StripPos[1] - StripPos[0]*StripPos[0]) ; - denom = Q0_Q1 * (StripPos[2] - StripPos[0]) - Q0_Q2 * (StripPos[1] - StripPos[0]) ; if(denom != 0){ gauss = 0.5*num / denom; } - } - - else { - gauss = -1000; - } - - return gauss; - -} - -///////////////////////////////////////////////////////////////////////// -double TCATSPhysics::Corrected3PointsY(double Position, double c) -{ - double Corrected_Position = 0; - int StripMax_ = StripMaxY[ff] -1; - double ymax = StripPositionY[ff][0][StripMax_] ; - - Corrected_Position = (Position - ymax) / c + ymax; - - return Corrected_Position; -} - -///////////////////////////////////////////////////////////////////////// -double TCATSPhysics::Corrected4PointsY(double Position, double d) -{ - double Corrected_Position = 0; - double ymax = 0; - int StripMax_ = StripMaxY[ff] -1; - - if(Buffer_Y_Q[StripMax_+1][ff] > Buffer_Y_Q[StripMax_-1][ff]) { - ymax = StripPositionY[ff][0][StripMax_] + 1.27 ; - } - - else{ - ymax = StripPositionY[ff][0][StripMax_-1] + 1.27; - } - - Corrected_Position = (Position - ymax) / d + ymax; - - return Corrected_Position; -} - -/////////////////////////////////////////////////////////////// -double TCATSPhysics:: Barycentric5MethodX() -{ - double Barycenter = 0 ; - - if(StripMaxX[ff] > 2 && StripMaxX[ff] < 27) - { - int StripMax_ = StripMaxX[ff] -1 ; - double NumberOfPoint = 0 ; - double ChargeTotal =0; - - - for(int i = -2 ; i < 3 ; i++) - { - if(Buffer_X_Q[StripMax_+i][ff]!=-1) - { - Barycenter += (StripMaxX[ff]+i)*Buffer_X_Q[StripMax_+i][ff] ; - NumberOfPoint++; - ChargeTotal+=Buffer_X_Q[StripMax_+i][ff]; - } + else{ + gauss = -1000; } - if(ChargeTotal>0) Barycenter = Barycenter / ChargeTotal ; - else {Barycenter = -1000 ; } + return gauss; } - else - { - Barycenter = -1000 ; - } - return Barycenter ; -} + /////////////////////////////////////////////////////////////// + double Centroide(vector<double>& Buffer_Q, int& StripMax){ + double Centroide = 0 ; + double ChargeTotal = 0; -/////////////////////////////////////////////////////////////// -double TCATSPhysics:: Barycentric5MethodY() -{ - double Barycenter = 0 ; - - if(StripMaxY[ff] > 2 && StripMaxY[ff] < 27) - { - int StripMax_ = StripMaxY[ff] -1 ; - double NumberOfPoint = 0 ; - double ChargeTotal =0; - - - for(int i = -2 ; i < 3 ; i++) - { - if(Buffer_Y_Q[StripMax_+i][ff]!=-1) - { - Barycenter += (StripMaxY[ff]+i)*Buffer_Y_Q[StripMax_+i][ff] ; - NumberOfPoint++; - ChargeTotal+=Buffer_Y_Q[StripMax_+i][ff]; + unsigned int sizeQ = Buffer_Q.size(); + for(unsigned int i = 0 ; i < sizeQ ; i++){ + if(Buffer_Q[i]>0){ + Centroide += (i)*Buffer_Q[i-1] ; + ChargeTotal+=Buffer_Q[i-1]; } } - if(ChargeTotal>0) Barycenter = Barycenter / ChargeTotal ; - else {Barycenter = -1000 ; } // cout << "Yo" << endl ;} - -} -else -{ - Barycenter = -1000 ; -} - -return Barycenter ; -} - -/////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////// -double TCATSPhysics:: Barycentric3MethodX() -{ - double Barycenter = 0 ; + if(ChargeTotal>0) Centroide = Centroide / ChargeTotal ; - if(StripMaxX[ff] > 2 && StripMaxX[ff] < 27) - { - int StripMax_ = StripMaxX[ff] -1; - double NumberOfPoint = 0 ; - double ChargeTotal =0; - - for(int i = -1 ; i < 2 ; i++) - { - if(Buffer_X_Q[StripMax_+i][ff]!=-1) // Charge initialized to -1 - { - Barycenter += (StripMaxX[ff]+i)*Buffer_X_Q[StripMax_+i][ff] ; - NumberOfPoint++; - ChargeTotal+=Buffer_X_Q[StripMax_+i][ff]; - } - } - - if(ChargeTotal>0) Barycenter = Barycenter / ChargeTotal ; - else {Barycenter = -1000 ;} // cout << "Yo" << endl ;} -} - - -else -{ - Barycenter = -1000 ; -} - -return Barycenter ; -} - -/////////////////////////////////////////////////////////////// -double TCATSPhysics:: Barycentric3MethodY() -{ - double Barycenter = 0 ; - - if(StripMaxY[ff] > 2 && StripMaxY[ff] < 27) - { - int StripMax_ = StripMaxY[ff] -1 ; // Use because numerotation of array start at 0 ; - double NumberOfPoint = 0 ; - double ChargeTotal =0; - - for(int i = -1 ; i < 2 ; i++) - { - if(Buffer_Y_Q[StripMax_+i][ff]!=-1) // Charge initialized to -1 - { - Barycenter += (StripMaxY[ff]+i)*Buffer_Y_Q[StripMax_+i][ff] ; - NumberOfPoint++; - ChargeTotal+=Buffer_Y_Q[StripMax_+i][ff]; - } - } + else { + Centroide = -1000 ; + } - if(ChargeTotal>0) Barycenter = Barycenter / ChargeTotal ; - else {Barycenter = -1000 ;} // cout << "Yo" << endl ;} -} + return Centroide ; + } -else -{ - Barycenter = -1000 ; - // cout << "Strip max " << StripMax << endl; -} + ///////////////////////////////////////////////////////////////////// + double AnalyticHyperbolicSecant(vector<double>& Buffer_Q, int& StripMax){ + double sech = -1000 ; -return Barycenter ; -} + if(StripMax > 2 && StripMax<27){ + if(Buffer_Q[StripMax-1+1]==0||Buffer_Q[StripMax-1-1]==0) + return sech; -/////////////////////////////////////////////////////////////// -double TCATSPhysics:: Barycentric4MethodX() -{ - double Barycenter = 0 ; + double vs1 = sqrt( Buffer_Q[StripMax-1]/Buffer_Q[StripMax-1+1] ); + double vs2 = sqrt( Buffer_Q[StripMax-1]/Buffer_Q[StripMax-1-1] ); + double vs3 = 0.5*( vs1 + vs2 ); + double vs4 = log( vs3 + sqrt(vs3*vs3-1.0) ); + double vs5 = (vs1 - vs2)/(2.0*sinh(vs4)); - if(StripMaxX[ff] > 2 && StripMaxX[ff] < 27) { + if(vs5<0) + vs5=-vs5 ; - int StripMax_ = StripMaxX[ff] -1 ; // Use because numerotation of array start at 0 ; - double NumberOfPoint = 0 ; - double ChargeTotal =0; + double vs6 = 0.5*log( (1.0+vs5)/(1.0-vs5) ) ; - if(Buffer_X_Q[StripMax_+1][ff] > Buffer_X_Q[StripMax_-1][ff]) { + if ( Buffer_Q[StripMax-1+1]>Buffer_Q[StripMax-1-1] ) + sech = StripMax + vs6/vs4 ; - // cout << "Barycentre droit" << endl; - for(int i = -1 ; i < 3 ; i++) - { - if(Buffer_X_Q[StripMax_+i][ff]!=-1) { // Charge initialized to -1 - Barycenter += (StripMaxX[ff]+i)*Buffer_X_Q[StripMax_+i][ff] ; - NumberOfPoint++; - ChargeTotal+=Buffer_X_Q[StripMax_+i][ff]; - } - } - } - else { - // cout << "Barycentre gauche" << endl; - for(int i = -2 ; i < 2 ; i++) - { - if(Buffer_X_Q[StripMax_+i][ff]!=-1) { // Charge initialized to -1 - Barycenter += (StripMaxX[ff]+i)*Buffer_X_Q[StripMax_+i][ff] ; - NumberOfPoint++; - ChargeTotal+=Buffer_X_Q[StripMax_+i][ff]; - } - } - } + else + sech = StripMax - vs6/vs4 ; - if(ChargeTotal>0) { - Barycenter = Barycenter / ChargeTotal ; } + return sech ; } - else - { - Barycenter = -1000 ; - // cout << "Strip max " << StripMax << endl; - } + ///////////////////////////////////////////////////////////////////// + double FittedHyperbolicSecant(vector<double>& Buffer_Q, int& StripMax){ + // Warning: should not delete static variable + static TF1* f = new TF1("sechs","[0]/(cosh(TMath::Pi()*(x-[1])/[2])*cosh(TMath::Pi()*(x-[1])/[2]))",1,28); - return Barycenter ; -} + // Help the fit by computing the position of the maximum by analytic method + double StartingPoint = AnalyticHyperbolicSecant(Buffer_Q,StripMax); + // if analytic method fails then the starting point in strip max + if(StartingPoint==-1000) StartingPoint = StripMax; -/////////////////////////////////////////////////////////////// -double TCATSPhysics:: Barycentric4MethodY() -{ - double Barycenter = 0 ; - - if(StripMaxY[ff] > 2 && StripMaxY[ff] < 27) { - - int StripMax_ = StripMaxY[ff] -1 ; // Use because numerotation of array start at 0 ; - double NumberOfPoint = 0 ; - double ChargeTotal =0; - - if(Buffer_Y_Q[StripMax_+1][ff] > Buffer_Y_Q[StripMax_-1][ff]) { + // Maximum is close to charge max, Mean value is close to Analytic one, typical width is 3.8 strip + f->SetParameters(Buffer_Q[StripMax-1],StartingPoint,3.8); - // cout << "Barycentre droit" << endl; - for(int i = -1 ; i < 3 ; i++) - { - if(Buffer_Y_Q[StripMax_+i][ff]!=-1) { // Charge initialized to -1 - Barycenter += (StripMaxY[ff]+i)*Buffer_Y_Q[StripMax_+i][ff] ; - NumberOfPoint++; - ChargeTotal+=Buffer_Y_Q[StripMax_+i][ff]; - } - } - } + static vector<double> y ; + static vector<double> q ; + y.clear(); q.clear(); + double final_size = 0 ; + unsigned int sizeQ = Buffer_Q.size(); - else { - // cout << "Barycentre gauche" << endl; - for(int i = -2 ; i < 2 ; i++) - { - if(Buffer_Y_Q[StripMax_+i][ff]!=-1) { // Charge initialized to -1 - Barycenter += (StripMaxY[ff]+i)*Buffer_Y_Q[StripMax_+i][ff] ; - NumberOfPoint++; - ChargeTotal+=Buffer_Y_Q[StripMax_+i][ff]; - } + for(unsigned int i = 0 ; i < sizeQ ; i++){ + if(Buffer_Q[i] > Buffer_Q[StripMax-1]*0.2){ + q.push_back(Buffer_Q[i]); + y.push_back(i+1); + final_size++; } } - if(ChargeTotal>0) { - Barycenter = Barycenter / ChargeTotal ; + // requiered at least 3 point to perfom a fit + if(final_size<3){ + return -1000 ; } + TGraph* g = new TGraph(q.size(),&y[0],&q[0]); + g->Fit(f,"QN0"); + delete g; + return f->GetParameter(1) ; } - else - { - Barycenter = -1000 ; - // cout << "Strip max " << StripMax << endl; - } - - return Barycenter ; -} - -///////////////////////////////////////////////////////////////////// -double TCATSPhysics:: HyperbolicSequentMethodX() -{ - double sechs = -1000 ; - - if(StripMaxX[ff] > 2 && StripMaxX[ff]<27) - { - double vs1 = sqrt( Buffer_X_Q[StripMaxX[ff]-1][ff]/Buffer_X_Q[StripMaxX[ff]-1+1][ff] ) ; - double vs2 = sqrt( Buffer_X_Q[StripMaxX[ff]-1][ff]/Buffer_X_Q[StripMaxX[ff]-1-1][ff] ) ; - double vs3 = 0.5*( vs1 + vs2 ) ; - double vs4 = log( vs3 + sqrt(vs3*vs3-1.0) ) ; - double vs5 = (vs1 - vs2)/(2.0*sinh(vs4)) ; - - if(vs5<0) vs5=-vs5 ; - - double vs6 = 0.5*log( (1.0+vs5)/(1.0-vs5) ) ; - - if ( Buffer_X_Q[StripMaxX[ff]-1+1][ff]>Buffer_X_Q[StripMaxX[ff]-1-1][ff] ) - { sechs = StripMaxX[ff] + vs6/vs4 ;} - - else - { sechs = StripMaxX[ff] - vs6/vs4 ;} - - } - - else { - sechs = -1000; - } - - return sechs ; -} - -////////////////////////////////////////////////////////////////// -double TCATSPhysics:: HyperbolicSequentMethodY() -{ - double sechs = -1000 ; - - if(StripMaxY[ff] > 2 && StripMaxY[ff]<27) - { - double vs1 = sqrt( Buffer_Y_Q[StripMaxY[ff]-1][ff]/Buffer_Y_Q[StripMaxY[ff]-1+1][ff] ) ; - double vs2 = sqrt( Buffer_Y_Q[StripMaxY[ff]-1][ff]/Buffer_Y_Q[StripMaxY[ff]-1-1][ff] ) ; - double vs3 = 0.5*( vs1 + vs2 ) ; - double vs4 = log( vs3 + sqrt(vs3*vs3-1.0) ) ; - double vs5 = (vs1 - vs2)/(2.0*sinh(vs4)) ; - - if(vs5<0) vs5=-vs5 ; - - double vs6 = 0.5*log( (1.0+vs5)/(1.0-vs5) ) ; - - if ( Buffer_Y_Q[StripMaxY[ff]-1+1][ff]>Buffer_Y_Q[StripMaxY[ff]-1-1][ff] ) - { sechs = StripMaxY[ff] + vs6/vs4 ;} - - else - { sechs = StripMaxY[ff] - vs6/vs4 ;} - - } - - else { - sechs = -1000; - } - - return sechs ; -} - - - -/////////////////////////////////////////////////////////////// -double TCATSPhysics::CorrectedPositionX3(double Position, double a) -{ - double Corrected_Position = 0; - int StripMax_ = StripMaxX[ff] -1; - double xmax = StripPositionX[ff][StripMax_][0] ; - - Corrected_Position = (Position - xmax) / a + xmax; - - return Corrected_Position; -} - -/////////////////////////////////////////////////////////////// -double TCATSPhysics::CorrectedPositionY3(double Position, double a) -{ - double Corrected_Position = 0; - int StripMax_ = StripMaxY[ff] -1; - double xmax = StripPositionY[ff][0][StripMax_]; - - Corrected_Position = (Position - xmax) / a + xmax; - - return Corrected_Position; -} - -/////////////////////////////////////////////////////////////// -double TCATSPhysics::CorrectedPositionX4(double Position, double b) -{ - double Corrected_Position = 0; - double xmax = 0; - int StripMax_ = StripMaxX[ff] -1; - - if(Buffer_X_Q[StripMax_+1][ff] > Buffer_X_Q[StripMax_-1][ff]) { - if(ff ==0) xmax = StripPositionX[ff][StripMax_][0] - 1.27; - else xmax = StripPositionX[ff][StripMax_][0] + 1.27; - } - - else{ - if(ff ==0) xmax = StripPositionX[ff][StripMax_-1][0] - 1.27; - else xmax = StripPositionX[ff][StripMax_-1][0] + 1.27; - } - - Corrected_Position = (Position - xmax) / b + xmax; - - return Corrected_Position; -} - -/////////////////////////////////////////////////////////////// -double TCATSPhysics::CorrectedPositionY4(double Position, double b) -{ - double Corrected_Position = 0; - double xmax = 0; - int StripMax_ = StripMaxY[ff] -1; - - if(Buffer_Y_Q[StripMax_+1][ff] > Buffer_Y_Q[StripMax_-1][ff]) { - xmax = StripPositionY[ff][0][StripMax_] + 1.27 ; - } - - else{ - xmax = StripPositionY[ff][0][StripMax_-1] + 1.27; - } - Corrected_Position = (Position - xmax) / b + xmax; - return Corrected_Position; -} - - -/////////////////////////////////////////////////////////////// -TVector3 TCATSPhysics::GetBeamDirection() -{ - TVector3 Position = TVector3 (PositionX[1]-PositionX[0] , - PositionY[1]-PositionY[0] , - PositionZ[1]-PositionZ[0] ); - Position.Unit(); - return(Position) ; -} - -/////////////////////////////////////////////////////////////// -TVector3 TCATSPhysics::GetPositionOnTarget() -{ - double Pi = 3.14159265; - TVector3 Position = TVector3 (GetPositionOnTargetX() , - GetPositionOnTargetY() , - GetPositionOnTargetX()*tan(m_TargetAngle*Pi/180)); - Position.Unit(); - return(Position) ; -} - -//////////////////////////////////////////////////////////////////////// -namespace LOCAL_CATS -{ + //////////////////////////////////////////////////////////////////////// // transform an integer to a string - string itoa(int value) - { + string itoa(int value){ std::ostringstream o; if (!(o << value)) @@ -1634,50 +949,33 @@ namespace LOCAL_CATS return o.str(); } - - double fCATS_X_Q(const TCATSData* m_EventData , const int i) - { + //////////////////////////////////////////////////////////////////////// + double fCATS_X_Q(const TCATSData* m_EventData , const int i){ return CalibrationManager::getInstance()->ApplyCalibration( "CATS/D" + itoa( m_EventData->GetCATSDetX(i) ) + "_X" + itoa( m_EventData->GetCATSStripX(i) ) + "_Q", m_EventData->GetCATSChargeX(i) + gRandom->Rndm() - fCATS_Ped_X(m_EventData, i) ); } - - double fCATS_Y_Q(const TCATSData* m_EventData , const int i) - { + //////////////////////////////////////////////////////////////////////// + double fCATS_Y_Q(const TCATSData* m_EventData , const int i){ return CalibrationManager::getInstance()->ApplyCalibration( "CATS/D" + itoa( m_EventData->GetCATSDetY(i) ) + "_Y" + itoa( m_EventData->GetCATSStripY(i) ) + "_Q", m_EventData->GetCATSChargeY(i) + gRandom->Rndm() - fCATS_Ped_Y(m_EventData, i) ); } - - bool fCATS_Threshold_X(const TCATSData* m_EventData , const int i) - { + //////////////////////////////////////////////////////////////////////// + bool fCATS_Threshold_X(const TCATSData* m_EventData , const int i){ return CalibrationManager::getInstance()->ApplyThreshold( "CATS/D" + itoa( m_EventData->GetCATSDetX(i) ) + "_X" + itoa( m_EventData->GetCATSStripX(i) ), m_EventData->GetCATSChargeX(i)); } - - bool fCATS_Threshold_Y(const TCATSData* m_EventData , const int i) - { + //////////////////////////////////////////////////////////////////////// + bool fCATS_Threshold_Y(const TCATSData* m_EventData , const int i){ return CalibrationManager::getInstance()->ApplyThreshold( "CATS/D" + itoa( m_EventData->GetCATSDetY(i) ) + "_Y" + itoa( m_EventData->GetCATSStripY(i) ), m_EventData->GetCATSChargeY(i)); } - - double fCATS_Ped_X(const TCATSData* m_EventData, const int i) - { + //////////////////////////////////////////////////////////////////////// + double fCATS_Ped_X(const TCATSData* m_EventData, const int i){ return CalibrationManager::getInstance()->GetPedestal( "CATS/D" + itoa( m_EventData->GetCATSDetX(i) ) + "_X" + itoa( m_EventData->GetCATSStripX(i) ) ); } - - double fCATS_Ped_Y(const TCATSData* m_EventData, const int i) - { + //////////////////////////////////////////////////////////////////////// + double fCATS_Ped_Y(const TCATSData* m_EventData, const int i){ return CalibrationManager::getInstance()->GetPedestal( "CATS/D" + itoa( m_EventData->GetCATSDetY(i) ) + "_Y" + itoa( m_EventData->GetCATSStripY(i) ) ); } - - } - - - - - - - - - diff --git a/NPLib/CATS/TCATSPhysics.h b/NPLib/CATS/TCATSPhysics.h index a94109f9b17d01e83ce8a0ebe7e3fcf125e7a67d..ed6339dfec2e5aed9008ae7bea8dcc183b1c1e77 100644 --- a/NPLib/CATS/TCATSPhysics.h +++ b/NPLib/CATS/TCATSPhysics.h @@ -42,224 +42,172 @@ // forward declaration class TCATSSpectra; - - - using namespace std ; -enum reconstruction{NO,SECHS,GAUSS,BAR3,BAR4,BAR5}; -enum correction{NOcor,cor}; class TCATSPhysics : public TObject, public NPA::VDetector { + + public: // Constructor and Destructor + TCATSPhysics(); + ~TCATSPhysics(); + + private: // Root Input and Output tree classes + + TCATSData* m_EventData;//! + TCATSData* m_PreTreatedData;//! + TCATSPhysics* m_EventPhysics;//! + + public : + // Vector of dim = multiplicity of event on all detector + vector<int> DetNumberX; + vector<int> StripX; + vector<double> ChargeX; + + // Vector of dim = number of CATS + vector<int> StripMaxX; + vector<double> ChargeMaxX; + vector<int> DetMaxX; + + // Vector of dim = multiplicity of event on all detector + vector<int> DetNumberY; + vector<int> StripY; + vector<double> ChargeY; + + // Vector of dim = number of CATS + vector<int> StripMaxY; + vector<double> ChargeMaxY; + vector<int> DetMaxY; + + // Vector of dim = number of CATS + vector<double> PositionX; + vector<double> PositionY; + vector<double> StripNumberX; + vector<double> StripNumberY; + vector<double> PositionZ; + vector<double> QsumX; + vector<double> QsumY; + double PositionOnTargetX; + double PositionOnTargetY; + + TVector3 BeamDirection;//! + + // Vector of Charge Array (one for each CATS fired) + vector< vector<double> > Buffer_X_Q;//! + vector< vector<double> > Buffer_Y_Q;//! + + private : + vector< vector< vector<double> > > StripPositionX;//! + vector< vector< vector<double> > > StripPositionY;//! + vector<double> StripPositionZ;//! + int m_NumberOfCATS; + double m_TargetAngle; //! + double m_TargetThickness; //! + + // Those two vector contain a pointer to the reconstruction function that should be used for each detector + // Method take as argument a vector<double> representing the Charge distribution and uint giving the Strip with Max Q + // It returns a double, corresponding to the position in Strip unit + // Methods are declared in the CATS namespace outside the class + // CINT can't handle such complex vector, so the ifndef part is there to hide it away + #ifndef __CINT__ + vector<double(*)(vector<double>&,int&)> ReconstructionFunctionX;//! + vector<double(*)(vector<double>&,int&)> ReconstructionFunctionY;//! + #endif /* __CINT __ */ - public: // Constructor and Destructor - TCATSPhysics(); - ~TCATSPhysics(); - - private: // Root Input and Output tree classes - - TCATSData* m_EventData;//! - TCATSData* m_PreTreatedData;//! - TCATSPhysics* m_EventPhysics;//! - - public : - // marker of the cats used - int ff ; - - // Vector of dim = multiplicity of event on all detector - vector<int> DetNumberX; - vector<int> StripX; - vector<double> ChargeX; - - // Vector of dim = number of CATS - vector<int> StripMaxX; - - - // Vector of dim = multiplicity of event on all detector - vector<int> DetNumberY; - vector<int> StripY; - vector<double> ChargeY; - - // Vector of dim = number of CATS - vector<int> StripMaxY; - - // Vector of dim = number of CATS - vector<int> DetNumberX_Position; - vector<int> DetNumberY_Position; - vector<int> DetNumberZ_Position; - vector<double> PositionX; - vector<double> PositionY; - vector<double> PositionZ; - vector<double> QsumX; - vector<double> QsumY; - double PositionOnTargetX; - double PositionOnTargetY; - - TVector3 BeamDirection ; //! - - double Buffer_X_Q[NBSTRIPS][NBDETECTOR];//! - double Buffer_Y_Q[NBSTRIPS][NBDETECTOR];//! - - int HitX; //! - int HitY; //! - - vector<reconstruction> ReconstructionMethodX; - vector<reconstruction> ReconstructionMethodY; - - - private : - vector< vector< vector<double> > > StripPositionX;//! - vector< vector< vector<double> > > StripPositionY;//! - vector<double> StripPositionZ;//! - int m_NumberOfCATS; - double m_TargetAngle; - double m_TargetThickness; - double m_CorrectionCoef_CATS1X;//! - double m_CorrectionCoef_CATS1Y;//! - double m_CorrectionCoef_CATS2X;//! - double m_CorrectionCoef_CATS2Y;//! - - - string m_correction_CATS1X;//! - string m_correction_CATS1Y;//! - string m_correction_CATS2X;//! - string m_correction_CATS2Y;//! - - string m_reconstruction_CATS1X;//! - string m_reconstruction_CATS1Y;//! - string m_reconstruction_CATS2X;//! - string m_reconstruction_CATS2Y;//! - reconstruction m_method_CATS1X;//! - reconstruction m_method_CATS1Y;//! - reconstruction m_method_CATS2X;//! - reconstruction m_method_CATS2Y;//! - - private : - // Map of activated channel - map< int, vector<bool> > m_XChannelStatus;//! - map< int, vector<bool> > m_YChannelStatus;//! - // Map of inverted channel - map< int, vector<int> > m_CATSXInversion;//! - map< int, vector<int> > m_CATSYInversion;//! - - public: // Output data of interest - // for a CATS - void SetTargetAngle(double m_TargetAngle) {m_TargetAngle = m_TargetAngle;} - void SetTargetThickness(double m_TargetThickness) {m_TargetThickness = m_TargetThickness;} - - - // Remove bad channel, calibrate the data and apply threshold - void PreTreat(); - - // 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 InitializeRootInputRaw() ; - - // Activated associated Branches and link it to the private member DetectorPhysics address - // In this method mother Branches (Detector) AND daughter leaf (parameter) have to be activated - void InitializeRootInputPhysics() ; - - // Create associated branches and associated private member DetectorPhysics address - void InitializeRootOutput() ; - - // Clear The PreTeated object - void ClearPreTreatedData() {m_PreTreatedData->Clear();} - - void BuildPhysicalEvent(); - - void BuildSimplePhysicalEvent(); - - // Method related to the TSpectra classes, aimed at providing a framework for online applications - // Instantiate the Spectra class and the histogramm throught it - void InitSpectra(); - // Fill the spectra hold by the spectra class - void FillSpectra(); - // Used for Online mainly, perform check on the histo and for example change their color if issues are found - void CheckSpectra(); - // Used for Online only, clear all the spectra hold by the Spectra class - void ClearSpectra(); + public: + // Set the reconstruction Method used for the CATS plane + void SetReconstructionMethod(unsigned int CATSNumber, string XorY, string MethodName); + private : + // Map of activated channel + map< int, vector<bool> > m_XChannelStatus;//! + map< int, vector<bool> > m_YChannelStatus;//! + // Map of inverted channel + map< int, vector<int> > m_CATSXInversion;//! + map< int, vector<int> > m_CATSYInversion;//! - // Those two method all to clear the Event Physics or Data - void ClearEventPhysics() {Clear();} - void ClearEventData() {m_EventData->Clear();} + public: // Output data of interest + // for a CATS + void SetTargetAngle(double m_TargetAngle) {m_TargetAngle = m_TargetAngle;} + void SetTargetThickness(double m_TargetThickness) {m_TargetThickness = m_TargetThickness;} - void Clear(); - void Clear(const Option_t*) {}; - - // Give and external TCATSData object to TCATSPhysics, needed for online analysis - void SetRawDataPointer(TCATSData* rawDataPointer) {m_EventData = rawDataPointer;} - // Return false if the channel is disabled by user - bool IsValidChannel(const string DetectorType, const int Detector , const int channel); + // Remove bad channel, calibrate the data and apply threshold + void PreTreat(); - void InitializeStandardParameter(); + // 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 InitializeRootInputRaw() ; - void AddParameterToCalibrationManager(); + // Activated associated Branches and link it to the private member DetectorPhysics address + // In this method mother Branches (Detector) AND daughter leaf (parameter) have to be activated + void InitializeRootInputPhysics() ; - void ReadAnalysisConfig(); + // Create associated branches and associated private member DetectorPhysics address + void InitializeRootOutput() ; - void ReadConfiguration(string); + // Clear The PreTeated object + void ClearPreTreatedData() {m_PreTreatedData->Clear();} - void AddCATS(TVector3 C_X1_Y1, TVector3 C_X28_Y1, TVector3 C_X1_Y28, TVector3 C_X28_Y28); + void BuildPhysicalEvent(); - double AnalyseX(int ff); + void BuildSimplePhysicalEvent(); - double AnalyseY(int ff); + // Method related to the TSpectra classes, aimed at providing a framework for online applications + // Instantiate the Spectra class and the histogramm throught it + void InitSpectra(); + // Fill the spectra hold by the spectra class + void FillSpectra(); + // Used for Online mainly, perform check on the histo and for example change their color if issues are found + void CheckSpectra(); + // Used for Online only, clear all the spectra hold by the Spectra class + void ClearSpectra(); - double CalculatePositionX( double CalculatedStripX, correction method); - double CalculatePositionY( double CalculatedStripY, correction method); + // Those two method all to clear the Event Physics or Data + void ClearEventPhysics() {Clear();} + void ClearEventData() {m_EventData->Clear();} - reconstruction ChooseReconstruction(int ff, TString type); - - reconstruction StringToEnum(string type); + void Clear(); + void Clear(const Option_t*) {}; - double CorrectedPositionX3(double Position, double a) ; - double CorrectedPositionY3(double Position, double a) ; - double CorrectedPositionX4(double Position, double b); - double CorrectedPositionY4(double Position, double b); - double Corrected3PointsX(double Position, double c); - double Corrected3PointsY(double Position, double c); - double Corrected4PointsX(double Position, double d); - double Corrected4PointsY(double Position, double d); + // Give and external TCATSData object to TCATSPhysics, needed for online analysis + void SetRawDataPointer(TCATSData* rawDataPointer) {m_EventData = rawDataPointer;} - - // Methode de reconstruction X - double HyperbolicSequentMethodX(); - double GaussianMethodX(); - double Barycentric5MethodX(); - double Barycentric4MethodX(); - double Barycentric3MethodX(); + // Return false if the channel is disabled by user + bool IsValidChannel(const string DetectorType, const int Detector , const int channel); + void InitializeStandardParameter(); + void AddParameterToCalibrationManager(); + void ReadAnalysisConfig(); + void ReadConfiguration(string); + void AddCATS(TVector3 C_X1_Y1, TVector3 C_X28_Y1, TVector3 C_X1_Y28, TVector3 C_X28_Y28); - // Methode de Reconstruction Y - double HyperbolicSequentMethodY(); - double GaussianMethodY(); - double Barycentric5MethodY(); - double Barycentric4MethodY(); - double Barycentric3MethodY(); + public: + TVector3 GetBeamDirection(); + TVector3 GetPositionOnTarget(); - TVector3 GetBeamDirection(); - TVector3 GetPositionOnTarget(); - - double GetPositionOnTargetX() {return PositionOnTargetX;} - double GetPositionOnTargetY() {return PositionOnTargetY;} + double GetPositionOnTargetX() {return PositionOnTargetX;} + double GetPositionOnTargetY() {return PositionOnTargetY;} - private: // Spectra Class - TCATSSpectra* m_Spectra;//! + private: // Spectra Class + TCATSSpectra* m_Spectra;//! - public: // Spectra Getter - map< vector<TString> , TH1*> GetSpectra(); + public: // Spectra Getter + map< vector<string> , TH1*> GetSpectra(); + ClassDef(TCATSPhysics,1) // CATSPhysics structure +}; - ClassDef(TCATSPhysics,1) // CATSPhysics structure -}; +namespace CATS_LOCAL{ + // The reconstruction methods need to be outside the class for practical purpose + // of dealing with the function pointer + double AnalyticHyperbolicSecant(vector<double>& ChargeArray,int& StripMax); + double FittedHyperbolicSecant(vector<double>& ChargeArray,int& StripMax); + double AnalyticGaussian(vector<double>& ChargeArray,int& StripMax); + double Centroide(vector<double>& ChargeArray,int& StripMax); -namespace LOCAL_CATS -{ // tranform an integer to a string string itoa(int value); diff --git a/NPLib/CATS/TCATSSpectra.cxx b/NPLib/CATS/TCATSSpectra.cxx index 0aaad144e5c44985b9fb9b459ec66610d99a7799..b060356a32ef60463f7206b68e037924fcbf3bc0 100644 --- a/NPLib/CATS/TCATSSpectra.cxx +++ b/NPLib/CATS/TCATSSpectra.cxx @@ -21,6 +21,11 @@ * * *****************************************************************************/ +//STL +#include <iostream> +#include <cstdlib> +#include <stdexcept> + // NPL #include "TCATSSpectra.h" #include "NPOptionManager.h" @@ -32,7 +37,7 @@ using namespace NPUNITS; // ROOT -#include "TString.h" +#include "string.h" #include "TDirectory.h" #include "TFile.h" @@ -74,105 +79,107 @@ TCATSSpectra::~TCATSSpectra(){ //////////////////////////////////////////////////////////////////////////////// void TCATSSpectra::InitRawSpectra(){ - TString name; + string name; for (unsigned int i = 0; i < fNumberOfCats; ++i) { // loop on number of cats // CATS_STRX_Q_RAW - name = Form("CATS%d_STRX_Q_RAW", i+1); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_STRX_Q_RAW"; AddHisto2D(name, name, fStripsNumber, 1, fStripsNumber+1, 512, 0, 16384, "CATS/RAW/STRQ"); // CATS_STRY_Q_RAW - name = Form("CATS%d_STRY_Q_RAW", i+1); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_STRY_Q_RAW"; AddHisto2D(name, name, fStripsNumber, 1, fStripsNumber+1, 512, 0, 16384, "CATS/RAW/STRQ"); // STRX_MULT - name = Form("CATS%d_STRX_MULT", i+1); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_STRX_MULT"; AddHisto1D(name, name, fStripsNumber, 1, fStripsNumber+1, "CATS/RAW/MULT"); // STRY_MULT - name = Form("CATS%d_STRY_MULT", i+1); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_STRY_MULT"; AddHisto1D(name, name, fStripsNumber, 1, fStripsNumber+1, "CATS/RAW/MULT"); } // end loop on number of cats } //////////////////////////////////////////////////////////////////////////////// void TCATSSpectra::InitPreTreatedSpectra(){ - TString family = "CATS/CAL/STRQ" ; - TString name; + string family = "CATS/CAL/STRQ" ; + string name; for (unsigned int i = 0; i < fNumberOfCats; ++i) { // loop on number of cats // CATS_STRX_Q_CAL - name = Form("CATS%d_STRX_Q_CAL", i+1); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_STRX_Q_CAL"; AddHisto2D(name, name, fStripsNumber, 1, fStripsNumber+1, 512, 0, 16384, family); // CATS_STRY_Q_CAL - name = Form("CATS%d_STRY_Q_CAL", i+1); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_STRY_Q_CAL"; AddHisto2D(name, name, fStripsNumber, 1, fStripsNumber+1, 512, 0, 16384, family); - // end loop on number of cats + // end loop on number of cats // STRX_MULT - name = Form("CATS%d_STRX_CAL_MULT", i+1); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_STRX_CAL_MULT"; AddHisto1D(name, name, fStripsNumber, 1, fStripsNumber+1, "CATS/CAL/MULT"); // STRY_MULT - name = Form("CATS%d_STRY_CAL_MULT", i+1); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_STRY_CAL_MULT"; AddHisto1D(name, name, fStripsNumber, 1, fStripsNumber+1, "CATS/CAL/MULT"); } // end loop on number of cats } //////////////////////////////////////////////////////////////////////////////// void TCATSSpectra::InitPhysicsSpectra(){ - TString family = "CATS/PHY/QSUM" ; - TString name; + string family = "CATS/PHY/QSUM" ; + string name; for (unsigned int i = 0; i < fNumberOfCats; ++i) { // loop on number of cats - name = Form("CATS%d_QSUM_STRMAX_X_CAL", i+1); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_QSUM_STRMAX_X_CAL"; AddHisto2D(name, name, fStripsNumber, 1, fStripsNumber+1, 512, 0, 16384, family); - name = Form("CATS%d_QSUM_STRMAX_Y_CAL", i+1); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_QSUM_STRMAX_Y_CAL"; AddHisto2D(name, name, fStripsNumber, 1, fStripsNumber+1, 512, 0, 16384, family); } family = "CATS/PHY/CTRL"; for (unsigned int i = 0; i < fNumberOfCats; ++i) { // loop on number of cats - name = Form("CATS%d_QMEAN_TIME", i+1); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_QMEAN_TIME"; AddHisto1D(name, name, fEventLoopSize,0,fEventLoopSize,family); fEventLoopQSum.push_back(0); } family = "CATS/PHY/POS"; for (unsigned int i = 0; i < fNumberOfCats; ++i) { // loop on number of cats - name = Form("CATS%d_POS", i+1); - AddHisto2D(name, name,500,-50,50,500,-50,50,family); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_POS"; + AddHisto2D(name, name,120,-40,40,120,-40,40,family); + name = "CATS_STRIP_"+CATS_LOCAL::itoa(i+1)+"_POS"; + AddHisto2D(name, name,120,1,28,120,1,28,family); + } name = "TARGET_POS"; - AddHisto2D(name, name,500,-50,50,500,-50,50,family); - + AddHisto2D(name, name,320,-40,40,320,-40,40,family); name = "TRAJECTORY_XZ"; - AddHisto2D(name, name,100,-50,50,100,-50,50,family); + AddHisto2D(name, name,500,-700,500,200,-200,400,family); name = "TRAJECTORY_YZ"; - AddHisto2D(name, name,100,-50,50,100,-50,50,family); + AddHisto2D(name, name,500,-700,500,200,-200,400,family); } //////////////////////////////////////////////////////////////////////////////// void TCATSSpectra::FillRawSpectra(TCATSData* RawData){ - TString name; - TString family; + string name; + string family; // CATS_STRX_Q_RAW for (unsigned int i = 0; i < RawData->GetCATSMultX(); ++i) { // loop on vector family = "CATS/RAW/STRQ"; - name = Form("CATS%d_STRX_Q_RAW", RawData->GetCATSDetX(i)); + name = "CATS"+CATS_LOCAL::itoa(RawData->GetCATSDetX(i))+"_STRX_Q_RAW"; GetHisto(family, name) -> Fill(RawData->GetCATSStripX(i), RawData->GetCATSChargeX(i)); } // end loop on vector // CATS_STRY_Q_RAW for (unsigned int i = 0; i < RawData->GetCATSMultY(); ++i) { // loop on vector family = "CATS/RAW/STRQ"; - name = Form("CATS%d_STRY_Q_RAW", RawData->GetCATSDetY(i)); + name = "CATS"+CATS_LOCAL::itoa(RawData->GetCATSDetY(i))+"_STRY_Q_RAW"; GetHisto(family, name) -> Fill(RawData->GetCATSStripY(i), RawData->GetCATSChargeY(i)); } // end loop on vector @@ -182,7 +189,7 @@ void TCATSSpectra::FillRawSpectra(TCATSData* RawData){ for (unsigned int i = 0; i < RawData->GetCATSMultX(); i++) myMULT[RawData->GetCATSDetX(i)-1] += 1; for (unsigned int i = 0; i < fNumberOfCats; i++) { - name = Form("CATS%d_STRX_MULT", i+1); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_STRX_MULT"; family = "CATS/RAW/MULT"; GetHisto(family,name) -> Fill(myMULT[i]); } @@ -192,7 +199,7 @@ void TCATSSpectra::FillRawSpectra(TCATSData* RawData){ for (unsigned int i = 0; i < RawData->GetCATSMultY(); i++) myMULT[RawData->GetCATSDetY(i)-1] += 1; for (unsigned int i = 0; i < fNumberOfCats; i++) { - name = Form("CATS%d_STRY_MULT", i+1); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_STRY_MULT"; family = "CATS/RAW/MULT"; GetHisto(family,name) -> Fill(myMULT[i]); } @@ -200,20 +207,20 @@ void TCATSSpectra::FillRawSpectra(TCATSData* RawData){ //////////////////////////////////////////////////////////////////////////////// void TCATSSpectra::FillPreTreatedSpectra(TCATSData* PreTreatedData){ - TString name; - TString family; + string name; + string family; // CATS_STRX_Q_CAL for (unsigned int i = 0; i < PreTreatedData->GetCATSMultX(); ++i) { // loop on vector family = "CATS/CAL/STRQ"; - name = Form("CATS%d_STRX_Q_CAL", PreTreatedData->GetCATSDetX(i)); + name = "CATS"+CATS_LOCAL::itoa(PreTreatedData->GetCATSDetX(i))+"_STRX_Q_CAL"; GetHisto(family,name) -> Fill(PreTreatedData->GetCATSStripX(i), PreTreatedData->GetCATSChargeX(i)); } // end loop on vector // CATS_STRY_Q_CAL for (unsigned int i = 0; i < PreTreatedData->GetCATSMultY(); ++i) { // loop on vector family = "CATS/CAL/STRQ"; - name = Form("CATS%d_STRY_Q_CAL", PreTreatedData->GetCATSDetY(i)); + name = "CATS"+CATS_LOCAL::itoa(PreTreatedData->GetCATSDetY(i))+"_STRY_Q_CAL"; GetHisto(family,name) -> Fill(PreTreatedData->GetCATSStripY(i), PreTreatedData->GetCATSChargeY(i)); } // end loop on vector @@ -223,7 +230,7 @@ void TCATSSpectra::FillPreTreatedSpectra(TCATSData* PreTreatedData){ for (unsigned int i = 0; i < PreTreatedData->GetCATSMultX(); i++) myMULT[PreTreatedData->GetCATSDetX(i)-1] += 1; for (unsigned int i = 0; i < fNumberOfCats; i++) { - name = Form("CATS%d_STRX_CAL_MULT", i+1); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_STRX_CAL_MULT"; family = "CATS/CAL/MULT"; GetHisto(family,name) -> Fill(myMULT[i]); } @@ -233,7 +240,7 @@ void TCATSSpectra::FillPreTreatedSpectra(TCATSData* PreTreatedData){ for (unsigned int i = 0; i < PreTreatedData->GetCATSMultY(); i++) myMULT[PreTreatedData->GetCATSDetY(i)-1] += 1; for (unsigned int i = 0; i < fNumberOfCats; i++) { - name = Form("CATS%d_STRY_CAL_MULT", i+1); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_STRY_CAL_MULT"; family = "CATS/CAL/MULT"; GetHisto(family,name) -> Fill(myMULT[i]); } @@ -242,31 +249,29 @@ void TCATSSpectra::FillPreTreatedSpectra(TCATSData* PreTreatedData){ //////////////////////////////////////////////////////////////////////////////// void TCATSSpectra::FillPhysicsSpectra(TCATSPhysics* Physics){ - TString name,family; + string name,family; // CATS_STRX_Q_CAL for (unsigned int i = 0; i < Physics->DetNumberX.size() ; ++i) { // loop on vector family="CATS/PHY/QSUM"; - name = Form("CATS%d_QSUM_STRMAX_X_CAL", Physics->DetNumberX[i]); + name = "CATS"+CATS_LOCAL::itoa(Physics->DetNumberX[i])+"_QSUM_STRMAX_X_CAL"; GetHisto(family,name) -> Fill(Physics->StripMaxX[i],Physics->QsumX[i]); - name = Form("CATS%d_QSUM_STRMAX_Y_CAL", Physics->DetNumberX[i]); + name = "CATS"+CATS_LOCAL::itoa(Physics->DetNumberX[i])+"_QSUM_STRMAX_Y_CAL"; GetHisto(family,name) -> Fill(Physics->StripMaxY[i],Physics->QsumY[i]); - } // An histo of size fEventLoopSize is reset every fEventLoopSize to monitor the // Keep Track of how many event elapsed - if(Physics->StripMaxX.size()==fNumberOfCats){ fEventLoopIndex++; family = "CATS/PHY/CTRL"; for (unsigned int i = 0; i < Physics->StripMaxX.size(); ++i) { fEventLoopQSum[i]+=Physics->QsumX[i]/1000000.; - name = Form("CATS%d_QMEAN_TIME",i+1); + name = "CATS"+CATS_LOCAL::itoa(i+1)+"_QMEAN_TIME"; - GetHisto(family,name) ->SetBinContent(fEventLoopIndex/fEventLoopStep,fEventLoopQSum[i]/fEventLoopStep); + GetHisto(family,name) ->SetBinContent(fEventLoopIndex/fEventLoopIndex,fEventLoopQSum[i]/fEventLoopIndex); } } - + // Reset the mean every bin if(fEventLoopIndex%fEventLoopStep>fEventLoopStep) for (unsigned int i = 0; i < fNumberOfCats; ++i) @@ -274,39 +279,60 @@ void TCATSSpectra::FillPhysicsSpectra(TCATSPhysics* Physics){ // Restart histo if(fEventLoopIndex > fEventLoopSize) - fEventLoopIndex = 0 ; + fEventLoopIndex = 0 ; - if(Physics->StripMaxX.size()==fNumberOfCats){ - for (unsigned int i = 0; i < Physics->StripMaxX.size(); ++i) { - family = "CATS/PHY/POS"; - name = Form("CATS%d_POS", i+1); - GetHisto(family,name) -> Fill(Physics->PositionX[i],Physics->PositionY[i]); - } + for (unsigned int i = 0; i < Physics->PositionX.size(); ++i) { + family = "CATS/PHY/POS"; + name = "CATS"+CATS_LOCAL::itoa(Physics->DetMaxX[i])+"_POS"; + GetHisto(family,name) -> Fill(Physics->PositionX[i],Physics->PositionY[i]); - if(Physics->PositionOnTargetX > -1000 && Physics->PositionOnTargetY > -1000){ - name = "TARGET_POS"; - GetHisto(family,name)->Fill(Physics->PositionOnTargetX,Physics->PositionOnTargetY); - } + name = "CATS_STRIP_"+CATS_LOCAL::itoa(Physics->DetMaxX[i])+"_POS"; + GetHisto(family,name) -> Fill(Physics->StripNumberX[i],Physics->StripNumberY[i]); } -/*name = "TARGET_POS"; - AddHisto2D(name, name,100,-50,50,100,-50,50,family); + if(Physics->PositionOnTargetX > -1000 && Physics->PositionOnTargetY > -1000){ + name = "TARGET_POS"; + GetHisto(family,name)->Fill(Physics->PositionOnTargetX,Physics->PositionOnTargetY); - name = "TRAJECTORY_XZ"; - AddHisto2D(name, name,100,-50,50,100,-50,50,family); - name = "TRAJECTORY_YZ"; - AddHisto2D(name, name,100,-50,50,100,-50,50,family); -*/ + name = "TRAJECTORY_XZ"; + TH2F* histo1 = (TH2F*) GetHisto(family,name); + + name = "TRAJECTORY_YZ"; + TH2F* histo2 = (TH2F*) GetHisto(family,name); + + for(int i = 0 ; i < histo1->GetNbinsX() ; i++){ + double z = histo1->GetXaxis()->GetBinCenter(i); + double PositionOnTargetX; + double PositionOnTargetY; + double PositionZ0 = Physics->PositionZ[0]; + double PositionZ1 = Physics->PositionZ[1]; + if(Physics->DetMaxX[0]<Physics->DetMaxX[2]){ + double t = -(PositionZ1-z)/(PositionZ1-PositionZ0); + PositionOnTargetX= Physics->PositionX[1] + (Physics->PositionX[1]-Physics->PositionX[0])*t; + PositionOnTargetY= Physics->PositionY[1] + (Physics->PositionY[1]-Physics->PositionY[0])*t; + } + + else{ + double t = -(PositionZ0-z)/(PositionZ0-PositionZ1); + PositionOnTargetX= Physics->PositionX[0] + (Physics->PositionX[0]-Physics->PositionX[1])*t; + PositionOnTargetY= Physics->PositionY[0] + (Physics->PositionY[0]-Physics->PositionY[1])*t; + } + + histo1->Fill(z,PositionOnTargetX); + histo2->Fill(z,PositionOnTargetY); + } + } } + //////////////////////////////////////////////////////////////////////////////// -TH1* TCATSSpectra::AddHisto1D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, TString family){ +TH1* TCATSSpectra::AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family){ // create histo - TH1 *hist = new TH1D(name, title, nbinsx, xlow, xup); + TH1 *hist = new TH1D(name.c_str(), title.c_str(), nbinsx, xlow, xup); - vector<TString> index; + vector<string> index; index.push_back(family); index.push_back(name); @@ -317,11 +343,11 @@ TH1* TCATSSpectra::AddHisto1D(TString name, TString title, Int_t nbinsx, Double_ } //////////////////////////////////////////////////////////////////////////////// -TH1* TCATSSpectra::AddHisto2D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, Int_t nbinsy, Double_t ylow, Double_t yup, TString family){ +TH1* TCATSSpectra::AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, Int_t nbinsy, Double_t ylow, Double_t yup, string family){ // create histo - TH1 *hist = new TH2D(name, title, nbinsx, xlow, xup, nbinsy, ylow, yup); + TH1 *hist = new TH2D(name.c_str(), title.c_str(), nbinsx, xlow, xup, nbinsy, ylow, yup); - vector<TString> index; + vector<string> index; index.push_back(family); index.push_back(name); @@ -332,23 +358,34 @@ TH1* TCATSSpectra::AddHisto2D(TString name, TString title, Int_t nbinsx, Double_ } //////////////////////////////////////////////////////////////////////////////// -TH1* TCATSSpectra::GetHisto(TString family, TString name){ - vector<TString> index; +TH1* TCATSSpectra::GetHisto(string& family, string& name){ + vector<string> index; + index.reserve(2); index.push_back(family); index.push_back(name); + TH1* histo ; + + try{ + histo = fMapHisto.at(index); + } + + catch(const std::out_of_range& oor){ + cout << "ERROR : the folowing Histo has been requested by TCATSSpectra and does not exist: family:" << family << " name: " << name << endl ; + exit(1); + } - return fMapHisto.at(index); + return histo; } //////////////////////////////////////////////////////////////////////////////// -void TCATSSpectra::WriteHisto(TString filename){ +void TCATSSpectra::WriteHisto(string filename){ TFile* f = NULL; if (filename != "VOID") { - f = new TFile(filename,"RECREATE"); + f = new TFile(filename.c_str(),"RECREATE"); } - map< vector<TString>, TH1* >::iterator it; + map< vector<string>, TH1* >::iterator it; for (it=fMapHisto.begin(); it!=fMapHisto.end(); ++it) { it->second->Write(); } diff --git a/NPLib/CATS/TCATSSpectra.h b/NPLib/CATS/TCATSSpectra.h index dc8cbc9f32e891dc7af44449faeb4769be92f59e..975848f1b6c7db04a72e764a1e4cbbd4bf45ebab 100644 --- a/NPLib/CATS/TCATSSpectra.h +++ b/NPLib/CATS/TCATSSpectra.h @@ -27,7 +27,6 @@ #include "TObject.h" #include <TH1.h> #include <TH2.h> -#include <TString.h> // NPLib headers #include "TCATSData.h" @@ -51,9 +50,9 @@ class TCATSSpectra { private: // Instantiate and register histo to maps - TH1* AddHisto1D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, TString family); - TH1* AddHisto2D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, - Int_t nbinsy, Double_t ylow, Double_t yup, TString family); + TH1* AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family); + TH1* AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, + Int_t nbinsy, Double_t ylow, Double_t yup, string family); // Initialization methods void InitRawSpectra(); @@ -68,9 +67,9 @@ class TCATSSpectra { public: // get map histo which will be used for GSpectra in GUser - map< vector<TString>, TH1* > GetMapHisto() const {return fMapHisto;} - TH1* GetHisto(TString family, TString name); - void WriteHisto(TString filename = "VOID"); + map< vector<string>, TH1* > GetMapHisto() const {return fMapHisto;} + TH1* GetHisto(string& family, string& name); + void WriteHisto(string filename = "VOID"); private: // Information on MUST2 unsigned int fNumberOfCats; @@ -82,7 +81,7 @@ class TCATSSpectra { private: // map holding histo pointers and their family names -map< vector<TString>, TH1* > fMapHisto; +map< vector<string>, TH1* > fMapHisto; }; #endif diff --git a/NPLib/Charissa/TCharissaPhysics.cxx b/NPLib/Charissa/TCharissaPhysics.cxx index f31af52d57971f4dd0283aaa3f5d29d9fc2f26c3..12b2d23d7a79ceebe6cc81252436129209b01517 100755 --- a/NPLib/Charissa/TCharissaPhysics.cxx +++ b/NPLib/Charissa/TCharissaPhysics.cxx @@ -39,32 +39,32 @@ using namespace CHARISSA_LOCAL; /////////////////////////////////////////////////////////////////////////// ClassImp(TCharissaPhysics) -/////////////////////////////////////////////////////////////////////////// -TCharissaPhysics::TCharissaPhysics(){ - EventMultiplicity = 0 ; - m_EventData = new TCharissaData ; - m_PreTreatedData = new TCharissaData ; - m_EventPhysics = this ; - m_Spectra = NULL; - m_NumberOfTelescope = 0 ; - m_MaximumStripMultiplicityAllowed = 10; - m_StripEnergyMatchingSigma = 0.020 ; - m_StripEnergyMatchingNumberOfSigma = 3; - // Raw Threshold - m_Si_X_E_RAW_Threshold = 0 ; - m_Si_Y_E_RAW_Threshold = 0 ; - m_CsI_E_RAW_Threshold = 0 ; - // Calibrated Threshold - m_Si_X_E_Threshold = 0 ; - m_Si_Y_E_Threshold = 0 ; - m_CsI_E_Threshold = 0; - m_NumberOfStrip = 16; - - m_Take_E_Y=false; - m_Take_T_Y=true; - + /////////////////////////////////////////////////////////////////////////// + TCharissaPhysics::TCharissaPhysics(){ + EventMultiplicity = 0 ; + m_EventData = new TCharissaData ; + m_PreTreatedData = new TCharissaData ; + m_EventPhysics = this ; + m_Spectra = NULL; + m_NumberOfTelescope = 0 ; + m_MaximumStripMultiplicityAllowed = 100; + m_StripEnergyMatchingSigma = 0.1 ; + m_StripEnergyMatchingNumberOfSigma = 300; + // Raw Threshold + m_Si_X_E_RAW_Threshold = 1500 ; + m_Si_Y_E_RAW_Threshold = 1500 ; + m_CsI_E_RAW_Threshold = 0 ; + // Calibrated Threshold + m_Si_X_E_Threshold = 0 ; + m_Si_Y_E_Threshold = 0 ; + m_CsI_E_Threshold = 0; + m_NumberOfStrip = 16; + + m_Take_E_Y=false; + m_Take_T_Y=true; + } - + /////////////////////////////////////////////////////////////////////////// @@ -79,172 +79,255 @@ void TCharissaPhysics::BuildSimplePhysicalEvent(){ /////////////////////////////////////////////////////////////////////////// void TCharissaPhysics::BuildPhysicalEvent(){ + PreTreat(); - bool check_CSI = false ; - m_Layer1_StripXEMult = m_PreTreatedData->GetCharissaLayer1StripXEMult(); - m_Layer1_StripYEMult = m_PreTreatedData->GetCharissaLayer1StripYEMult(); - m_Layer1_StripXTMult = m_PreTreatedData->GetCharissaLayer1StripXTMult(); - m_Layer1_StripYTMult = m_PreTreatedData->GetCharissaLayer1StripYTMult(); - m_Layer2_StripXEMult = m_PreTreatedData->GetCharissaLayer2StripXEMult(); - m_Layer2_StripYEMult = m_PreTreatedData->GetCharissaLayer2StripYEMult(); - m_Layer2_StripXTMult = m_PreTreatedData->GetCharissaLayer2StripXTMult(); - m_Layer2_StripYTMult = m_PreTreatedData->GetCharissaLayer2StripYTMult(); - m_CsIEMult = m_PreTreatedData->GetCharissaCsIEMult(); - m_CsITMult = m_PreTreatedData->GetCharissaCsITMult(); - - // Layer 1 - if( Layer1_CheckEvent() == 1 ){ - vector< TVector2 > Layer1_couple = Layer1_Match_X_Y() ; - EventMultiplicity = Layer1_couple.size(); - - for(unsigned int i = 0 ; i < Layer1_couple.size() ; ++i){ - check_CSI = false ; - - int Layer1_N = m_PreTreatedData->GetCharissaLayer1StripXEDetectorNbr(Layer1_couple[i].X()) ; - - int Layer1_X = m_PreTreatedData->GetCharissaLayer1StripXEStripNbr(Layer1_couple[i].X()) ; - int Layer1_Y = m_PreTreatedData->GetCharissaLayer1StripYEStripNbr(Layer1_couple[i].Y()) ; - - double Layer1_Si_X_E = m_PreTreatedData->GetCharissaLayer1StripXEEnergy( Layer1_couple[i].X() ) ; - double Layer1_Si_Y_E = m_PreTreatedData->GetCharissaLayer1StripYEEnergy( Layer1_couple[i].Y() ) ; + // Layer 1 + vector< TVector2 > Layer1_couple = Layer1_Match_X_Y() ; + vector< TVector2 > Layer2_couple = Layer2_Match_X_Y() ; + + // Check out the different mult needed later on + m_Layer1_StripXEMult = m_PreTreatedData->GetCharissaLayer1StripXEMult(); + m_Layer1_StripYEMult = m_PreTreatedData->GetCharissaLayer1StripYEMult(); + m_Layer1_StripXTMult = m_PreTreatedData->GetCharissaLayer1StripXTMult(); + m_Layer1_StripYTMult = m_PreTreatedData->GetCharissaLayer1StripYTMult(); + m_Layer2_StripXEMult = m_PreTreatedData->GetCharissaLayer2StripXEMult(); + m_Layer2_StripYEMult = m_PreTreatedData->GetCharissaLayer2StripYEMult(); + m_Layer2_StripXTMult = m_PreTreatedData->GetCharissaLayer2StripXTMult(); + m_Layer2_StripYTMult = m_PreTreatedData->GetCharissaLayer2StripYTMult(); + m_CsIEMult = m_PreTreatedData->GetCharissaCsIEMult(); + m_CsITMult = m_PreTreatedData->GetCharissaCsITMult(); + + // Case were Layer 1 has been fired + if(Layer1_couple.size()>0){ + + for(unsigned int i = 0 ; i < Layer1_couple.size() ; ++i){ + int Layer1_N = m_PreTreatedData->GetCharissaLayer1StripXEDetectorNbr(Layer1_couple[i].X()) ; + int Layer1_X = m_PreTreatedData->GetCharissaLayer1StripXEStripNbr(Layer1_couple[i].X()) ; + int Layer1_Y = m_PreTreatedData->GetCharissaLayer1StripYEStripNbr(Layer1_couple[i].Y()) ; - // Search for associate Time - double Layer1_Si_X_T = -1000 ; + double Layer1_Si_X_E = m_PreTreatedData->GetCharissaLayer1StripXEEnergy( Layer1_couple[i].X() ) ; + double Layer1_Si_Y_E = m_PreTreatedData->GetCharissaLayer1StripYEEnergy( Layer1_couple[i].Y() ) ; + + // Search for associate Time + double Layer1_Si_X_T = -1000 ; + + for(unsigned int t = 0 ; t < m_Layer1_StripXTMult ; ++t ){ + if( m_PreTreatedData->GetCharissaLayer1StripXTStripNbr( Layer1_couple[i].X() ) == m_PreTreatedData->GetCharissaLayer1StripXTStripNbr(t) + ||m_PreTreatedData->GetCharissaLayer1StripXTDetectorNbr( Layer1_couple[i].X() ) == m_PreTreatedData->GetCharissaLayer1StripXTDetectorNbr(t)) + Layer1_Si_X_T = m_PreTreatedData->GetCharissaLayer1StripXTTime(t); + } + + double Layer1_Si_Y_T = -1000 ; + + for(unsigned int t = 0 ; t < m_Layer1_StripYTMult ; ++t ){ + if( m_PreTreatedData->GetCharissaLayer1StripYTStripNbr( Layer1_couple[i].Y() ) == m_PreTreatedData->GetCharissaLayer1StripYTStripNbr(t) + ||m_PreTreatedData->GetCharissaLayer1StripYTDetectorNbr( Layer1_couple[i].Y() ) == m_PreTreatedData->GetCharissaLayer1StripYTDetectorNbr(t)) + Layer1_Si_Y_T = m_PreTreatedData->GetCharissaLayer1StripYTTime(t); + } + + Layer1_Si_X.push_back(Layer1_X) ; Layer1_Si_Y.push_back(Layer1_Y) ; TelescopeNumber.push_back(Layer1_N) ; + + if(m_Take_E_Y) Layer1_Si_E.push_back(Layer1_Si_Y_E); + else Layer1_Si_E.push_back(Layer1_Si_X_E); + + if(m_Take_T_Y) Layer1_Si_T.push_back(Layer1_Si_Y_T); + else Layer1_Si_T.push_back(Layer1_Si_X_T); + + // Store the other value for checking purpose + Layer1_Si_EX.push_back(Layer1_Si_X_E); + Layer1_Si_TX.push_back(Layer1_Si_X_T); + Layer1_Si_EY.push_back(Layer1_Si_Y_E); + Layer1_Si_TY.push_back(Layer1_Si_Y_T); + + // Look for associate layer 2 + double tLayer2_X = -1000; + double tLayer2_Y= -1000; + double tLayer2_Si_X_E= -1000; + double tLayer2_Si_Y_E= -1000; + double tLayer2_Si_X_T= -1000; + double tLayer2_Si_Y_T= -1000; +// double tLayer2_Si_E= -1000; +// double tLayer2_Si_T = -1000; - for(unsigned int t = 0 ; t < m_Layer1_StripXTMult ; ++t ) - { - if( m_PreTreatedData->GetCharissaLayer1StripXTStripNbr( Layer1_couple[i].X() ) == m_PreTreatedData->GetCharissaLayer1StripXTStripNbr(t) - ||m_PreTreatedData->GetCharissaLayer1StripXTDetectorNbr( Layer1_couple[i].X() ) == m_PreTreatedData->GetCharissaLayer1StripXTDetectorNbr(t)) - Layer1_Si_X_T = m_PreTreatedData->GetCharissaLayer1StripXTTime(t); + for(unsigned int ll = 0 ; ll < Layer2_couple.size() ; ++ll){ + int Layer2_N = m_PreTreatedData->GetCharissaLayer2StripXEDetectorNbr(Layer2_couple[ll].X()) ; + // Same detector + // This requierement should maybe stronger (same strip number?) + if(Layer2_N==Layer1_N){ + tLayer2_X = m_PreTreatedData->GetCharissaLayer2StripXEStripNbr(Layer2_couple[ll].X()) ; + tLayer2_Y = m_PreTreatedData->GetCharissaLayer2StripYEStripNbr(Layer2_couple[ll].Y()) ; + + tLayer2_Si_X_E = m_PreTreatedData->GetCharissaLayer2StripXEEnergy( Layer2_couple[ll].X() ) ; + tLayer2_Si_Y_E = m_PreTreatedData->GetCharissaLayer2StripYEEnergy( Layer2_couple[ll].Y() ) ; + + // Search for associate Time + tLayer2_Si_X_T = -1000 ; + + for(unsigned int t = 0 ; t < m_Layer2_StripXTMult ; ++t ){ + if( m_PreTreatedData->GetCharissaLayer2StripXTStripNbr( Layer2_couple[ll].X() ) == m_PreTreatedData->GetCharissaLayer2StripXTStripNbr(t) + ||m_PreTreatedData->GetCharissaLayer2StripXTDetectorNbr( Layer2_couple[ll].X() ) == m_PreTreatedData->GetCharissaLayer2StripXTDetectorNbr(t)) + tLayer2_Si_X_T = m_PreTreatedData->GetCharissaLayer2StripXTTime(t); } - - double Layer1_Si_Y_T = -1000 ; - - for(unsigned int t = 0 ; t < m_Layer1_StripYTMult ; ++t ) - { - if( m_PreTreatedData->GetCharissaLayer1StripYTStripNbr( Layer1_couple[i].Y() ) == m_PreTreatedData->GetCharissaLayer1StripYTStripNbr(t) - ||m_PreTreatedData->GetCharissaLayer1StripYTDetectorNbr( Layer1_couple[i].Y() ) == m_PreTreatedData->GetCharissaLayer1StripYTDetectorNbr(t)) - Layer1_Si_Y_T = m_PreTreatedData->GetCharissaLayer1StripYTTime(t); + + tLayer2_Si_Y_T = -1000 ; + + for(unsigned int t = 0 ; t < m_Layer2_StripYTMult ; ++t ){ + if( m_PreTreatedData->GetCharissaLayer2StripYTStripNbr( Layer2_couple[ll].Y() ) == m_PreTreatedData->GetCharissaLayer2StripYTStripNbr(t) + ||m_PreTreatedData->GetCharissaLayer2StripYTDetectorNbr( Layer2_couple[ll].Y() ) == m_PreTreatedData->GetCharissaLayer2StripYTDetectorNbr(t)) + tLayer2_Si_Y_T = m_PreTreatedData->GetCharissaLayer2StripYTTime(t); } + } + } + + Layer2_Si_EX.push_back(tLayer2_Si_X_E); + Layer2_Si_TX.push_back(tLayer2_Si_X_T); + Layer2_Si_EY.push_back(tLayer2_Si_Y_E); + Layer2_Si_TY.push_back(tLayer2_Si_Y_T); + Layer2_Si_X.push_back(tLayer2_X) ; + Layer2_Si_Y.push_back(tLayer2_Y) ; - Layer1_Si_X.push_back(Layer1_X) ; Layer1_Si_Y.push_back(Layer1_Y) ; Layer1_TelescopeNumber.push_back(Layer1_N) ; - - if(m_Take_E_Y) Layer1_Si_E.push_back(Layer1_Si_Y_E); - else Layer1_Si_E.push_back(Layer1_Si_X_E); + if(m_Take_E_Y) Layer2_Si_E.push_back(tLayer2_Si_Y_E); + else Layer2_Si_E.push_back(tLayer2_Si_X_E); + + if(m_Take_T_Y) Layer2_Si_T.push_back(tLayer2_Si_Y_T); + else Layer2_Si_T.push_back(tLayer2_Si_X_T); + + double CsIE = -1000; + int CsIN = -1000; - if(m_Take_T_Y) Layer1_Si_T.push_back(Layer1_Si_Y_T); - else Layer1_Si_T.push_back(Layer1_Si_X_T); + // Look for an associate CsI E + for(unsigned int t = 0 ; t < m_CsIEMult ; ++t ){ + if(m_PreTreatedData->GetCharissaLayer1StripXEDetectorNbr( Layer1_couple[i].X() ) == m_PreTreatedData->GetCharissaCsIEDetectorNbr(t)){ + CsIE = m_PreTreatedData->GetCharissaCsIEEnergy(t); + CsIN = m_PreTreatedData->GetCharissaCsIECristalNbr(t); + } + } + double CsIT = -1000; + // Look for an associate CsI T + for(unsigned int t = 0 ; t < m_CsITMult ; ++t ){ + if(m_PreTreatedData->GetCharissaLayer1StripXEDetectorNbr( Layer1_couple[i].X() ) == m_PreTreatedData->GetCharissaCsITDetectorNbr(t)) + CsIT = m_PreTreatedData->GetCharissaCsITTime(t); + } - // Store the other value for checking purpose - Layer1_Si_EX.push_back(Layer1_Si_X_E); - Layer1_Si_TX.push_back(Layer1_Si_X_T); - Layer1_Si_EY.push_back(Layer1_Si_Y_E); - Layer1_Si_TY.push_back(Layer1_Si_Y_T); - } + if(CsIE>-1000){ + CsI_E.push_back(CsIE); + CsI_N.push_back(CsIN); + CsI_T.push_back(CsIT); + } + else{ + CsI_E.push_back(-1000); + CsI_N.push_back(-1000); + CsI_T.push_back(-1000); + } + } + } - - // Layer 2 - if( Layer2_CheckEvent() == 1 ){ - vector< TVector2 > Layer2_couple = Layer2_Match_X_Y() ; - EventMultiplicity = Layer2_couple.size(); - - for(unsigned int i = 0 ; i < Layer2_couple.size() ; ++i){ - - check_CSI = false ; - - int Layer2_N = m_PreTreatedData->GetCharissaLayer2StripXEDetectorNbr(Layer2_couple[i].X()) ; - int Layer2_X = m_PreTreatedData->GetCharissaLayer2StripXEStripNbr(Layer2_couple[i].X()) ; - int Layer2_Y = m_PreTreatedData->GetCharissaLayer2StripYEStripNbr(Layer2_couple[i].Y()) ; - - double Layer2_Si_X_E = m_PreTreatedData->GetCharissaLayer1StripXEEnergy( Layer2_couple[i].X() ) ; - double Layer2_Si_Y_E = m_PreTreatedData->GetCharissaLayer1StripYEEnergy( Layer2_couple[i].Y() ) ; - - // Search for associate Time - double Layer2_Si_X_T = -1000 ; - - for(unsigned int t = 0 ; t < m_Layer2_StripXTMult ; ++t ) - { - if( m_PreTreatedData->GetCharissaLayer2StripXTStripNbr( Layer2_couple[i].X() ) == m_PreTreatedData->GetCharissaLayer2StripXTStripNbr(t) - ||m_PreTreatedData->GetCharissaLayer2StripXTDetectorNbr( Layer2_couple[i].X() ) == m_PreTreatedData->GetCharissaLayer2StripXTDetectorNbr(t)) - Layer2_Si_X_T = m_PreTreatedData->GetCharissaLayer2StripXTTime(t); - } - - double Layer2_Si_Y_T = -1000 ; - - for(unsigned int t = 0 ; t < m_Layer2_StripYTMult ; ++t ) - { - if( m_PreTreatedData->GetCharissaLayer2StripYTStripNbr( Layer2_couple[i].Y() ) == m_PreTreatedData->GetCharissaLayer2StripYTStripNbr(t) - ||m_PreTreatedData->GetCharissaLayer2StripYTDetectorNbr( Layer2_couple[i].Y() ) == m_PreTreatedData->GetCharissaLayer2StripYTDetectorNbr(t)) - Layer2_Si_Y_T = m_PreTreatedData->GetCharissaLayer2StripYTTime(t); - } - - Layer2_Si_X.push_back(Layer2_X) ; Layer2_Si_Y.push_back(Layer2_Y) ; Layer2_TelescopeNumber.push_back(Layer2_N) ; - - if(m_Take_E_Y) Layer2_Si_E.push_back(Layer2_Si_Y_E); - else Layer2_Si_E.push_back(Layer2_Si_X_E); - - if(m_Take_T_Y) Layer2_Si_T.push_back(Layer2_Si_Y_T); - else Layer2_Si_T.push_back(Layer2_Si_X_T); - - // Store the other value for checking purpose - Layer2_Si_EX.push_back(Layer2_Si_X_E); - Layer2_Si_TX.push_back(Layer2_Si_X_T); - Layer2_Si_EY.push_back(Layer2_Si_Y_E); - Layer2_Si_TY.push_back(Layer2_Si_Y_T); - - for(unsigned int j = 0 ; j < m_CsIEMult ; ++j){ - if(m_PreTreatedData->GetCharissaCsIEDetectorNbr(j)==Layer2_N){ - if(Match_Si_CsI( Layer2_X, Layer2_Y , m_PreTreatedData->GetCharissaCsIECristalNbr(j) ) ){ - CsI_N.push_back( m_PreTreatedData->GetCharissaCsIECristalNbr(j) ) ; - CsI_E.push_back( m_PreTreatedData->GetCharissaCsIEEnergy(j) ) ; - - // Look for associate Time - for(unsigned int k =0 ; k < m_CsITMult ; ++k){ - // Same Cristal; Same Detector - if( m_PreTreatedData->GetCharissaCsIECristalNbr(j)==m_PreTreatedData->GetCharissaCsITCristalNbr(k) - && m_PreTreatedData->GetCharissaCsIEDetectorNbr(j)==m_PreTreatedData->GetCharissaCsITDetectorNbr(k) ) - CsI_T.push_back( m_PreTreatedData->GetCharissaCsITTime(j) ) ; break ; - } - check_CSI = true ; - } - } - } + // Case were Layer 1 has not been fired (then layer2 take main role) + else if(Layer2_couple.size()>0){ + for(unsigned int i = 0 ; i < Layer2_couple.size() ; ++i){ + int Layer2_N = m_PreTreatedData->GetCharissaLayer2StripXEDetectorNbr(Layer2_couple[i].X()) ; + int Layer2_X = m_PreTreatedData->GetCharissaLayer2StripXEStripNbr(Layer2_couple[i].X()) ; + int Layer2_Y = m_PreTreatedData->GetCharissaLayer2StripYEStripNbr(Layer2_couple[i].Y()) ; + + double Layer2_Si_X_E = m_PreTreatedData->GetCharissaLayer2StripXEEnergy( Layer2_couple[i].X() ) ; + double Layer2_Si_Y_E = m_PreTreatedData->GetCharissaLayer2StripYEEnergy( Layer2_couple[i].Y() ) ; + + // Search for associate Time + double Layer2_Si_X_T = -1000 ; + + for(unsigned int t = 0 ; t < m_Layer2_StripXTMult ; ++t ){ + if( m_PreTreatedData->GetCharissaLayer2StripXTStripNbr( Layer2_couple[i].X() ) == m_PreTreatedData->GetCharissaLayer2StripXTStripNbr(t) + ||m_PreTreatedData->GetCharissaLayer2StripXTDetectorNbr( Layer2_couple[i].X() ) == m_PreTreatedData->GetCharissaLayer2StripXTDetectorNbr(t)) + Layer2_Si_X_T = m_PreTreatedData->GetCharissaLayer2StripXTTime(t); + } + + double Layer2_Si_Y_T = -1000 ; + + for(unsigned int t = 0 ; t < m_Layer2_StripYTMult ; ++t ){ + if( m_PreTreatedData->GetCharissaLayer2StripYTStripNbr( Layer2_couple[i].Y() ) == m_PreTreatedData->GetCharissaLayer2StripYTStripNbr(t) + ||m_PreTreatedData->GetCharissaLayer2StripYTDetectorNbr( Layer2_couple[i].Y() ) == m_PreTreatedData->GetCharissaLayer2StripYTDetectorNbr(t)) + Layer2_Si_Y_T = m_PreTreatedData->GetCharissaLayer2StripYTTime(t); + } + + Layer2_Si_X.push_back(Layer2_X) ; Layer2_Si_Y.push_back(Layer2_Y) ; TelescopeNumber.push_back(Layer2_N) ; + + if(m_Take_E_Y) Layer2_Si_E.push_back(Layer2_Si_Y_E); + else Layer2_Si_E.push_back(Layer2_Si_X_E); + + if(m_Take_T_Y) Layer2_Si_T.push_back(Layer2_Si_Y_T); + else Layer2_Si_T.push_back(Layer2_Si_X_T); + + // Store the other value for checking purpose + Layer2_Si_EX.push_back(Layer2_Si_X_E); + Layer2_Si_TX.push_back(Layer2_Si_X_T); + Layer2_Si_EY.push_back(Layer2_Si_Y_E); + Layer2_Si_TY.push_back(Layer2_Si_Y_T); + + double CsIE = -1000; + int CsIN = -1000; + // Look for an associate CsI E + for(unsigned int t = 0 ; t < m_CsIEMult ; ++t ){ + if(m_PreTreatedData->GetCharissaLayer2StripXEDetectorNbr( Layer2_couple[i].X() ) == m_PreTreatedData->GetCharissaCsIEDetectorNbr(t)){ + CsIE = m_PreTreatedData->GetCharissaCsIEEnergy(t); + CsIN = m_PreTreatedData->GetCharissaCsIECristalNbr(t); + } + } + + + double CsIT = -1000; + // Look for an associate CsI T + for(unsigned int t = 0 ; t < m_CsITMult ; ++t ){ + if(m_PreTreatedData->GetCharissaLayer2StripXEDetectorNbr( Layer2_couple[i].X() ) == m_PreTreatedData->GetCharissaCsITDetectorNbr(t)) + CsIT = m_PreTreatedData->GetCharissaCsITTime(t); + } - if(!check_CSI){ - CsI_N.push_back(0) ; - CsI_E.push_back(-1000) ; - CsI_T.push_back(-1000) ; - } - } - } - + if(CsIE>-1000){ + CsI_E.push_back(CsIE); + CsI_N.push_back(CsIN); + CsI_T.push_back(CsIT); + } + else{ + CsI_E.push_back(-1000); + CsI_N.push_back(-1000); + CsI_T.push_back(-1000); + } + Layer1_Si_EX.push_back(-1000); + Layer1_Si_TX.push_back(-1000); + Layer1_Si_EY.push_back(-1000); + Layer1_Si_TY.push_back(-1000); + Layer1_Si_X.push_back(-1000) ; + Layer1_Si_Y.push_back(-1000) ; + Layer1_Si_E.push_back(-1000); + Layer1_Si_T.push_back(-1000); + } - + } +EventMultiplicity = Layer1_Si_E.size(); return; - + } /////////////////////////////////////////////////////////////////////////// void TCharissaPhysics::PreTreat(){ - - ClearPreTreatedData(); - m_Layer1_StripXEMult = m_EventData->GetCharissaLayer1StripXEMult(); - m_Layer1_StripYEMult = m_EventData->GetCharissaLayer1StripYEMult(); - m_Layer1_StripXTMult = m_EventData->GetCharissaLayer1StripXTMult(); - m_Layer1_StripYTMult = m_EventData->GetCharissaLayer1StripYTMult(); - - m_Layer2_StripXEMult = m_EventData->GetCharissaLayer2StripXEMult(); - m_Layer2_StripYEMult = m_EventData->GetCharissaLayer2StripYEMult(); - m_Layer2_StripXTMult = m_EventData->GetCharissaLayer2StripXTMult(); - m_Layer2_StripYTMult = m_EventData->GetCharissaLayer2StripYTMult(); - - m_CsIEMult = m_EventData->GetCharissaCsIEMult(); - m_CsITMult = m_EventData->GetCharissaCsITMult(); - + + ClearPreTreatedData(); + m_Layer1_StripXEMult = m_EventData->GetCharissaLayer1StripXEMult(); + m_Layer1_StripYEMult = m_EventData->GetCharissaLayer1StripYEMult(); + m_Layer1_StripXTMult = m_EventData->GetCharissaLayer1StripXTMult(); + m_Layer1_StripYTMult = m_EventData->GetCharissaLayer1StripYTMult(); + + m_Layer2_StripXEMult = m_EventData->GetCharissaLayer2StripXEMult(); + m_Layer2_StripYEMult = m_EventData->GetCharissaLayer2StripYEMult(); + m_Layer2_StripXTMult = m_EventData->GetCharissaLayer2StripXTMult(); + m_Layer2_StripYTMult = m_EventData->GetCharissaLayer2StripYTMult(); + + m_CsIEMult = m_EventData->GetCharissaCsIEMult(); + m_CsITMult = m_EventData->GetCharissaCsITMult(); + // X Layer1 // E for(unsigned int i = 0 ; i < m_Layer1_StripXEMult ; ++i){ @@ -257,7 +340,7 @@ void TCharissaPhysics::PreTreat(){ } } } - + // T for(unsigned int i = 0 ; i < m_Layer1_StripXTMult ; ++i){ if(IsValidChannel("X", m_EventData->GetCharissaLayer1StripXTDetectorNbr(i), m_EventData->GetCharissaLayer1StripXTStripNbr(i))){ @@ -266,7 +349,7 @@ void TCharissaPhysics::PreTreat(){ m_PreTreatedData->SetCharissaLayer1StripXTTime( fDE_X_T(m_EventData , i) ); } } - + // Y Layer1 // E for(unsigned int i = 0 ; i < m_Layer1_StripYEMult ; ++i){ @@ -280,62 +363,62 @@ void TCharissaPhysics::PreTreat(){ } } - // T - for(unsigned int i = 0 ; i < m_Layer1_StripYTMult ; ++i){ - if(IsValidChannel("Y", m_EventData->GetCharissaLayer1StripYTDetectorNbr(i), m_EventData->GetCharissaLayer1StripYTStripNbr(i))){ - m_PreTreatedData->SetCharissaLayer1StripYTDetectorNbr( m_EventData->GetCharissaLayer1StripYTDetectorNbr(i) ); - m_PreTreatedData->SetCharissaLayer1StripYTStripNbr( m_EventData->GetCharissaLayer1StripYTStripNbr(i) ); - m_PreTreatedData->SetCharissaLayer1StripYTTime( fDE_Y_T(m_EventData , i) ); - } - } - - - // X Layer2 - // E - for(unsigned int i = 0 ; i < m_Layer2_StripXEMult ; ++i){ + // T + for(unsigned int i = 0 ; i < m_Layer1_StripYTMult ; ++i){ + if(IsValidChannel("Y", m_EventData->GetCharissaLayer1StripYTDetectorNbr(i), m_EventData->GetCharissaLayer1StripYTStripNbr(i))){ + m_PreTreatedData->SetCharissaLayer1StripYTDetectorNbr( m_EventData->GetCharissaLayer1StripYTDetectorNbr(i) ); + m_PreTreatedData->SetCharissaLayer1StripYTStripNbr( m_EventData->GetCharissaLayer1StripYTStripNbr(i) ); + m_PreTreatedData->SetCharissaLayer1StripYTTime( fDE_Y_T(m_EventData , i) ); + } + } + + + // X Layer2 + // E + for(unsigned int i = 0 ; i < m_Layer2_StripXEMult ; ++i){ if( m_EventData->GetCharissaLayer2StripXEEnergy(i)>m_Si_X_E_RAW_Threshold){ - double Layer2_EX = fE_X_E(m_EventData , i); + double Layer2_EX = fE_X_E(m_EventData , i); if( Layer2_EX > m_Si_X_E_Threshold ){ - - m_PreTreatedData->SetCharissaLayer2StripXEDetectorNbr( m_EventData->GetCharissaLayer2StripXEDetectorNbr(i) ); - m_PreTreatedData->SetCharissaLayer2StripXEStripNbr( m_EventData->GetCharissaLayer2StripXEStripNbr(i) ); - m_PreTreatedData->SetCharissaLayer2StripXEEnergy( Layer2_EX ); - } - } - } - - - // T - for(unsigned int i = 0 ; i < m_Layer2_StripXTMult ; ++i){ - if(IsValidChannel("X", m_EventData->GetCharissaLayer2StripXTDetectorNbr(i), m_EventData->GetCharissaLayer2StripXTStripNbr(i))){ - m_PreTreatedData->SetCharissaLayer2StripXTDetectorNbr( m_EventData->GetCharissaLayer2StripXTDetectorNbr(i) ); - m_PreTreatedData->SetCharissaLayer2StripXTStripNbr( m_EventData->GetCharissaLayer2StripXTStripNbr(i) ); - m_PreTreatedData->SetCharissaLayer2StripXTTime( fE_X_T(m_EventData , i) ); - } - } - - // Y Layer2 - // E - for(unsigned int i = 0 ; i < m_Layer2_StripYEMult ; ++i){ - if( m_EventData->GetCharissaLayer2StripYEEnergy(i)>m_Si_Y_E_RAW_Threshold){ - double Layer2_EY = fE_Y_E(m_EventData , i); - if( Layer2_EY >m_Si_Y_E_Threshold ){ - m_PreTreatedData->SetCharissaLayer2StripYEDetectorNbr( m_EventData->GetCharissaLayer2StripYEDetectorNbr(i) ); - m_PreTreatedData->SetCharissaLayer2StripYEStripNbr( m_EventData->GetCharissaLayer2StripYEStripNbr(i) ); - m_PreTreatedData->SetCharissaLayer2StripYEEnergy( Layer2_EY ); - } - } - } - + + m_PreTreatedData->SetCharissaLayer2StripXEDetectorNbr( m_EventData->GetCharissaLayer2StripXEDetectorNbr(i) ); + m_PreTreatedData->SetCharissaLayer2StripXEStripNbr( m_EventData->GetCharissaLayer2StripXEStripNbr(i) ); + m_PreTreatedData->SetCharissaLayer2StripXEEnergy( Layer2_EX ); + } + } + } + + // T - for(unsigned int i = 0 ; i < m_Layer2_StripYTMult ; ++i){ - if( IsValidChannel("Y", m_EventData->GetCharissaLayer2StripYTDetectorNbr(i), m_EventData->GetCharissaLayer1StripYTStripNbr(i))){ - m_PreTreatedData->SetCharissaLayer2StripYTDetectorNbr( m_EventData->GetCharissaLayer2StripYTDetectorNbr(i) ); - m_PreTreatedData->SetCharissaLayer2StripYTStripNbr( m_EventData->GetCharissaLayer2StripYTStripNbr(i) ); - m_PreTreatedData->SetCharissaLayer2StripYTTime( fE_Y_T(m_EventData,i) ); - } - } - + for(unsigned int i = 0 ; i < m_Layer2_StripXTMult ; ++i){ + if(IsValidChannel("X", m_EventData->GetCharissaLayer2StripXTDetectorNbr(i), m_EventData->GetCharissaLayer2StripXTStripNbr(i))){ + m_PreTreatedData->SetCharissaLayer2StripXTDetectorNbr( m_EventData->GetCharissaLayer2StripXTDetectorNbr(i) ); + m_PreTreatedData->SetCharissaLayer2StripXTStripNbr( m_EventData->GetCharissaLayer2StripXTStripNbr(i) ); + m_PreTreatedData->SetCharissaLayer2StripXTTime( fE_X_T(m_EventData , i) ); + } + } + + // Y Layer2 + // E + for(unsigned int i = 0 ; i < m_Layer2_StripYEMult ; ++i){ + if( m_EventData->GetCharissaLayer2StripYEEnergy(i)>m_Si_Y_E_RAW_Threshold){ + double Layer2_EY = fE_Y_E(m_EventData , i); + if( Layer2_EY >m_Si_Y_E_Threshold ){ + m_PreTreatedData->SetCharissaLayer2StripYEDetectorNbr( m_EventData->GetCharissaLayer2StripYEDetectorNbr(i) ); + m_PreTreatedData->SetCharissaLayer2StripYEStripNbr( m_EventData->GetCharissaLayer2StripYEStripNbr(i) ); + m_PreTreatedData->SetCharissaLayer2StripYEEnergy( Layer2_EY ); + } + } + } + + // T + for(unsigned int i = 0 ; i < m_Layer2_StripYTMult ; ++i){ + if( IsValidChannel("Y", m_EventData->GetCharissaLayer2StripYTDetectorNbr(i), m_EventData->GetCharissaLayer1StripYTStripNbr(i))){ + m_PreTreatedData->SetCharissaLayer2StripYTDetectorNbr( m_EventData->GetCharissaLayer2StripYTDetectorNbr(i) ); + m_PreTreatedData->SetCharissaLayer2StripYTStripNbr( m_EventData->GetCharissaLayer2StripYTStripNbr(i) ); + m_PreTreatedData->SetCharissaLayer2StripYTTime( fE_Y_T(m_EventData,i) ); + } + } + // CsI // E for(unsigned int i = 0 ; i < m_CsIEMult ; ++i){ @@ -348,7 +431,7 @@ void TCharissaPhysics::PreTreat(){ } } } - + // T for(unsigned int i = 0 ; i < m_CsITMult ; ++i){ if(IsValidChannel("CsI", m_EventData->GetCharissaCsITDetectorNbr(i), m_EventData->GetCharissaCsITCristalNbr(i))){ @@ -357,37 +440,20 @@ void TCharissaPhysics::PreTreat(){ m_PreTreatedData->SetCharissaCsITTime( fCsI_T(m_EventData , i) ); } } - + return; } /////////////////////////////////////////////////////////////////////////// int TCharissaPhysics :: Layer1_CheckEvent(){ - // Check the size of the different elements - if( m_PreTreatedData->GetCharissaLayer1StripXEMult() == m_PreTreatedData->GetCharissaLayer1StripYEMult() /*&& m_PreTreatedData->GetCharissaLayer1StripYEMult() == m_PreTreatedData->GetCharissaLayer1StripXTMult() && m_PreTreatedData->GetCharissaLayer1StripXTMult() == m_PreTreatedData->GetCharissaLayer1StripYTMult()*/ ) - return 1 ; // Regular Event - - else if( m_PreTreatedData->GetCharissaLayer1StripXEMult() == m_PreTreatedData->GetCharissaLayer1StripYEMult()+1 || m_PreTreatedData->GetCharissaLayer1StripXEMult() == m_PreTreatedData->GetCharissaLayer1StripYEMult()-1 ) - return 2 ; // Pseudo Event, potentially interstrip - - else - return -1 ; // Rejected Event - + return 1; } /////////////////////////////////////////////////////////////////////////// int TCharissaPhysics :: Layer2_CheckEvent(){ - // Check the size of the different elements - if( m_PreTreatedData->GetCharissaLayer2StripXEMult() == m_PreTreatedData->GetCharissaLayer2StripYEMult() /*&& m_PreTreatedData->GetCharissaLayer1StripYEMult() == m_PreTreatedData->GetCharissaLayer1StripXTMult() && m_PreTreatedData->GetCharissaLayer1StripXTMult() == m_PreTreatedData->GetCharissaLayer1StripYTMult()*/ ) - return 1 ; // Regular Event - - else if( m_PreTreatedData->GetCharissaLayer2StripXEMult() == m_PreTreatedData->GetCharissaLayer2StripYEMult()+1 || m_PreTreatedData->GetCharissaLayer2StripXEMult() == m_PreTreatedData->GetCharissaLayer2StripYEMult()-1 ) - return 2 ; // Pseudo Event, potentially interstrip - - else - return -1 ; // Rejected Event - + return 1 ; + } /////////////////////////////////////////////////////////////////////////// @@ -399,88 +465,56 @@ bool TCharissaPhysics :: ResolvePseudoEvent(){ vector < TVector2 > TCharissaPhysics :: Layer1_Match_X_Y(){ vector < TVector2 > ArrayOfGoodCouple ; m_Layer1_StripXEMult = m_PreTreatedData->GetCharissaLayer1StripXEMult(); - m_Layer1_StripYEMult = m_PreTreatedData->GetCharissaLayer1StripXEMult(); - + m_Layer1_StripYEMult = m_PreTreatedData->GetCharissaLayer1StripYEMult(); + // Prevent code from treating very high multiplicity Event // Those event are not physical anyway and that improve speed. if( m_Layer1_StripXEMult > m_MaximumStripMultiplicityAllowed || m_Layer1_StripYEMult > m_MaximumStripMultiplicityAllowed ) return ArrayOfGoodCouple; - + for(unsigned int i = 0 ; i < m_Layer1_StripXEMult ; ++i){ - for(unsigned int j = 0 ; j < m_Layer1_StripYEMult ; j++){ + for(unsigned int j = 0 ; j < m_Layer1_StripYEMult ; ++j){ // if same detector check energy if ( m_PreTreatedData->GetCharissaLayer1StripXEDetectorNbr(i) == m_PreTreatedData->GetCharissaLayer1StripYEDetectorNbr(j) ){ // Look if energy match - if( abs( (m_PreTreatedData->GetCharissaLayer1StripXEEnergy(i)-m_PreTreatedData->GetCharissaLayer1StripYEEnergy(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<m_NumberOfStrip ; ++hh ){ - if( Match_Si_CsI(m_PreTreatedData->GetCharissaLayer1StripXEStripNbr(i), m_PreTreatedData->GetCharissaLayer1StripYEStripNbr(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) ) ; - } + if( abs( (m_PreTreatedData->GetCharissaLayer1StripXEEnergy(i)-m_PreTreatedData->GetCharissaLayer1StripYEEnergy(j))/2. ) < m_StripEnergyMatchingNumberOfSigma*m_StripEnergyMatchingSigma ) + ArrayOfGoodCouple . push_back ( TVector2(i,j) ) ; } } } - - // Prevent to treat event with ambiguous matchin beetween X and Y + + // Prevent to treat event with ambiguous matching beetween X and Y if( ArrayOfGoodCouple.size() > m_Layer1_StripXEMult ) ArrayOfGoodCouple.clear() ; - + return ArrayOfGoodCouple; } /////////////////////////////////////////////////////////////////////////// vector < TVector2 > TCharissaPhysics :: Layer2_Match_X_Y(){ - vector < TVector2 > ArrayOfGoodCouple ; - m_Layer2_StripXEMult = m_PreTreatedData->GetCharissaLayer2StripXEMult(); - m_Layer2_StripYEMult = m_PreTreatedData->GetCharissaLayer2StripXEMult(); - - // Prevent code from treating very high multiplicity Event - // Those event are not physical anyway and that improve speed. - if( m_Layer2_StripXEMult > m_MaximumStripMultiplicityAllowed || m_Layer2_StripYEMult > m_MaximumStripMultiplicityAllowed ) - return ArrayOfGoodCouple; - - for(unsigned int i = 0 ; i < m_Layer2_StripXEMult ; ++i){ - for(unsigned int j = 0 ; j < m_Layer2_StripYEMult ; j++){ - // if same detector check energy - if ( m_PreTreatedData->GetCharissaLayer2StripXEDetectorNbr(i) == m_PreTreatedData->GetCharissaLayer2StripYEDetectorNbr(j) ){ - // Look if energy match - if( abs( (m_PreTreatedData->GetCharissaLayer2StripXEEnergy(i)-m_PreTreatedData->GetCharissaLayer2StripYEEnergy(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<m_NumberOfStrip ; ++hh ){ - if( Match_Si_CsI(m_PreTreatedData->GetCharissaLayer2StripXEStripNbr(i), m_PreTreatedData->GetCharissaLayer2StripYEStripNbr(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_Layer2_StripXEMult ) ArrayOfGoodCouple.clear() ; - - return ArrayOfGoodCouple; + vector < TVector2 > ArrayOfGoodCouple ; + m_Layer2_StripXEMult = m_PreTreatedData->GetCharissaLayer2StripXEMult(); + m_Layer2_StripYEMult = m_PreTreatedData->GetCharissaLayer2StripYEMult(); + + // Prevent code from treating very high multiplicity Event + // Those event are not physical anyway and that improve speed. + if( m_Layer2_StripXEMult > m_MaximumStripMultiplicityAllowed || m_Layer2_StripYEMult > m_MaximumStripMultiplicityAllowed ) + return ArrayOfGoodCouple; + + for(unsigned int i = 0 ; i < m_Layer2_StripXEMult ; ++i){ + for(unsigned int j = 0 ; j < m_Layer2_StripYEMult ; ++j){ + // if same detector check energy + if ( m_PreTreatedData->GetCharissaLayer2StripXEDetectorNbr(i) == m_PreTreatedData->GetCharissaLayer2StripYEDetectorNbr(j) ){ + // Look if energy match + if( abs( (m_PreTreatedData->GetCharissaLayer2StripXEEnergy(i)-m_PreTreatedData->GetCharissaLayer2StripYEEnergy(j))/2. ) < m_StripEnergyMatchingNumberOfSigma*m_StripEnergyMatchingSigma ) + ArrayOfGoodCouple . push_back ( TVector2(i,j) ) ; + } + } + } + + // Prevent to treat event with ambiguous matching beetween X and Y + if( ArrayOfGoodCouple.size() > m_Layer2_StripXEMult ) ArrayOfGoodCouple.clear() ; + + return ArrayOfGoodCouple; } @@ -489,35 +523,35 @@ vector < TVector2 > TCharissaPhysics :: Layer2_Match_X_Y(){ //////////////////////////////////////////////////////////////////////////// bool TCharissaPhysics :: IsValidChannel(const string DetectorType, const int telescope , const int channel){ - if(DetectorType == "CsI") - return *(m_CsIChannelStatus[telescope-1].begin()+channel-1); - + if(DetectorType == "CsI") + return *(m_CsIChannelStatus[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 TCharissaPhysics::ReadAnalysisConfig(){ bool ReadingStatus = false; - + // path to file string FileName = "./configs/ConfigCharissa.dat"; - + // open analysis config file ifstream AnalysisConfigFile; AnalysisConfigFile.open(FileName.c_str()); - + if (!AnalysisConfigFile.is_open()) { cout << " No ConfigCharissa.dat found: Default parameters loaded for Analysis " << FileName << endl; return; } cout << " Loading user parameters for Analysis from ConfigCharissa.dat " << endl; - + // Save it in a TAsciiFile TAsciiFile* asciiConfig = RootOutput::getInstance()->GetAsciiFileAnalysisConfig(); asciiConfig->AppendLine("%%% ConfigCharissaCHARISSA.dat %%%"); @@ -528,39 +562,39 @@ void TCharissaPhysics::ReadAnalysisConfig(){ while (!AnalysisConfigFile.eof()) { // Pick-up next line getline(AnalysisConfigFile, LineBuffer); - + // search for "header" if (LineBuffer.compare(0, 11, "ConfigCharissa") == 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; @@ -572,7 +606,7 @@ void TCharissaPhysics::ReadAnalysisConfig(){ ChannelStatus.resize(m_NumberOfStrip,false); m_CsIChannelStatus[telescope-1] = ChannelStatus; } - + else if (whatToDo == "DISABLE_CHANNEL") { AnalysisConfigFile >> DataBuffer; cout << whatToDo << " " << DataBuffer << endl; @@ -582,239 +616,130 @@ void TCharissaPhysics::ReadAnalysisConfig(){ 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,3,"CSI") == 0) { channel = atoi(DataBuffer.substr(6).c_str()); *(m_CsIChannelStatus[telescope-1].begin()+channel-1) = false; } - + else cout << "Warning: detector type for CharissaCHARISSA 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=="SI_X_E_RAW_THRESHOLD") { AnalysisConfigFile >> DataBuffer; m_Si_X_E_RAW_Threshold = atoi(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 = atoi(DataBuffer.c_str()); cout << whatToDo << " " << m_Si_Y_E_RAW_Threshold << endl; } - - + + else if (whatToDo== "CSI_E_RAW_THRESHOLD") { AnalysisConfigFile >> DataBuffer; m_CsI_E_Threshold = atoi(DataBuffer.c_str()); cout << whatToDo << " " << m_CsI_E_Threshold << endl; } - + else if (whatToDo=="SI_X_E_THRESHOLD") { AnalysisConfigFile >> DataBuffer; m_Si_X_E_Threshold = atoi(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 = atoi(DataBuffer.c_str()); cout << whatToDo << " " << m_Si_Y_E_Threshold << endl; } - - + + else if (whatToDo=="CSI_E_THRESHOLD") { AnalysisConfigFile >> DataBuffer; m_CsI_E_Threshold = atoi(DataBuffer.c_str()); cout << whatToDo << " " << m_CsI_E_Threshold << endl; } - + else { ReadingStatus = false; } - + } } } - - - -/////////////////////////////////////////////////////////////////////////// -bool TCharissaPhysics :: Match_Si_CsI(int X, int Y , int CristalNbr){ - - if( abs(m_CsI_MatchingX[CristalNbr-1] - X) < m_CsI_Size/2.&& - abs(m_CsI_MatchingY[CristalNbr-1] - Y) < m_CsI_Size/2.) - - return true ; - - else return false; - -} - /////////////////////////////////////////////////////////////////////////// void TCharissaPhysics::Clear(){ - EventMultiplicity= 0 ; - - Layer1_TelescopeNumber.clear(); - EventType.clear(); - TotalEnergy.clear(); - - // Si X - Layer1_Si_E.clear(); - Layer1_Si_T.clear(); - Layer1_Si_X.clear(); - Layer1_Si_Y.clear(); - Layer2_Si_E.clear(); - Layer2_Si_T.clear(); - Layer2_Si_X.clear(); - Layer2_Si_Y.clear(); - - - // CsI - CsI_E.clear(); - CsI_T.clear(); - CsI_N.clear(); - - Layer1_Si_EX.clear(); - Layer1_Si_TX.clear(); - Layer1_Si_EY.clear(); - Layer1_Si_TY.clear(); - Layer1_TelescopeNumber_X.clear(); - Layer1_TelescopeNumber_Y.clear(); - Layer2_Si_EX.clear(); - Layer2_Si_TX.clear(); - Layer2_Si_EY.clear(); - Layer2_Si_TY.clear(); - Layer2_TelescopeNumber_X.clear(); - Layer2_TelescopeNumber_Y.clear(); -} -/////////////////////////////////////////////////////////////////////////// + EventMultiplicity= 0 ; + TelescopeNumber.clear(); + // Si X + Layer1_Si_E.clear(); + Layer1_Si_T.clear(); + Layer1_Si_X.clear(); + Layer1_Si_Y.clear(); + Layer2_Si_E.clear(); + Layer2_Si_T.clear(); + Layer2_Si_X.clear(); + Layer2_Si_Y.clear(); -void TCharissaPhysics::ReadCalibrationRun(){ - m_Layer1_StripXEMult = m_EventData->GetCharissaLayer1StripXEMult(); - m_Layer1_StripYEMult = m_EventData->GetCharissaLayer1StripYEMult(); - m_Layer1_StripXTMult = m_EventData->GetCharissaLayer1StripXTMult(); - m_Layer1_StripYTMult = m_EventData->GetCharissaLayer1StripYTMult(); - m_Layer2_StripXEMult = m_EventData->GetCharissaLayer2StripXEMult(); - m_Layer2_StripYEMult = m_EventData->GetCharissaLayer2StripYEMult(); - m_Layer2_StripXTMult = m_EventData->GetCharissaLayer2StripXTMult(); - m_Layer2_StripYTMult = m_EventData->GetCharissaLayer2StripYTMult(); - m_CsIEMult = m_EventData->GetCharissaCsIEMult(); - m_CsITMult = m_EventData->GetCharissaCsITMult(); - - // X Layer 1 - // E - for(unsigned int i = 0 ; i < m_Layer1_StripXEMult;++i){ - Layer1_TelescopeNumber_X.push_back(m_EventData->GetCharissaLayer1StripXEDetectorNbr(i)); - Layer1_Si_EX.push_back( fDE_X_E( m_EventData , i) ); - Layer1_Si_X.push_back(m_EventData->GetCharissaLayer1StripXEStripNbr(i)); - } - // T - for(unsigned int i = 0 ; i < m_Layer1_StripXTMult;++i){ - Layer1_TelescopeNumber_X.push_back(m_EventData->GetCharissaLayer1StripXTDetectorNbr(i)); - Layer1_Si_TX.push_back( fDE_X_T( m_EventData , i) ); - Layer1_Si_X.push_back(m_EventData->GetCharissaLayer1StripXTStripNbr(i)); - } - - // Y Layer 1 - // E - for(unsigned int i = 0 ; i < m_Layer1_StripYEMult;++i){ - Layer1_TelescopeNumber_Y.push_back(m_EventData->GetCharissaLayer1StripYEDetectorNbr(i)); - Layer1_Si_EY.push_back( fDE_Y_E( m_EventData , i) ); - Layer1_Si_Y.push_back(m_EventData->GetCharissaLayer1StripYEStripNbr(i)); - } - - // T - for(unsigned int i = 0 ; i < m_Layer1_StripYTMult;++i){ - Layer1_TelescopeNumber_Y.push_back(m_EventData->GetCharissaLayer1StripYTDetectorNbr(i)); - Layer1_Si_TY.push_back( fDE_Y_T( m_EventData , i) ); - Layer1_Si_Y.push_back(m_EventData->GetCharissaLayer1StripYTStripNbr(i)); - } - - - // X Layer 2 - // E - for(unsigned int i = 0 ; i < m_Layer2_StripXEMult;++i){ - Layer2_TelescopeNumber_X.push_back(m_EventData->GetCharissaLayer2StripXEDetectorNbr(i)); - Layer2_Si_EX.push_back( fE_X_E( m_EventData , i) ); - Layer2_Si_X.push_back(m_EventData->GetCharissaLayer2StripXEStripNbr(i)); - } - // T - for(unsigned int i = 0 ; i < m_Layer2_StripXTMult;++i){ - Layer2_TelescopeNumber_X.push_back(m_EventData->GetCharissaLayer2StripXTDetectorNbr(i)); - Layer2_Si_TX.push_back( fE_X_T( m_EventData , i) ); - Layer2_Si_X.push_back(m_EventData->GetCharissaLayer2StripXTStripNbr(i)); - } - - // Y Layer 2 - // E - for(unsigned int i = 0 ; i < m_Layer2_StripYEMult;++i){ - Layer2_TelescopeNumber_Y.push_back(m_EventData->GetCharissaLayer2StripYEDetectorNbr(i)); - Layer2_Si_EY.push_back( fE_Y_E( m_EventData , i) ); - Layer2_Si_Y.push_back(m_EventData->GetCharissaLayer2StripYEStripNbr(i)); - } - - // T - for(unsigned int i = 0 ; i < m_Layer2_StripYTMult;++i){ - Layer2_TelescopeNumber_Y.push_back(m_EventData->GetCharissaLayer2StripYTDetectorNbr(i)); - Layer2_Si_TY.push_back( fE_Y_T( m_EventData , i) ); - Layer2_Si_Y.push_back(m_EventData->GetCharissaLayer2StripYTStripNbr(i)); - } - - - //CsI Energy - for(unsigned int j = 0 ; j < m_CsIEMult ; ++j){ - CsI_N.push_back(m_EventData->GetCharissaCsIECristalNbr(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)) ; - } - + // CsI + CsI_E.clear(); + CsI_T.clear(); + CsI_N.clear(); + + Layer1_Si_EX.clear(); + Layer1_Si_TX.clear(); + Layer1_Si_EY.clear(); + Layer1_Si_TY.clear(); + Layer2_Si_EX.clear(); + Layer2_Si_TX.clear(); + Layer2_Si_EY.clear(); + Layer2_Si_TY.clear(); } + //// Innherited from VDetector Class //// /////////////////////////////////////////////////////////////////////////// @@ -823,65 +748,65 @@ void TCharissaPhysics::ReadConfiguration(string Path){ 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 ; - - } - + + } + // 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 ; @@ -890,13 +815,13 @@ void TCharissaPhysics::ReadConfiguration(string Path){ 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 ; @@ -905,13 +830,13 @@ void TCharissaPhysics::ReadConfiguration(string Path){ 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 ; @@ -920,12 +845,12 @@ void TCharissaPhysics::ReadConfiguration(string Path){ 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 ; @@ -934,41 +859,41 @@ void TCharissaPhysics::ReadConfiguration(string Path){ 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; @@ -979,64 +904,65 @@ void TCharissaPhysics::ReadConfiguration(string Path){ 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 ; - } + { + 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 ; } - + } + } + InitializeStandardParameter(); ReadAnalysisConfig(); - + cout << endl << "/////////////////////////////" << endl << endl; - + } /////////////////////////////////////////////////////////////////////////// void TCharissaPhysics::InitSpectra(){ - m_Spectra = new TCharissaSpectra(m_NumberOfTelescope); + m_Spectra = new TCharissaSpectra(m_NumberOfTelescope); } /////////////////////////////////////////////////////////////////////////// void TCharissaPhysics::FillSpectra(){ - m_Spectra -> FillRawSpectra(m_EventData); - m_Spectra -> FillPreTreatedSpectra(m_PreTreatedData); + m_Spectra -> FillRawSpectra(m_EventData); + m_Spectra -> FillPreTreatedSpectra(m_PreTreatedData); + m_Spectra->FillPhysicsSpectra(m_EventPhysics); } /////////////////////////////////////////////////////////////////////////// void TCharissaPhysics::CheckSpectra(){ @@ -1047,35 +973,40 @@ void TCharissaPhysics::ClearSpectra(){ // To be done } /////////////////////////////////////////////////////////////////////////// -map< vector<TString> , TH1*> TCharissaPhysics::GetSpectra() { -return m_Spectra->GetMapHisto(); +map< vector<string> , TH1*> TCharissaPhysics::GetSpectra() { + if(m_Spectra) + return m_Spectra->GetMapHisto(); + else{ + map< vector<string> , TH1*> empty; + return empty; + } } /////////////////////////////////////////////////////////////////////////// void TCharissaPhysics::AddParameterToCalibrationManager() { CalibrationManager* Cal = CalibrationManager::getInstance(); - - for(int i = 0 ; i < m_NumberOfTelescope ; ++i){ - - for( int j = 0 ; j < m_NumberOfStrip ; ++j){ + + for(unsigned int i = 0 ; i < m_NumberOfTelescope ; ++i){ + + for(unsigned int j = 0 ; j < m_NumberOfStrip ; ++j){ Cal->AddParameter("CHARISSA", "T"+itoa(i+1)+"_DE_X"+itoa(j+1)+"_E","CHARISSA_T"+itoa(i+1)+"_DE_X"+itoa(j+1)+"_E") ; Cal->AddParameter("CHARISSA", "T"+itoa(i+1)+"_DE_Y"+itoa(j+1)+"_E","CHARISSA_T"+itoa(i+1)+"_DE_Y"+itoa(j+1)+"_E") ; Cal->AddParameter("CHARISSA", "T"+itoa(i+1)+"_DE_X"+itoa(j+1)+"_T","CHARISSA_T"+itoa(i+1)+"_DE_X"+itoa(j+1)+"_T") ; Cal->AddParameter("CHARISSA", "T"+itoa(i+1)+"_DE_Y"+itoa(j+1)+"_T","CHARISSA_T"+itoa(i+1)+"_DE_Y"+itoa(j+1)+"_T") ; - + Cal->AddParameter("CHARISSA", "T"+itoa(i+1)+"_E_X"+itoa(j+1)+"_E","CHARISSA_T"+itoa(i+1)+"_E_X"+itoa(j+1)+"_E") ; Cal->AddParameter("CHARISSA", "T"+itoa(i+1)+"_E_Y"+itoa(j+1)+"_E","CHARISSA_T"+itoa(i+1)+"_E_Y"+itoa(j+1)+"_E") ; Cal->AddParameter("CHARISSA", "T"+itoa(i+1)+"_E_X"+itoa(j+1)+"_T","CHARISSA_T"+itoa(i+1)+"_E_X"+itoa(j+1)+"_T") ; Cal->AddParameter("CHARISSA", "T"+itoa(i+1)+"_E_Y"+itoa(j+1)+"_T","CHARISSA_T"+itoa(i+1)+"_E_Y"+itoa(j+1)+"_T") ; - } - - Cal->AddParameter("CHARISSA", "T"+itoa(i+1)+"_CsI_E","CHARISSA_T"+itoa(i+1)+"_CsI_E") ; - Cal->AddParameter("CHARISSA", "T"+itoa(i+1)+"_CsI_T","CHARISSA_T"+itoa(i+1)+"_CsI_T") ; - + } + + Cal->AddParameter("CHARISSA", "T"+itoa(i+1)+"_CsI_E","CHARISSA_T"+itoa(i+1)+"_CsI_E") ; + Cal->AddParameter("CHARISSA", "T"+itoa(i+1)+"_CsI_T","CHARISSA_T"+itoa(i+1)+"_CsI_T") ; + } - + return; - + } /////////////////////////////////////////////////////////////////////////// @@ -1090,37 +1021,30 @@ void TCharissaPhysics::InitializeRootInputRaw() /////////////////////////////////////////////////////////////////////////// void TCharissaPhysics::InitializeRootInputPhysics() { - TChain* inputChain = RootInput::getInstance()->GetChain(); - inputChain->SetBranchStatus( "CHARISSA" , true ); - inputChain->SetBranchStatus( "EventMultiplicity" , true ); - inputChain->SetBranchStatus( "EventType" , true ); - inputChain->SetBranchStatus( "Layer1_TelescopeNumber" , true ); - inputChain->SetBranchStatus( "Layer1_Si_E" , true ); - inputChain->SetBranchStatus( "Layer1_Si_T" , true ); - inputChain->SetBranchStatus( "Layer1_Si_X" , true ); - inputChain->SetBranchStatus( "Layer1_Si_Y" , true ); - inputChain->SetBranchStatus( "Layer1_Si_EX" , true ); - inputChain->SetBranchStatus( "Layer1_Si_TX" , true ); - inputChain->SetBranchStatus( "Layer1_Si_EY" , true ); - inputChain->SetBranchStatus( "Layer1_Si_TY" , true ); - inputChain->SetBranchStatus( "Layer1_TelescopeNumber_X" , true ); - inputChain->SetBranchStatus( "Layer1_TelescopeNumber_Y" , true ); - inputChain->SetBranchStatus( "Layer2_TelescopeNumber" , true ); - inputChain->SetBranchStatus( "Layer2_Si_E" , true ); - inputChain->SetBranchStatus( "Layer2_Si_T" , true ); - inputChain->SetBranchStatus( "Layer2_Si_X" , true ); - inputChain->SetBranchStatus( "Layer2_Si_Y" , true ); - inputChain->SetBranchStatus( "Layer2_Si_EX" , true ); - inputChain->SetBranchStatus( "Layer2_Si_TX" , true ); - inputChain->SetBranchStatus( "Layer2_Si_EY" , true ); - inputChain->SetBranchStatus( "Layer2_Si_TY" , true ); - inputChain->SetBranchStatus( "Layer2_TelescopeNumber_X" , true ); - inputChain->SetBranchStatus( "Layer2_TelescopeNumber_Y" , true ); - inputChain->SetBranchStatus( "CsI_E" , true ); - inputChain->SetBranchStatus( "CsI_T" , true ); - inputChain->SetBranchStatus( "CsI_N" , true ); - inputChain->SetBranchStatus( "TotalEnergy" , true ); - inputChain->SetBranchAddress( "CHARISSA" , &m_EventPhysics); + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus( "CHARISSA" , true ); + inputChain->SetBranchStatus( "EventMultiplicity" , true ); + inputChain->SetBranchStatus( "TelescopeNumber" , true ); + inputChain->SetBranchStatus( "Layer1_Si_E" , true ); + inputChain->SetBranchStatus( "Layer1_Si_T" , true ); + inputChain->SetBranchStatus( "Layer1_Si_X" , true ); + inputChain->SetBranchStatus( "Layer1_Si_Y" , true ); + inputChain->SetBranchStatus( "Layer1_Si_EX" , true ); + inputChain->SetBranchStatus( "Layer1_Si_TX" , true ); + inputChain->SetBranchStatus( "Layer1_Si_EY" , true ); + inputChain->SetBranchStatus( "Layer1_Si_TY" , true ); + inputChain->SetBranchStatus( "Layer2_Si_E" , true ); + inputChain->SetBranchStatus( "Layer2_Si_T" , true ); + inputChain->SetBranchStatus( "Layer2_Si_X" , true ); + inputChain->SetBranchStatus( "Layer2_Si_Y" , true ); + inputChain->SetBranchStatus( "Layer2_Si_EX" , true ); + inputChain->SetBranchStatus( "Layer2_Si_TX" , true ); + inputChain->SetBranchStatus( "Layer2_Si_EY" , true ); + inputChain->SetBranchStatus( "Layer2_Si_TY" , true ); + inputChain->SetBranchStatus( "CsI_E" , true ); + inputChain->SetBranchStatus( "CsI_T" , true ); + inputChain->SetBranchStatus( "CsI_N" , true ); + inputChain->SetBranchAddress( "CHARISSA" , &m_EventPhysics); } /////////////////////////////////////////////////////////////////////////// @@ -1133,68 +1057,65 @@ void TCharissaPhysics::InitializeRootOutput() ///// Specific to CHARISSAArray //// ///////////////////////////////////////////////////////////////////////////////////// -void TCharissaPhysics::AddTelescope( TVector3 C_X1_Y1, - TVector3 C_X16_Y1, - TVector3 C_X1_Y16, - TVector3 C_X16_Y16) -{ +void TCharissaPhysics::AddTelescope(TVector3 C_X1_Y1, TVector3 C_X16_Y1, + TVector3 C_X1_Y16,TVector3 C_X16_Y16){ // To avoid warning C_X16_Y16 *= 1; - + m_NumberOfTelescope++; - + // Vector U on Telescope Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis) TVector3 U = C_X16_Y1 - C_X1_Y1 ; - double Ushift = (U.Mag()-98)/2.; + double Ushift = (U.Mag()-50)/2.; U = U.Unit(); // Vector V on Telescope Face (parallele to X Strip) TVector3 V = C_X1_Y16 - C_X1_Y1 ; - double Vshift = (V.Mag() -98)/2. ; + double Vshift = (V.Mag() -50)/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 Face = 50; //mm double NumberOfStrip = m_NumberOfStrip; double StripPitch = Face/NumberOfStrip ; //mm - // Buffer object to fill Position Array + // 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 < m_NumberOfStrip ; ++i ) - { + + for(unsigned int i = 0 ; i < m_NumberOfStrip ; ++i ) + { lineX.clear() ; lineY.clear() ; lineZ.clear() ; - - for( int j = 0 ; j < m_NumberOfStrip ; ++j ) - { + + for(unsigned int j = 0 ; j < m_NumberOfStrip ; ++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); - - } + + } m_StripPositionX.push_back( OneTelescopeStripPositionX ) ; m_StripPositionY.push_back( OneTelescopeStripPositionY ) ; m_StripPositionZ.push_back( OneTelescopeStripPositionZ ) ; - + } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1205,45 +1126,45 @@ void TCharissaPhysics::InitializeStandardParameter() m_XChannelStatus.clear() ; m_YChannelStatus.clear() ; m_CsIChannelStatus.clear() ; - + ChannelStatus.resize(m_NumberOfStrip,true); - for(int i = 0 ; i < m_NumberOfTelescope ; ++i) - { + for(unsigned int i = 0 ; i < m_NumberOfTelescope ; ++i) + { m_XChannelStatus[i] = ChannelStatus; m_YChannelStatus[i] = ChannelStatus; - } - + } + ChannelStatus.resize(m_NumberOfStrip,true); - for(int i = 0 ; i < m_NumberOfTelescope ; ++i) - { + for(unsigned int i = 0 ; i < m_NumberOfTelescope ; ++i) + { m_CsIChannelStatus[i] = ChannelStatus; - } - - + } + + m_MaximumStripMultiplicityAllowed = m_NumberOfTelescope ; - + return; } ////////////////////////////////////////////////////////////////////////////////////////////// void TCharissaPhysics::AddTelescope( 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_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) @@ -1252,72 +1173,72 @@ void TCharissaPhysics::AddTelescope( double theta, 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) ); - + distance * sin(theta) * sin(phi) , + distance * cos(theta) ); + TVector3 P = TVector3( cos(theta ) * cos(phi) , - cos(theta ) * sin(phi) , - -sin(theta) ); - + 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 = m_NumberOfStrip ; 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 < m_NumberOfStrip ; ++i ) - { - + + for(unsigned int i = 0 ; i < m_NumberOfStrip ; ++i ) + { + lineX.clear() ; lineY.clear() ; lineZ.clear() ; - - for( int j = 0 ; j < m_NumberOfStrip ; ++j ) - { + + for(unsigned int j = 0 ; j < m_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) ; - - } - + + } + 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 ) ; @@ -1325,36 +1246,45 @@ void TCharissaPhysics::AddTelescope( double theta, ////////////////////////////////////////////////////////////////////////////////////////////// -TVector3 TCharissaPhysics::GetPositionOfInteraction(const int i) const -{ - TVector3 Position = TVector3 ( GetStripPositionX( Layer1_TelescopeNumber[i] , Layer1_Si_X[i] , Layer1_Si_Y[i] ) , - GetStripPositionY( Layer1_TelescopeNumber[i] , Layer1_Si_X[i] , Layer1_Si_Y[i] ) , - GetStripPositionZ( Layer1_TelescopeNumber[i] , Layer1_Si_X[i] , Layer1_Si_Y[i] ) ) ; - +TVector3 TCharissaPhysics::GetPositionOfInteraction(const int i) const{ + TVector3 Position ; + + if(Layer1_Si_X[i] > -1000 && Layer1_Si_Y[i] >-1000) + Position = TVector3 ( GetStripPositionX( TelescopeNumber[i] , Layer1_Si_X[i] , Layer1_Si_Y[i] ) , + GetStripPositionY( TelescopeNumber[i] , Layer1_Si_X[i] , Layer1_Si_Y[i] ) , + GetStripPositionZ( TelescopeNumber[i] , Layer1_Si_X[i] , Layer1_Si_Y[i] ) ) ; + + else if(Layer2_Si_X[i] > -1000 && Layer2_Si_Y[i] >-1000) + Position = TVector3 ( GetStripPositionX( TelescopeNumber[i] , Layer2_Si_X[i] , Layer2_Si_Y[i] ) , + GetStripPositionY( TelescopeNumber[i] , Layer2_Si_X[i] , Layer2_Si_Y[i] ) , + GetStripPositionZ( TelescopeNumber[i] , Layer2_Si_X[i] , Layer2_Si_Y[i] ) ) ; + + else Position=TVector3(-1000,0,0); + return(Position) ; - + } TVector3 TCharissaPhysics::GetTelescopeNormal( const int i) const { - TVector3 U = TVector3 ( GetStripPositionX( Layer1_TelescopeNumber[i] , m_NumberOfStrip , 1 ) , - GetStripPositionY( Layer1_TelescopeNumber[i] , m_NumberOfStrip , 1 ) , - GetStripPositionZ( Layer1_TelescopeNumber[i] , m_NumberOfStrip , 1 ) ) - - -TVector3 ( GetStripPositionX( Layer1_TelescopeNumber[i] , 1 , 1 ) , - GetStripPositionY( Layer1_TelescopeNumber[i] , 1 , 1 ) , - GetStripPositionZ( Layer1_TelescopeNumber[i] , 1 , 1 ) ); - - TVector3 V = TVector3 ( GetStripPositionX( Layer1_TelescopeNumber[i] , m_NumberOfStrip , m_NumberOfStrip ) , - GetStripPositionY( Layer1_TelescopeNumber[i] , m_NumberOfStrip , m_NumberOfStrip ) , - GetStripPositionZ( Layer1_TelescopeNumber[i] , m_NumberOfStrip , m_NumberOfStrip ) ) - - -TVector3 ( GetStripPositionX( Layer1_TelescopeNumber[i] , m_NumberOfStrip , 1 ) , - GetStripPositionY( Layer1_TelescopeNumber[i] , m_NumberOfStrip , 1 ) , - GetStripPositionZ( Layer1_TelescopeNumber[i] , m_NumberOfStrip , 1 ) ); - + TVector3 U = TVector3 ( GetStripPositionX( TelescopeNumber[i] , m_NumberOfStrip , 1 ) , + GetStripPositionY( TelescopeNumber[i] , m_NumberOfStrip , 1 ) , + GetStripPositionZ( TelescopeNumber[i] , m_NumberOfStrip , 1 ) ) + + -TVector3 ( GetStripPositionX( TelescopeNumber[i] , 1 , 1 ) , + GetStripPositionY( TelescopeNumber[i] , 1 , 1 ) , + GetStripPositionZ( TelescopeNumber[i] , 1 , 1 ) ); + + TVector3 V = TVector3 ( GetStripPositionX( TelescopeNumber[i] , m_NumberOfStrip , m_NumberOfStrip ) , + GetStripPositionY( TelescopeNumber[i] , m_NumberOfStrip , m_NumberOfStrip ) , + GetStripPositionZ( TelescopeNumber[i] , m_NumberOfStrip , m_NumberOfStrip ) ) + + -TVector3 ( GetStripPositionX( TelescopeNumber[i] , m_NumberOfStrip , 1 ) , + GetStripPositionY( TelescopeNumber[i] , m_NumberOfStrip , 1 ) , + GetStripPositionZ( TelescopeNumber[i] , m_NumberOfStrip , 1 ) ); + TVector3 Normal = U.Cross(V); - + return(Normal.Unit()) ; } @@ -1364,79 +1294,79 @@ namespace CHARISSA_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; } - + // E // X double fDE_X_E(const TCharissaData* m_EventData , const int i) { -return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaLayer1StripXEDetectorNbr(i) ) + "_DE_X" + itoa( m_EventData->GetCharissaLayer1StripXEStripNbr(i) ) + "_E", - m_EventData->GetCharissaLayer1StripXEEnergy(i) ); + return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaLayer1StripXEDetectorNbr(i) ) + "_DE_X" + itoa( m_EventData->GetCharissaLayer1StripXEStripNbr(i) ) + "_E", + m_EventData->GetCharissaLayer1StripXEEnergy(i) ); } - + double fDE_X_T(const TCharissaData* m_EventData , const int i) { -return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaLayer1StripXTDetectorNbr(i) ) + "_DE_X" + itoa( m_EventData->GetCharissaLayer1StripXTStripNbr(i) ) +"_T", - m_EventData->GetCharissaLayer1StripXTTime(i) ); + return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaLayer1StripXTDetectorNbr(i) ) + "_DE_X" + itoa( m_EventData->GetCharissaLayer1StripXTStripNbr(i) ) +"_T", + m_EventData->GetCharissaLayer1StripXTTime(i) ); } - + // Y double fDE_Y_E(const TCharissaData* m_EventData , const int i) { -return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaLayer1StripYEDetectorNbr(i) ) + "_DE_Y" + itoa( m_EventData->GetCharissaLayer1StripYEStripNbr(i) ) +"_E", - m_EventData->GetCharissaLayer1StripYEEnergy(i) ); + return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaLayer1StripYEDetectorNbr(i) ) + "_DE_Y" + itoa( m_EventData->GetCharissaLayer1StripYEStripNbr(i) ) +"_E", + m_EventData->GetCharissaLayer1StripYEEnergy(i) ); } - + double fDE_Y_T(const TCharissaData* m_EventData , const int i) { -return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaLayer1StripYTDetectorNbr(i) ) + "_DE_Y" + itoa( m_EventData->GetCharissaLayer1StripYTStripNbr(i) ) +"_T", - m_EventData->GetCharissaLayer1StripYTTime(i) ); + return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaLayer1StripYTDetectorNbr(i) ) + "_DE_Y" + itoa( m_EventData->GetCharissaLayer1StripYTStripNbr(i) ) +"_T", + m_EventData->GetCharissaLayer1StripYTTime(i) ); } - + // E // X double fE_X_E(const TCharissaData* m_EventData , const int i) { -return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaLayer2StripXEDetectorNbr(i) ) + "_E_X" + itoa( m_EventData->GetCharissaLayer2StripXEStripNbr(i) ) + "_E", - m_EventData->GetCharissaLayer2StripXEEnergy(i) ); + return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaLayer2StripXEDetectorNbr(i) ) + "_E_X" + itoa( m_EventData->GetCharissaLayer2StripXEStripNbr(i) ) + "_E", + m_EventData->GetCharissaLayer2StripXEEnergy(i) ); } - + double fE_X_T(const TCharissaData* m_EventData , const int i) { -return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaLayer2StripXTDetectorNbr(i) ) + "_E_X" + itoa( m_EventData->GetCharissaLayer2StripXTStripNbr(i) ) +"_T", - m_EventData->GetCharissaLayer2StripXTTime(i) ); + return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaLayer2StripXTDetectorNbr(i) ) + "_E_X" + itoa( m_EventData->GetCharissaLayer2StripXTStripNbr(i) ) +"_T", + m_EventData->GetCharissaLayer2StripXTTime(i) ); } - + // Y double fE_Y_E(const TCharissaData* m_EventData , const int i) { -return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaLayer2StripYEDetectorNbr(i) ) + "_E_Y" + itoa( m_EventData->GetCharissaLayer2StripYEStripNbr(i) ) +"_E", - m_EventData->GetCharissaLayer2StripYEEnergy(i) ); + return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaLayer2StripYEDetectorNbr(i) ) + "_E_Y" + itoa( m_EventData->GetCharissaLayer2StripYEStripNbr(i) ) +"_E", + m_EventData->GetCharissaLayer2StripYEEnergy(i) ); } - + double fE_Y_T(const TCharissaData* m_EventData , const int i) { -return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaLayer2StripYTDetectorNbr(i) ) + "_E_Y" + itoa( m_EventData->GetCharissaLayer2StripYTStripNbr(i) ) +"_T", - m_EventData->GetCharissaLayer2StripYTTime(i) ); + return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaLayer2StripYTDetectorNbr(i) ) + "_E_Y" + itoa( m_EventData->GetCharissaLayer2StripYTStripNbr(i) ) +"_T", + m_EventData->GetCharissaLayer2StripYTTime(i) ); } - + // CsI double fCsI_E(const TCharissaData* m_EventData , const int i) { -return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaCsIEDetectorNbr(i) ) + "_CsI" + itoa( m_EventData->GetCharissaCsIECristalNbr(i) ) +"_E", - m_EventData->GetCharissaCsIEEnergy(i) ); + return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaCsIEDetectorNbr(i) ) + "_CsI" + itoa( m_EventData->GetCharissaCsIECristalNbr(i) ) +"_E", + m_EventData->GetCharissaCsIEEnergy(i) ); } - + double fCsI_T(const TCharissaData* m_EventData , const int i) { -return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaCsITDetectorNbr(i) ) + "_CsI" + itoa( m_EventData->GetCharissaCsITCristalNbr(i) ) +"_T", - m_EventData->GetCharissaCsITTime(i) ); + return CalibrationManager::getInstance()->ApplyCalibration( "CHARISSA/T" + itoa( m_EventData->GetCharissaCsITDetectorNbr(i) ) + "_CsI" + itoa( m_EventData->GetCharissaCsITCristalNbr(i) ) +"_T", + m_EventData->GetCharissaCsITTime(i) ); } - + } - + diff --git a/NPLib/Charissa/TCharissaPhysics.h b/NPLib/Charissa/TCharissaPhysics.h index 9976ae684194d0de4c76cb407ab1343e53962f53..a402f0c24530732d65b142eb91fbc728fd164901 100755 --- a/NPLib/Charissa/TCharissaPhysics.h +++ b/NPLib/Charissa/TCharissaPhysics.h @@ -53,9 +53,8 @@ class TCharissaPhysics : public TObject, public NPA::VDetector{ public: vector < TVector2 > Layer1_Match_X_Y(); vector < TVector2 > Layer2_Match_X_Y(); - bool Match_Si_CsI(int X, int Y , int CristalNbr); bool ResolvePseudoEvent(); - int Layer1_CheckEvent(); + int Layer1_CheckEvent(); int Layer2_CheckEvent(); public: @@ -67,8 +66,7 @@ class TCharissaPhysics : public TObject, public NPA::VDetector{ vector<int> EventType ; // Telescope - vector<int> Layer1_TelescopeNumber ; - vector<int> Layer2_TelescopeNumber ; + vector<int> TelescopeNumber ; // Si vector<double> Layer1_Si_E ; @@ -76,7 +74,7 @@ class TCharissaPhysics : public TObject, public NPA::VDetector{ vector<int> Layer1_Si_X ; vector<int> Layer1_Si_Y ; - vector<double> Layer2_Si_E ; + vector<double> Layer2_Si_E ; vector<double> Layer2_Si_T ; vector<int> Layer2_Si_X ; vector<int> Layer2_Si_Y ; @@ -89,24 +87,18 @@ class TCharissaPhysics : public TObject, public NPA::VDetector{ vector<int> Layer1_TelescopeNumber_X ; vector<int> Layer1_TelescopeNumber_Y ; - vector<double> Layer2_Si_EX ; + vector<double> Layer2_Si_EX ; vector<double> Layer2_Si_TX ; vector<double> Layer2_Si_EY ; vector<double> Layer2_Si_TY ; vector<int> Layer2_TelescopeNumber_X ; vector<int> Layer2_TelescopeNumber_Y ; - // Si(Li) - // CsI vector<double> CsI_E ; vector<double> CsI_T ; vector<int> CsI_N ; - // Physical Value - vector<double> TotalEnergy ; - - public: // Innherited from VDetector Class // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token @@ -185,9 +177,6 @@ class TCharissaPhysics : public TObject, public NPA::VDetector{ double beta_v, double beta_w); - // Use for reading Calibration Run, very simple methods; only apply calibration, no condition - void ReadCalibrationRun(); - // Give and external TMustData object to TCharissaPhysics. Needed for online analysis for example. void SetRawDataPointer(TCharissaData* rawDataPointer) {m_EventData = rawDataPointer;} // Retrieve raw and pre-treated data @@ -204,8 +193,6 @@ class TCharissaPhysics : public TObject, public NPA::VDetector{ // To be called after a build Physical Event int GetEventMultiplicity() const { return EventMultiplicity; }; - double GetEnergyDeposit(const int i) const{ return TotalEnergy[i] ;}; - TVector3 GetPositionOfInteraction(const int i) const; TVector3 GetTelescopeNormal(const int i) const; @@ -281,7 +268,7 @@ class TCharissaPhysics : public TObject, public NPA::VDetector{ TCharissaSpectra* m_Spectra;//! public: // Spectra Getter - map< vector<TString> , TH1*> GetSpectra(); + map< vector<string> , TH1*> GetSpectra(); ClassDef(TCharissaPhysics,1) // CharissaPhysics structure }; diff --git a/NPLib/Charissa/TCharissaSpectra.cxx b/NPLib/Charissa/TCharissaSpectra.cxx index 35b4fd64378ac52eb658cc95a03a8c6005928b89..ad81f3aafce9402cd671237f8e8381744f8f0aac 100644 --- a/NPLib/Charissa/TCharissaSpectra.cxx +++ b/NPLib/Charissa/TCharissaSpectra.cxx @@ -21,6 +21,11 @@ * * *****************************************************************************/ +// STL +#include <iostream> +#include <cstdlib> +#include <stdexcept> + // NPL #include "TCharissaSpectra.h" #include "NPOptionManager.h" @@ -32,7 +37,7 @@ using namespace NPUNITS; // ROOT -#include "TString.h" +#include "string.h" #include "TDirectory.h" #include "TFile.h" @@ -79,7 +84,10 @@ TCharissaSpectra::~TCharissaSpectra(){ //////////////////////////////////////////////////////////////////////////////// void TCharissaSpectra::InitRawSpectra() { - TString name; + string name; + int NbrBin = 512; + int MinBin = 0; + int MaxBin = 16384; for (unsigned int i = 0; i < fNumberOfTelescope; i++) { // loop on number of detectors // DE_STRX_E_RAW @@ -88,23 +96,23 @@ void TCharissaSpectra::InitRawSpectra() // DE_STRX_E_RAW name = Form("CHA%d_DE_STRX_E_RAW", i+1); - AddHisto2D(name, name, fStripX, 1, fStripX+1, 512, 0, 16384, "CHARISSA/RAW/STRXE"); + AddHisto2D(name, name, fStripX, 1, fStripX+1, NbrBin, MinBin, MaxBin, "CHARISSA/RAW/STRXE"); // DE_STRY_E_RAW name = Form("CHA%d_DE_STRY_E_RAW", i+1); - AddHisto2D(name, name, fStripY, 1, fStripY+1, 512, 0, 16384, "CHARISSA/RAW/STRYE"); + AddHisto2D(name, name, fStripY, 1, fStripY+1, NbrBin, MinBin, MaxBin, "CHARISSA/RAW/STRYE"); // E_STRX_E_RAW name = Form("CHA%d_E_STRX_E_RAW", i+1); - AddHisto2D(name, name, fStripX, 1, fStripX+1, 512, 0, 16384, "CHARISSA/RAW/STRXE"); + AddHisto2D(name, name, fStripX, 1, fStripX+1, NbrBin, MinBin, MaxBin, "CHARISSA/RAW/STRXE"); // E_STRY_E_RAW name = Form("CHA%d_E_STRY_E_RAW", i+1); - AddHisto2D(name, name, fStripY, 1, fStripY+1, 512, 0, 16384, "CHARISSA/RAW/STRYE"); + AddHisto2D(name, name, fStripY, 1, fStripY+1, NbrBin, MinBin, MaxBin, "CHARISSA/RAW/STRYE"); // CSI_E_RAW name = Form("CHA%d_CSI_E_RAW", i+1); - AddHisto2D(name, name, fCrystalCsI, 1, fCrystalCsI+1, 512, 0, 16384, "CHARISSA/RAW/CSIE"); + AddHisto2D(name, name, fCrystalCsI, 1, fCrystalCsI+1, NbrBin, MinBin, MaxBin, "CHARISSA/RAW/CSIE"); // DE_STRX_RAW_MULT name = Form("CHA%d_DE_STRX_RAW_MULT", i+1); @@ -133,29 +141,32 @@ void TCharissaSpectra::InitRawSpectra() //////////////////////////////////////////////////////////////////////////////// void TCharissaSpectra::InitPreTreatedSpectra() { - TString name; - + string name; + int NbrBin = 512; + int MinBin = 0; + int MaxBin = 1; + for (unsigned int i = 0; i < fNumberOfTelescope; i++) { // loop on number of detectors // DE_STRX_E_CAL name = Form("CHA%d_DE_STRX_E_CAL", i+1); - AddHisto2D(name, name, fStripX, 1, fStripX+1, 1000, 0, 16000, "CHARISSA/CAL/STRXE"); + AddHisto2D(name, name, fStripX, 1, fStripX+1, NbrBin, MinBin, MaxBin, "CHARISSA/CAL/STRXE"); // DE_STRY_E_CAL name = Form("CHA%d_DE_STRY_E_CAL", i+1); - AddHisto2D(name, name, fStripY, 1, fStripY+1, 1000, 0, 16000, "CHARISSA/CAL/STRYE"); + AddHisto2D(name, name, fStripY, 1, fStripY+1, NbrBin, MinBin, MaxBin, "CHARISSA/CAL/STRYE"); // E_STRX_E_CAL name = Form("CHA%d_E_STRX_E_CAL", i+1); - AddHisto2D(name, name, fStripX, 1, fStripX+1, 1000, 0, 16000, "CHARISSA/CAL/STRXE"); + AddHisto2D(name, name, fStripX, 1, fStripX+1, NbrBin, MinBin, MaxBin, "CHARISSA/CAL/STRXE"); // E_STRY_E_CAL name = Form("CHA%d_E_STRY_E_CAL", i+1); - AddHisto2D(name, name, fStripY, 1, fStripY+1, 1000, 0, 16000, "CHARISSA/CAL/STRYE"); + AddHisto2D(name, name, fStripY, 1, fStripY+1, NbrBin, MinBin, MaxBin, "CHARISSA/CAL/STRYE"); // CSI_E_CAL name = Form("CHA%d_CSI_E_CAL", i+1); - AddHisto2D(name, name, fCrystalCsI, 1, fCrystalCsI+1, 500, 0, 50, "CHARISSA/CAL/CSIE"); + AddHisto2D(name, name, fCrystalCsI, 1, fCrystalCsI+1, MaxBin, MinBin, MaxBin, "CHARISSA/CAL/CSIE"); // STRX_DE_CAL_MULT name = Form("CHA%d_DE_STRX_CAL_MULT", i+1); @@ -184,7 +195,7 @@ void TCharissaSpectra::InitPreTreatedSpectra() //////////////////////////////////////////////////////////////////////////////// void TCharissaSpectra::InitPhysicsSpectra() { - TString name; + string name; // DE X-Y Impact Matrix name = "CHA_DE_IMPACT_MATRIX"; @@ -196,59 +207,44 @@ void TCharissaSpectra::InitPhysicsSpectra() // DE kinematic line name = "CHA_DE_THETA"; - AddHisto2D(name, name, 360, 0, 180, 500, 0, 50, "CHARISSA/PHY"); - + AddHisto2D(name, name, 360, 0, 180, 500, 0, 500, "CHARISSA/PHY"); + int NbrBin = 1000; + int MinBin = 0; + int MaxBin = 1; + int MaxBinCsI = 20000; // X-Y Energy Correlation for (unsigned int i = 0 ; i < fNumberOfTelescope ; i++) { // loop on number of detectors // DE name = Form("CHA%d_DE_XY_COR", i+1); - AddHisto2D(name, name, 500, 0, 50, 500, 0, 50, "CHARISSA/PHY"); + AddHisto2D(name, name, NbrBin, MinBin, MaxBin, NbrBin, MinBin, MaxBin, "CHARISSA/PHY"); // En name = Form("CHA%d_E_XY_COR", i+1); - AddHisto2D(name, name, 500, 0, 50, 500, 0, 50, "CHARISSA/PHY"); + AddHisto2D(name, name, NbrBin, MinBin, MaxBin, NbrBin, MinBin, MaxBin, "CHARISSA/PHY"); } - - // ID plot detector by detector - for (unsigned int i = 0; i < fNumberOfTelescope; i++) { // loop on number of detectors + for (unsigned int i = MinBin; i < fNumberOfTelescope; i++) { // loop on number of detectors // E-TOF: name = "CHA_E_TOF"; - //AddHisto2D(name, name,500,0,50,1000,200,1200,"CHARISSA/PHY"); - AddHisto2D(name, name,500,0,20000,500,0,20000,"CHARISSA/PHY"); + AddHisto2D(name, name,NbrBin,MinBin,MaxBin,NbrBin,MinBin,MaxBin,"CHARISSA/PHY"); // DE-TOF: name = "CHA_DE_TOF"; - AddHisto2D(name, name,500,0,20000,500,0,20000,"CHARISSA/PHY"); + AddHisto2D(name, name,NbrBin,MinBin,MaxBin,NbrBin,MinBin,MaxBin,"CHARISSA/PHY"); // E-CSIE: name = "CHA_E_CSIE"; - AddHisto2D(name, name,500,0,20000,500,0,20000,"CHARISSA/PHY"); + AddHisto2D(name, name,NbrBin,MinBin,MaxBinCsI,NbrBin,MinBin,MaxBin,"CHARISSA/PHY"); // DE-CSIE: name = "CHA_DE_CSIE"; - AddHisto2D(name, name,500,0,20000,500,0,20000,"CHARISSA/PHY"); + AddHisto2D(name, name,NbrBin,MinBin,MaxBinCsI,NbrBin,MinBin,MaxBin,"CHARISSA/PHY"); // DE-E: name = "CHA_DE_E"; - AddHisto2D(name, name,500,0,20000,500,0,20000,"CHARISSA/PHY"); - - //E_CORR - name = "CHA_EXY_COR"; - AddHisto2D(name, name,500,0,20000,500,0,20000,"CHARISSA/PHY"); - //DE_CORR - name = "CHA_DEXY_COR"; - AddHisto2D(name, name,500,0,20000,500,0,20000,"CHARISSA/PHY"); - - // DEY-DEX: - name = "CHA_DEY_DEX"; - AddHisto2D(name, name,500,0,20000,500,0,20000,"CHARISSA/PHY"); - - // EY-EX: - name = "CHA_EY_EX"; - AddHisto2D(name, name,500,0,20000,500,0,20000,"CHARISSA/PHY"); + AddHisto2D(name, name,NbrBin,MinBin,MaxBin,NbrBin,MinBin,MaxBin,"CHARISSA/PHY"); } } @@ -257,8 +253,8 @@ void TCharissaSpectra::InitPhysicsSpectra() //////////////////////////////////////////////////////////////////////////////// void TCharissaSpectra::FillRawSpectra(TCharissaData* RawData) { - TString name; - TString family; + string name; + string family; for (unsigned int i = 0; i < RawData->GetCharissaLayer1StripXEMult(); i++) { for (unsigned int j = 0; j < RawData->GetCharissaLayer1StripYEMult(); j++) { @@ -269,7 +265,7 @@ void TCharissaSpectra::FillRawSpectra(TCharissaData* RawData) } } } - // DE_STRX_E + // DE_STRX_E for (unsigned int i = 0; i < RawData->GetCharissaLayer1StripXEMult(); i++) { name = Form("CHA%d_DE_STRX_E_RAW", RawData->GetCharissaLayer1StripXEDetectorNbr(i)); family = "CHARISSA/RAW/STRXE"; @@ -367,8 +363,8 @@ void TCharissaSpectra::FillRawSpectra(TCharissaData* RawData) //////////////////////////////////////////////////////////////////////////////// void TCharissaSpectra::FillPreTreatedSpectra(TCharissaData* PreTreatedData) { - TString name; - TString family; + string name; + string family; // DE_STRX_E for (unsigned int i = 0; i < PreTreatedData->GetCharissaLayer1StripXEMult(); i++) { name = Form("CHA%d_DE_STRX_E_CAL", PreTreatedData->GetCharissaLayer1StripXEDetectorNbr(i)); @@ -467,86 +463,70 @@ void TCharissaSpectra::FillPreTreatedSpectra(TCharissaData* PreTreatedData) //////////////////////////////////////////////////////////////////////////////// void TCharissaSpectra::FillPhysicsSpectra(TCharissaPhysics* Physics) { - cout << "TCharissaSpactra::FillPhysicsSpectra has to be implemented !" << endl; - - TString name; - TString family= "CHARISSA/PHY"; - // X-Y Impact Matrix - - - // LAYER 1 DE - for(unsigned int i = 0 ; i < Physics->Layer1_Si_E.size(); i++){ - name = "CHA_IMPACT_MATRIX"; + string name; + string family= "CHARISSA/PHY"; + for(unsigned int i = 0 ; i < Physics->EventMultiplicity; i++){ double x = Physics->GetPositionOfInteraction(i).x(); double y = Physics->GetPositionOfInteraction(i).y(); - GetHisto(family,name)-> Fill(x,y); + + if(Physics->Layer1_Si_E[i]>0){ + name = "CHA_DE_IMPACT_MATRIX"; + GetHisto(family,name)-> Fill(x,y); + } + + if(Physics->Layer2_Si_E[i]>0){ + name = "CHA_E_IMPACT_MATRIX"; + GetHisto(family,name)-> Fill(x,y); + } + name = "CHA_DE_THETA"; double Theta = Physics->GetPositionOfInteraction(i).Angle(TVector3(0,0,1)); Theta = Theta/deg; - GetHisto(family,name)-> Fill(Theta,Physics->Layer1_Si_E[i]); - + + double TotalE = 0 ; + if(Physics->Layer1_Si_E[i]>0) TotalE += Physics->Layer1_Si_E[i]; + if(Physics->Layer2_Si_E[i]>0) TotalE += Physics->Layer2_Si_E[i]; + if(Physics->CsI_E[i]>0) TotalE += Physics->CsI_E[i]; - //E_CORR - name = "CHA_EXY_COR"; - GetHisto(family,name)-> Fill(Physics->Layer2_Si_EX[i],Physics->Layer2_Si_EY[i]); + GetHisto(family,name)-> Fill(Theta,TotalE); - - //DE_CORR - name = "CHA_DEXY_COR"; - GetHisto(family,name)-> Fill(Physics->Layer1_Si_EX[i],Physics->Layer1_Si_EY[i]); - - // DE-TOF: - name = "CHA_DE_TOF"; - GetHisto(family,name)->Fill(Physics->Layer1_Si_T[i],Physics->Layer1_Si_E[i]); - - //E-TOF - name = "CHA_E_TOF"; - GetHisto(family,name)->Fill(Physics->Layer2_Si_T[i],Physics->Layer2_Si_E[i]); - + if(Physics->Layer1_Si_E[i]>0 && Physics->Layer2_Si_E[i]< 0 ){ + name = "CHA_DE_TOF"; + GetHisto(family,name)->Fill(Physics->Layer1_Si_E[i],Physics->Layer1_Si_T[i]); + } // DE-E: - name = "CHA_DE_E"; - GetHisto(family,name)->Fill(Physics->Layer2_Si_E[i],Physics->Layer1_Si_E[i]); - - - //DE_XY - name = "CHA_DEY_DEX"; - GetHisto(family,name)-> Fill(Physics->Layer1_Si_EX[i],Physics->Layer1_Si_EY[i]); - - - //E_XY - name = "CHA_EY_EX"; - GetHisto(family,name)-> Fill(Physics->Layer2_Si_EX[i],Physics->Layer2_Si_EY[i]); - - - //double Etot; - if(Physics->CsI_E[i]>0){ - name = "CHA_E_CSIE"; - //Etot = Physics->Layer1_Si_E[i]+Physics->Layer2_Si_E[i]+Physics->CsI_E[i]; - //Etot = Physics->CsI_E[i]; - GetHisto(family,name)->Fill(Physics->CsI_E[i],Physics->Layer1_Si_E[i]); - name = "CHA_DE_CSIE"; - GetHisto(family,name)->Fill(Physics->CsI_E[i],Physics->Layer2_Si_E[i]); - + if(Physics->Layer1_Si_E[i]>0 && Physics->Layer2_Si_E[i]> 0 ){ + name = "CHA_DE_E"; + GetHisto(family,name)->Fill(Physics->Layer2_Si_E[i],Physics->Layer1_Si_E[i]); } - + name = "CHA_DE_CSIE"; + GetHisto(family,name)->Fill(Physics->CsI_E[i],Physics->Layer1_Si_E[i]); - } - + name = "CHA_E_CSIE"; + GetHisto(family,name)->Fill(Physics->CsI_E[i],Physics->Layer2_Si_E[i]); + + // X-Y Corr + name = Form("CHA%d_DE_XY_COR", Physics->TelescopeNumber[i]); + GetHisto(family,name)->Fill(Physics->Layer1_Si_EX[i],Physics->Layer1_Si_EY[i]); + + // X-Y Corr + name = Form("CHA%d_E_XY_COR", Physics->TelescopeNumber[i]); + GetHisto(family,name)->Fill(Physics->Layer2_Si_EX[i],Physics->Layer2_Si_EY[i]); - + } } //////////////////////////////////////////////////////////////////////////////// -TH1* TCharissaSpectra::AddHisto1D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, TString family){ +TH1* TCharissaSpectra::AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family){ // create histo - TH1 *hist = new TH1D(name, title, nbinsx, xlow, xup); + TH1 *hist = new TH1D(name.c_str(), title.c_str(), nbinsx, xlow, xup); - vector<TString> index ; + vector<string> index ; index.push_back(family); index.push_back(name); @@ -559,11 +539,11 @@ TH1* TCharissaSpectra::AddHisto1D(TString name, TString title, Int_t nbinsx, Dou //////////////////////////////////////////////////////////////////////////////// -TH1* TCharissaSpectra::AddHisto2D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, Int_t nbinsy, Double_t ylow, Double_t yup, TString family){ +TH1* TCharissaSpectra::AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, Int_t nbinsy, Double_t ylow, Double_t yup, string family){ // create histo - TH1 *hist = new TH2D(name, title, nbinsx, xlow, xup, nbinsy, ylow, yup); + TH1 *hist = new TH2D(name.c_str(), title.c_str(), nbinsx, xlow, xup, nbinsy, ylow, yup); - vector<TString> index ; + vector<string> index ; index.push_back(family); index.push_back(name); @@ -576,26 +556,36 @@ TH1* TCharissaSpectra::AddHisto2D(TString name, TString title, Int_t nbinsx, Dou //////////////////////////////////////////////////////////////////////////////// -TH1* TCharissaSpectra::GetHisto(TString family, TString name){ - vector<TString> index ; +TH1* TCharissaSpectra::GetHisto(string& family, string& name){ + vector<string> index; index.push_back(family); index.push_back(name); - // fill map - return fMapHisto.at(index); + TH1* histo ; + + try{ + histo = fMapHisto.at(index); + } + + catch(const std::out_of_range& oor){ + cout << "ERROR : the folowing Histo has been requested by TCharissaSpectra and does not exist: family:" << family << " name: " << name << endl ; + exit(1); + } + + return histo; } //////////////////////////////////////////////////////////////////////////////// -void TCharissaSpectra::WriteHisto(TString filename) +void TCharissaSpectra::WriteHisto(string filename) { TFile *f = NULL; if (filename != "VOID") { - f = new TFile(filename, "RECREATE"); + f = new TFile(filename.c_str(), "RECREATE"); } - map< vector<TString>, TH1* >::iterator it; + map< vector<string>, TH1* >::iterator it; for (it=fMapHisto.begin(); it!=fMapHisto.end(); ++it) { it->second->Write(); } @@ -611,7 +601,7 @@ void TCharissaSpectra::WriteHisto(TString filename) /////////////////////////////////////////////////////////////////////////////// void TCharissaSpectra::CheckSpectra() { - map< vector<TString>, TH1* >::iterator it; + map< vector<string>, TH1* >::iterator it; Color_t ok_color = kTeal+9; Color_t warning_color = kOrange+8; warning_color *= 1; Color_t bad_color = kRed; bad_color *= 1; diff --git a/NPLib/Charissa/TCharissaSpectra.h b/NPLib/Charissa/TCharissaSpectra.h index 56bbd447754c61a06072f42897a9d5c9a094c271..17e52d71f10eb3da08b08c51a9efa7360cc75a5b 100644 --- a/NPLib/Charissa/TCharissaSpectra.h +++ b/NPLib/Charissa/TCharissaSpectra.h @@ -30,7 +30,6 @@ #include "TObject.h" #include <TH1.h> #include <TH2.h> -#include <TString.h> // NPLib headers #include "TCharissaData.h" @@ -49,9 +48,9 @@ class TCharissaSpectra { private: // Instantiate and register histo to maps - TH1* AddHisto1D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, TString family); - TH1* AddHisto2D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, - Int_t nbinsy, Double_t ylow, Double_t yup, TString family); + TH1* AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family); + TH1* AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, + Int_t nbinsy, Double_t ylow, Double_t yup, string family); // Initialization methods void InitRawSpectra(); @@ -68,9 +67,9 @@ class TCharissaSpectra { public: // get map histo which will be used for GSpectra in GUser - map< vector<TString>, TH1* > GetMapHisto() const {return fMapHisto;} - TH1* GetHisto(TString family,TString name); - void WriteHisto(TString filename="VOID"); + map< vector<string>, TH1* > GetMapHisto() const {return fMapHisto;} + TH1* GetHisto(string& family,string& name); + void WriteHisto(string filename="VOID"); private: // Information on CHARISSA unsigned int fNumberOfTelescope; @@ -80,7 +79,7 @@ class TCharissaSpectra { private: // map holding histo pointers and their family names - map< vector<TString>, TH1* > fMapHisto; + map< vector<string>, TH1* > fMapHisto; }; #endif diff --git a/NPLib/Exogam/TExogamData.h b/NPLib/Exogam/TExogamData.h index 79ca7251389d9bda6f6a829b1ed70d638f67b5f4..e35e13ee5bf9cf9aa23e5a71cb23051f9c14e710 100644 --- a/NPLib/Exogam/TExogamData.h +++ b/NPLib/Exogam/TExogamData.h @@ -88,26 +88,26 @@ class TExogamData : public TObject { // ECC / Energy // UShort_t GetCloverMult() {return fEXO_ECC_E_Clover.size();} UShort_t GetECCEMult() {return fEXO_ECC_E_Clover.size();} - UShort_t GetECCEClover(Int_t i) {return fEXO_ECC_E_Clover.at(i);} - UShort_t GetECCECristal(Int_t i) {return fEXO_ECC_E_Cristal.at(i);} - UShort_t GetECCEEnergy(Int_t i) {return fEXO_ECC_E_Energy.at(i);} + UShort_t GetECCEClover(Int_t i) {return fEXO_ECC_E_Clover[i];} + UShort_t GetECCECristal(Int_t i) {return fEXO_ECC_E_Cristal[i];} + UShort_t GetECCEEnergy(Int_t i) {return fEXO_ECC_E_Energy[i];} // ECC / Time UShort_t GetECCTMult() {return fEXO_ECC_T_Clover.size();} - UShort_t GetECCTClover(Int_t i) {return fEXO_ECC_T_Clover.at(i);} - UShort_t GetECCTCristal(Int_t i) {return fEXO_ECC_T_Cristal.at(i);} - UShort_t GetECCTTime(Int_t i) {return fEXO_ECC_T_Time.at(i);} + UShort_t GetECCTClover(Int_t i) {return fEXO_ECC_T_Clover[i];} + UShort_t GetECCTCristal(Int_t i) {return fEXO_ECC_T_Cristal[i];} + UShort_t GetECCTTime(Int_t i) {return fEXO_ECC_T_Time[i];} // GOCCE / Energy UShort_t GetGOCCEEMult() {return fEXO_GOCCE_E_Clover.size();} // multiplicity of segments hit in one clover - UShort_t GetGOCCEEClover(Int_t i) {return fEXO_GOCCE_E_Clover.at(i);} - UShort_t GetGOCCEECristal(Int_t i) {return fEXO_GOCCE_E_Cristal.at(i);} - UShort_t GetGOCCEESegment(Int_t i) {return fEXO_GOCCE_E_Segment.at(i);} - UShort_t GetGOCCEEEnergy(Int_t i) {return fEXO_GOCCE_E_Energy.at(i);} + UShort_t GetGOCCEEClover(Int_t i) {return fEXO_GOCCE_E_Clover[i];} + UShort_t GetGOCCEECristal(Int_t i) {return fEXO_GOCCE_E_Cristal[i];} + UShort_t GetGOCCEESegment(Int_t i) {return fEXO_GOCCE_E_Segment[i];} + UShort_t GetGOCCEEEnergy(Int_t i) {return fEXO_GOCCE_E_Energy[i];} // GOCCE / Time UShort_t GetGOCCETMult() {return fEXO_GOCCE_T_Clover.size();} - UShort_t GetGOCCETClover(Int_t i) {return fEXO_GOCCE_T_Clover.at(i);} - UShort_t GetGOCCETCristal(Int_t i) {return fEXO_GOCCE_T_Cristal.at(i);} - UShort_t GetGOCCETSegment(Int_t i) {return fEXO_GOCCE_T_Segment.at(i);} - UShort_t GetGOCCETTime(Int_t i) {return fEXO_GOCCE_T_Time.at(i);} + UShort_t GetGOCCETClover(Int_t i) {return fEXO_GOCCE_T_Clover[i];} + UShort_t GetGOCCETCristal(Int_t i) {return fEXO_GOCCE_T_Cristal[i];} + UShort_t GetGOCCETSegment(Int_t i) {return fEXO_GOCCE_T_Segment[i];} + UShort_t GetGOCCETTime(Int_t i) {return fEXO_GOCCE_T_Time[i];} //GeFill UShort_t GetGeFill() {return fEXO_Fill;} diff --git a/NPLib/Exogam/TExogamPhysics.cxx b/NPLib/Exogam/TExogamPhysics.cxx index cb09dc2a75ebf0a28ae39bf9685ffd83798aebb6..2f7b30e9de71cc12da2864f0f690439f261173cd 100644 --- a/NPLib/Exogam/TExogamPhysics.cxx +++ b/NPLib/Exogam/TExogamPhysics.cxx @@ -556,11 +556,19 @@ void TExogamPhysics::ClearSpectra(){ // To be done } /////////////////////////////////////////////////////////////////////////// +<<<<<<< HEAD map< vector<TString> , TH1*> TExogamPhysics::GetSpectra() { if(m_Spectra) return m_Spectra->GetMapHisto(); else{ map< vector<TString> , TH1*> empty; +======= +map< vector<string> , TH1*> TExogamPhysics::GetSpectra() { + if(m_Spectra) + return m_Spectra->GetMapHisto(); + else{ + map< vector<string> , TH1*> empty; +>>>>>>> a51372fab418d17126a214991f612e6da2c5c9be return empty; } } diff --git a/NPLib/Exogam/TExogamPhysics.h b/NPLib/Exogam/TExogamPhysics.h index e41b8fcccad445880f4ae12f1788a60a50494917..3252c28b6f561782f429933fe55ae471fcb0d872 100644 --- a/NPLib/Exogam/TExogamPhysics.h +++ b/NPLib/Exogam/TExogamPhysics.h @@ -174,7 +174,7 @@ class TExogamPhysics : public TObject, public NPA::VDetector TExogamSpectra* m_Spectra;//! public: // Spectra Getter - map< vector<TString> , TH1*> GetSpectra(); + map< vector<string> , TH1*> GetSpectra(); ClassDef(TExogamPhysics,1) // ExogamPhysics structure }; diff --git a/NPLib/Exogam/TExogamSpectra.cxx b/NPLib/Exogam/TExogamSpectra.cxx index 87dcf577a4e18b17e9bdae41a3f473dc05cada85..954dde526046c9314bfdd36f0e437b52194667d2 100644 --- a/NPLib/Exogam/TExogamSpectra.cxx +++ b/NPLib/Exogam/TExogamSpectra.cxx @@ -21,6 +21,12 @@ * * *****************************************************************************/ +// STL +#include <iostream> +#include <cstdlib> +#include <stdexcept> + + // NPL #include "TExogamSpectra.h" #include "NPOptionManager.h" @@ -31,7 +37,7 @@ using namespace NPUNITS; #endif // ROOT -#include "TString.h" +#include "string.h" #include "TDirectory.h" #include "TFile.h" @@ -75,7 +81,7 @@ TExogamSpectra::~TExogamSpectra(){ //////////////////////////////////////////////////////////////////////////////// void TExogamSpectra::InitRawSpectra(){ - TString name; + string name; for (unsigned int i = 0; i < fNumberOfClover; i++) { // loop on number of detectors for (unsigned int j = 0; j < fNumberOfCores; j++) { // loop on number of cores @@ -96,7 +102,7 @@ void TExogamSpectra::InitRawSpectra(){ //////////////////////////////////////////////////////////////////////////////// void TExogamSpectra::InitPreTreatedSpectra() { - TString name; + string name; for (unsigned int i = 0; i < fNumberOfClover; i++) { // loop on number of detectors for (unsigned int j = 0; j < fNumberOfCores; j++) { // loop on number of cores name = Form("ExogamEnergyCal_Clover%d_ECC%d", i+1, j+1); @@ -115,7 +121,7 @@ void TExogamSpectra::InitPreTreatedSpectra() //////////////////////////////////////////////////////////////////////////////// void TExogamSpectra::InitPhysicsSpectra(){ - TString name; + string name; name = "ExogamEnergyAddBack"; AddHisto1D(name, name, 5000, 0, 5000, "Exogam/DC"); @@ -125,25 +131,39 @@ void TExogamSpectra::InitPhysicsSpectra(){ //////////////////////////////////////////////////////////////////////////////// void TExogamSpectra::FillRawSpectra(TExogamData* RawData){ +<<<<<<< HEAD TString name; TString family; // Energy and Time RAw +======= + string name; + string family; + + // Energy +>>>>>>> a51372fab418d17126a214991f612e6da2c5c9be for (unsigned int i = 0; i < RawData->GetECCEMult(); i++) { name = Form("ExogamEnergyRaw_Clover%d_ECC%d", RawData->GetECCEClover(i)+1,RawData->GetECCECristal(i)+1); family = "Exogam/ERAW/ECC"; GetHisto(family,name) -> Fill(RawData->GetECCEEnergy(i)); +<<<<<<< HEAD } for (unsigned int i = 0; i < RawData->GetGOCCEEMult(); i++) { name = Form("ExogamEnergyRaw_Clover%d_ECC%d_GOCCE%d", RawData->GetGOCCEEClover(i)+1,RawData->GetGOCCEECristal(i)+1,RawData->GetGOCCEESegment(i)+1); family = "Exogam/ERAW/GOCCE"; +======= + + name = Form("ExogamEnergyRaw_Clover%d_ECC%d_GOCCE%d", RawData->GetECCEClover(i)+1,RawData->GetECCECristal(i)+1,RawData->GetGOCCEESegment(i)+1); + family = "Exogam/RAW"; +>>>>>>> a51372fab418d17126a214991f612e6da2c5c9be GetHisto(family,name) -> Fill(RawData->GetGOCCEEEnergy(i)); } +<<<<<<< HEAD for (unsigned int i = 0; i < RawData->GetECCTMult(); i++) { name = Form("ExogamTimeRaw_Clover%d_ECC%d", RawData->GetECCTClover(i)+1,RawData->GetECCTCristal(i)+1); family = "Exogam/TRAW/ECC"; @@ -151,14 +171,29 @@ void TExogamSpectra::FillRawSpectra(TExogamData* RawData){ GetHisto(family,name) -> Fill(RawData->GetECCTTime(i)); } +======= + // Time + for (unsigned int i = 0; i < RawData->GetECCTMult(); i++) { + name = Form("ExogamTimeRaw_Clover%d_ECC%d", RawData->GetECCTClover(i)+1,RawData->GetECCTCristal(i)+1); + family = "Exogam/RAW"; +>>>>>>> a51372fab418d17126a214991f612e6da2c5c9be + GetHisto(family,name) + -> Fill(RawData->GetECCTTime(i)); + } } //////////////////////////////////////////////////////////////////////////////// void TExogamSpectra::FillPreTreatedSpectra(TExogamData* PreTreatedData){ +<<<<<<< HEAD TString name ; TString family; // Energy and Time Cal +======= + string name ; + string family; + // Energy +>>>>>>> a51372fab418d17126a214991f612e6da2c5c9be for (unsigned int i = 0; i < PreTreatedData->GetECCEMult(); i++) { name = Form("ExogamEnergyCal_Clover%d_ECC%d", PreTreatedData->GetECCEClover(i)+1,PreTreatedData->GetECCECristal(i)+1); family = "Exogam/ECal/ECC"; @@ -175,6 +210,7 @@ void TExogamSpectra::FillPreTreatedSpectra(TExogamData* PreTreatedData){ -> Fill(PreTreatedData->GetGOCCEEEnergy(i)); } +<<<<<<< HEAD for (unsigned int i = 0; i < PreTreatedData->GetECCTMult(); i++) { name = Form("ExogamTimeCal_Clover%d_ECC%d", PreTreatedData->GetECCTClover(i)+1,PreTreatedData->GetECCTCristal(i)+1); family = "Exogam/TCal/ECC"; @@ -183,13 +219,31 @@ void TExogamSpectra::FillPreTreatedSpectra(TExogamData* PreTreatedData){ -> Fill(PreTreatedData->GetECCTTime(i)); } +======= + + name = Form("ExogamEnergyCal_Clover%d_ECC%d_GOCCE%d", PreTreatedData->GetECCEClover(i)+1,PreTreatedData->GetECCECristal(i)+1,PreTreatedData->GetGOCCEESegment(i)+1); + family = "Exogam/Cal"; + + GetHisto(family,name) + -> Fill(PreTreatedData->GetGOCCEEEnergy(i)); + } + + // Time + for (unsigned int i = 0; i < PreTreatedData->GetECCTMult(); i++) { + name = Form("ExogamTimeCal_Clover%d_ECC%d", PreTreatedData->GetECCTClover(i)+1,PreTreatedData->GetECCTCristal(i)+1); + family = "Exogam/Cal"; + + GetHisto(family,name) + -> Fill(PreTreatedData->GetECCTTime(i)); + } +>>>>>>> a51372fab418d17126a214991f612e6da2c5c9be } //////////////////////////////////////////////////////////////////////////////// void TExogamSpectra::FillPhysicsSpectra(TExogamPhysics* Physics){ - TString name; - TString family= "Exogam/PHY"; + string name; + string family= "Exogam/PHY"; // Doppler Correct and Add Back name = "ExogamEnergyAddBack"; family = "Exogam/DC"; @@ -200,11 +254,11 @@ void TExogamSpectra::FillPhysicsSpectra(TExogamPhysics* Physics){ } //////////////////////////////////////////////////////////////////////////////// -TH1* TExogamSpectra::AddHisto1D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, TString family){ +TH1* TExogamSpectra::AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family){ // create histo - TH1 *hist = new TH1D(name, title, nbinsx, xlow, xup); + TH1 *hist = new TH1D(name.c_str(), title.c_str(), nbinsx, xlow, xup); - vector<TString> index ; + vector<string> index ; index.push_back(family); index.push_back(name); @@ -215,11 +269,11 @@ TH1* TExogamSpectra::AddHisto1D(TString name, TString title, Int_t nbinsx, Doubl } //////////////////////////////////////////////////////////////////////////////// -TH1* TExogamSpectra::AddHisto2D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, Int_t nbinsy, Double_t ylow, Double_t yup, TString family){ +TH1* TExogamSpectra::AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, Int_t nbinsy, Double_t ylow, Double_t yup, string family){ // create histo - TH1 *hist = new TH2D(name, title, nbinsx, xlow, xup, nbinsy, ylow, yup); + TH1 *hist = new TH2D(name.c_str(), title.c_str(), nbinsx, xlow, xup, nbinsy, ylow, yup); - vector<TString> index ; + vector<string> index ; index.push_back(family); index.push_back(name); @@ -230,24 +284,35 @@ TH1* TExogamSpectra::AddHisto2D(TString name, TString title, Int_t nbinsx, Doubl } //////////////////////////////////////////////////////////////////////////////// -TH1* TExogamSpectra::GetHisto(TString family, TString name){ - vector<TString> index ; +TH1* TExogamSpectra::GetHisto(string family, string name){ +vector<string> index; + index.reserve(2); index.push_back(family); index.push_back(name); + TH1* histo ; - // fill map - return fMapHisto.at(index); + try{ + histo = fMapHisto.at(index); + } + + catch(const std::out_of_range& oor){ + cout << "ERROR : the folowing Histo has been requested by TCATSSpectra and does not exist: family:" << family << " name: " << name << endl ; + exit(1); + } + + return histo; } + //////////////////////////////////////////////////////////////////////////////// -void TExogamSpectra::WriteHisto(TString filename){ +void TExogamSpectra::WriteHisto(string filename){ TFile* f=NULL; if(filename!="VOID"){ - f = new TFile(filename,"RECREATE"); + f = new TFile(filename.c_str(),"RECREATE"); } - map< vector<TString>, TH1* >::iterator it; + map< vector<string>, TH1* >::iterator it; for (it=fMapHisto.begin(); it!=fMapHisto.end(); ++it){ it->second->Write(); @@ -261,7 +326,7 @@ void TExogamSpectra::WriteHisto(TString filename){ } /////////////////////////////////////////////////////////////////////////////// void TExogamSpectra::CheckSpectra(){ -map< vector<TString>, TH1* >::iterator it; +map< vector<string>, TH1* >::iterator it; Color_t ok_color = kTeal+9; Color_t warning_color = kOrange+8; warning_color *= 1; Color_t bad_color = kRed; bad_color *= 1; diff --git a/NPLib/Exogam/TExogamSpectra.h b/NPLib/Exogam/TExogamSpectra.h index df97e2c953d4bafdee7117e0c137164d6079c3fe..67fb7e37def9c785f32a4f95d6cdd980e4ac0edd 100644 --- a/NPLib/Exogam/TExogamSpectra.h +++ b/NPLib/Exogam/TExogamSpectra.h @@ -30,7 +30,6 @@ #include "TObject.h" #include <TH1.h> #include <TH2.h> -#include <TString.h> // NPLib headers #include "TExogamData.h" @@ -49,9 +48,9 @@ class TExogamSpectra { private: // Instantiate and register histo to maps - TH1* AddHisto1D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, TString family); - TH1* AddHisto2D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, - Int_t nbinsy, Double_t ylow, Double_t yup,TString family); + TH1* AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family); + TH1* AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, + Int_t nbinsy, Double_t ylow, Double_t yup,string family); // Initialization methods void InitRawSpectra(); @@ -68,9 +67,9 @@ class TExogamSpectra { public: // get map histo which will be used for GSpectra in GUser - map< vector<TString>, TH1* > GetMapHisto() const {return fMapHisto;} - TH1* GetHisto(TString family,TString name); - void WriteHisto(TString filename="VOID"); + map< vector<string>, TH1* > GetMapHisto() const {return fMapHisto;} + TH1* GetHisto(string family,string name); + void WriteHisto(string filename="VOID"); private: // Information on Exogam unsigned int fNumberOfClover ; @@ -85,7 +84,7 @@ class TExogamSpectra { private: // map holding histo pointers and their family names - map< vector<TString>, TH1* > fMapHisto; + map< vector<string>, TH1* > fMapHisto; }; #endif diff --git a/NPLib/IORoot/RootOutput.cxx b/NPLib/IORoot/RootOutput.cxx index 476c1c008118ad6a0a599f4c00a8a7c7c04424ab..736de7f9a23556c0ecb7a38cb046bcb231c565fd 100644 --- a/NPLib/IORoot/RootOutput.cxx +++ b/NPLib/IORoot/RootOutput.cxx @@ -43,7 +43,7 @@ RootOutput* RootOutput::getInstance(TString fileNameBase, TString treeNameBase) void RootOutput::Destroy() -{ +{ if (instance != 0) { delete instance; instance = 0; @@ -53,6 +53,8 @@ void RootOutput::Destroy() RootOutput::RootOutput(TString fileNameBase, TString treeNameBase) { + TDirectory* currentPath= gDirectory; + // The file extension is added to the file name: TString GlobalPath = getenv("NPTOOL"); @@ -76,6 +78,7 @@ RootOutput::RootOutput(TString fileNameBase, TString treeNameBase) // Init TAsciiFile objects InitAsciiFiles(); + gDirectory->cd(currentPath->GetPath()); } @@ -123,9 +126,11 @@ void RootOutput::InitAsciiFiles() RootOutput::~RootOutput() -{ +{ // The data is written to the file and the tree is closed: if (pRootFile && !NPOptionManager::getInstance()->GetPROOF()) { + TDirectory* currentPath= gDirectory; + gDirectory->cd(pRootFile->GetPath()); cout << endl; cout << "Got histograms and Tree !" << endl; cout << " - Number of entries in the Tree: " << pRootTree->GetEntries() << endl; @@ -143,6 +148,7 @@ RootOutput::~RootOutput() // Analysis ConfigFile if (!pAnalysisConfigFile->IsEmpty()) pAnalysisConfigFile->Write(); pRootFile->Flush(); + gDirectory->cd(currentPath->GetPath()); pRootFile->Close(); } diff --git a/NPLib/LaBr3/Makefile b/NPLib/LaBr3/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..c298bfb3388d496503177e36b01bb5528af7d0b9 --- /dev/null +++ b/NPLib/LaBr3/Makefile @@ -0,0 +1,40 @@ +include ../Makefile.arch + +#------------------------------------------------------------------------------ +SHARELIB = libLaBr3.so + +all: $(SHARELIB) +#------------------------------------------------------------------------------ +############### Detector ############## + +## LaBr3 ## +libLaBr3.so: TLaBr3Data.o TLaBr3DataDict.o TLaBr3Physics.o TLaBr3PhysicsDict.o TLaBr3Spectra.o + $(LD) $(SOFLAGS) $^ $(OutPutOpt) $@ + +TLaBr3DataDict.cxx: TLaBr3Data.h + rootcint -f $@ -c $^ + +TLaBr3PhysicsDict.cxx: TLaBr3Physics.h + rootcint -f $@ -c $^ + +# dependances +TLaBr3Data.o: TLaBr3Data.cxx TLaBr3Data.h +TLaBr3Physics.o: TLaBr3Physics.cxx TLaBr3Physics.h +TLaBr3Spectra.o: TLaBr3Spectra.cxx TLaBr3Spectra.h +####################################### + +############# Clean and More ########## +clean: + @rm -f core *~ *.o *Dict* + +distclean: + make clean; rm -f *.so + +.SUFFIXES: .$(SrcSuf) + +### + +.$(SrcSuf).$(ObjSuf): + $(CXX) $(CXXFLAGS) $(INCLUDE) -c $< + + diff --git a/NPLib/LaBr3/TLaBr3Data.cxx b/NPLib/LaBr3/TLaBr3Data.cxx new file mode 100644 index 0000000000000000000000000000000000000000..9cbb6aed91f94d5e0f76408a7f2976a2f83757f2 --- /dev/null +++ b/NPLib/LaBr3/TLaBr3Data.cxx @@ -0,0 +1,64 @@ +/***************************************************************************** + * Copyright (C) 2009-2013 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: matta@ipno.in2p3.fr * + * * + * Creation Date : * + *---------------------------------------------------------------------------* + * Decription: * + * * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ +#include <iostream> +#include "TLaBr3Data.h" + + +ClassImp(TLaBr3Data) + +TLaBr3Data::TLaBr3Data() +{ +} + + + +TLaBr3Data::~TLaBr3Data() +{ +} + + + +void TLaBr3Data::Clear() +{ + // Energy + fLaBr3_E_Number.clear(); + fLaBr3_E_Energy.clear(); + // Time + fLaBr3_T_Number.clear(); + fLaBr3_T_Time.clear(); +} + + + +void TLaBr3Data::Dump() const +{ + cout << "XXXXXXXXXXXXXXXXXXXXXXXX TLaBr3: New Event XXXXXXXXXXXXXXXXX" << endl; + + // Energy + for (unsigned short i = 0 ; i< fLaBr3_E_Energy.size() ; i ++) { + cout << "LaBr3 Number " << fLaBr3_E_Number[i] << " Energy: " << fLaBr3_E_Energy[i] << endl; + } + + // Time + for (unsigned short i = 0 ; i< fLaBr3_T_Time.size() ; i ++) { + cout << "LaBr3 Number " << fLaBr3_T_Number[i] << " Time: " << fLaBr3_T_Time[i] << endl; + } +} diff --git a/NPLib/LaBr3/TLaBr3Data.h b/NPLib/LaBr3/TLaBr3Data.h new file mode 100644 index 0000000000000000000000000000000000000000..13b5b06f53c34834b0526cd233dc01aa11321f1d --- /dev/null +++ b/NPLib/LaBr3/TLaBr3Data.h @@ -0,0 +1,67 @@ +#ifndef __LABR3DATA__ +#define __LABR3DATA__ +/***************************************************************************** + * Copyright (C) 2009-2013 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: contact address: * + * * + * Creation Date : * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ +#include <vector> + +#include "TObject.h" +using namespace std ; + + +class TLaBr3Data : public TObject { + private: + // Energy + vector<short> fLaBr3_E_Number; + vector<double> fLaBr3_E_Energy; + // Time + vector<short> fLaBr3_T_Number; + vector<double> fLaBr3_T_Time; + + public: + TLaBr3Data(); + virtual ~TLaBr3Data(); + + void Clear(); + void Clear(const Option_t*) {}; + void Dump() const; + + ///////////////////// GETTERS //////////////////////// + // Energy + unsigned int GetEnergyMult() {return fLaBr3_E_Number.size();} + int GetENumber(int i) {return fLaBr3_E_Number[i];} + double GetEEnergy(int i) {return fLaBr3_E_Energy[i];} + // Time + unsigned int GetTimeMult() {return fLaBr3_T_Number.size();} + int GetTNumber(int i) {return fLaBr3_T_Number[i];} + double GetTTime(int i) {return fLaBr3_T_Time[i];} + + ///////////////////// SETTERS //////////////////////// + // Energy + void SetENumber(int N) {fLaBr3_E_Number.push_back(N);} + void SetEEnergy(double E) {fLaBr3_E_Energy.push_back(E);} + // time + void SetTNumber(int N) {fLaBr3_T_Number.push_back(N);} + void SetTTime(double T) {fLaBr3_T_Time.push_back(T);} + + ClassDef(TLaBr3Data,1) // LaBr3Data structure +}; + +#endif diff --git a/NPLib/LaBr3/TLaBr3Physics.cxx b/NPLib/LaBr3/TLaBr3Physics.cxx new file mode 100644 index 0000000000000000000000000000000000000000..371eb12833d8fa46dd27e85800cde30597e94489 --- /dev/null +++ b/NPLib/LaBr3/TLaBr3Physics.cxx @@ -0,0 +1,338 @@ +/***************************************************************************** + * Copyright (C) 2009-2013 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: matta@ipno.in2p3.fr * + * * + * Creation Date : november 2009 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class hold LaBr3 Physics * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +// NPL +#include "TLaBr3Physics.h" +#include "../include/RootOutput.h" +#include "../include/RootInput.h" + +// STL +#include <iostream> +#include <sstream> +#include <fstream> +#include <limits> +#include <stdlib.h> +using namespace std; + +// ROOT +#include "TChain.h" + +// tranform an integer to a string +string itoa(int value) +{ + char buffer [33]; + sprintf(buffer,"%d",value); + return buffer; +} + +ClassImp(TLaBr3Physics) +/////////////////////////////////////////////////////////////////////////// +TLaBr3Physics::TLaBr3Physics() + { + NumberOfDetector = 0 ; + EventData = new TLaBr3Data ; + PreTreatedData = new TLaBr3Data ; + EventPhysics = this ; + m_Spectra = NULL; + m_LaBr3_E_Threshold = 0; + m_LaBr3_RAW_Threshold = 0; + } + +/////////////////////////////////////////////////////////////////////////// +TLaBr3Physics::~TLaBr3Physics() + {} + +/////////////////////////////////////////////////////////////////////////// +void TLaBr3Physics::Clear() + { + + DetectorNumber.clear() ; + Energy.clear() ; + Time.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; + } + + 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; + } + + + + // 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 ; + } + } + } + } + +/////////////////////////////////////////////////////////////////////////// +void TLaBr3Physics::AddParameterToCalibrationManager() + { + CalibrationManager* Cal = CalibrationManager::getInstance(); + + for(int i = 0 ; i < NumberOfDetector ; i++) + { + Cal->AddParameter("LaBr3", "Detector"+itoa(i+1)+"_E","LaBr3_Detector"+itoa(i+1)+"_E") ; + Cal->AddParameter("LaBr3", "Detector"+itoa(i+1)+"_T","LaBr3_Detector"+itoa(i+1)+"_T") ; + } + } + +/////////////////////////////////////////////////////////////////////////// +void TLaBr3Physics::InitializeRootInputRaw() + { + TChain* inputChain = RootInput::getInstance()->GetChain() ; + inputChain->SetBranchStatus ( "LaBr3" , true ) ; + inputChain->SetBranchStatus ( "fLaBr3_*" , true ) ; + inputChain->SetBranchAddress( "LaBr3" , &EventData ) ; + } +/////////////////////////////////////////////////////////////////////////// +void TLaBr3Physics::InitializeRootInputPhysics() + { + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus ( "LaBr3", true ); + inputChain->SetBranchStatus ( "DetectorNumber", true ); + inputChain->SetBranchStatus ( "Energy", true ); + inputChain->SetBranchStatus ( "Time", true ); + inputChain->SetBranchAddress( "LaBr3", &EventPhysics ); + } +/////////////////////////////////////////////////////////////////////////// +void TLaBr3Physics::InitializeRootOutput() + { + TTree* outputTree = RootOutput::getInstance()->GetTree() ; + outputTree->Branch( "LaBr3" , "TLaBr3Physics" , &EventPhysics ) ; + } +/////////////////////////////////////////////////////////////////////////// +void TLaBr3Physics::InitSpectra(){ + m_Spectra = new TLaBr3Spectra(NumberOfDetector); +} + +/////////////////////////////////////////////////////////////////////////// +void TLaBr3Physics::FillSpectra(){ + m_Spectra -> FillRawSpectra(EventData); + m_Spectra -> FillPreTreatedSpectra(PreTreatedData); + m_Spectra -> FillPhysicsSpectra(EventPhysics); +} +/////////////////////////////////////////////////////////////////////////// +void TLaBr3Physics::CheckSpectra(){ + m_Spectra->CheckSpectra(); +} +/////////////////////////////////////////////////////////////////////////// +void TLaBr3Physics::ClearSpectra(){ + // To be done +} +/////////////////////////////////////////////////////////////////////////// +map< vector<string> , TH1*> TLaBr3Physics::GetSpectra() { + if(m_Spectra) + return m_Spectra->GetMapHisto(); + else{ + map< vector<string> , TH1*> empty; + return empty; + } +} +/////////////////////////////////////////////////////////////////////////// + +void TLaBr3Physics::PreTreat(){ + + // X + // E + ClearPreTreatedData(); + double E,T; + for(unsigned int i = 0 ; i < EventData->GetEnergyMult() ; ++i) + { + if( EventData->GetEEnergy(i)>m_LaBr3_RAW_Threshold ) + { + E=CalibrationManager::getInstance()->ApplyCalibration("LaBr3/Detector" + itoa( EventData->GetENumber(i) ) +"_E",EventData->GetEEnergy(i)); + if(E>m_LaBr3_E_Threshold) + { + PreTreatedData->SetENumber( EventData->GetENumber(i) ); + PreTreatedData->SetEEnergy( E ); + } + } + } + for(unsigned int i = 0 ; i < EventData->GetTimeMult() ; ++i) + { + T=CalibrationManager::getInstance()->ApplyCalibration("LaBr3/Detector"+itoa(EventData->GetTNumber(i))+"_T",EventData->GetTTime(i) ) ; + PreTreatedData->SetTNumber( EventData->GetTNumber(i) ); + PreTreatedData->SetTTime( T ); + + } + +} +/////////////////////////////////////////////////////////////////////////// +void TLaBr3Physics::BuildPhysicalEvent() + { + BuildSimplePhysicalEvent() ; + } + +/////////////////////////////////////////////////////////////////////////// +void TLaBr3Physics::BuildSimplePhysicalEvent() + { + PreTreat(); + + double LaBr3_T=-1000; + double LaBr3_E=-1000; + int LaBr3_N=-1000; + vector<double> LaBr3_E_vect,LaBr3_T_vect; + vector<int> LaBr3_N_vect; + for(unsigned int j = 0 ; j < EventData->GetEnergyMult() ; j++) + { + LaBr3_E=PreTreatedData->GetEEnergy(j); + LaBr3_N=PreTreatedData->GetENumber(j); + for(unsigned int i = 0 ; i < EventData->GetTimeMult() ; i++) + { + if(PreTreatedData->GetENumber(j)==PreTreatedData->GetTNumber(i)) + { + LaBr3_T=EventData->GetTTime(i); + } + } + LaBr3_E_vect.push_back( LaBr3_E); + LaBr3_T_vect.push_back( LaBr3_T); + LaBr3_N_vect.push_back( LaBr3_N); + } + for(unsigned int i = 0 ; i < LaBr3_E_vect.size() ; i++) + { + DetectorNumber.push_back( LaBr3_N_vect[i] ) ; + Energy.push_back( LaBr3_E_vect[i] ); + Time.push_back( LaBr3_T_vect[i] ); + } + + } + + diff --git a/NPLib/LaBr3/TLaBr3Physics.h b/NPLib/LaBr3/TLaBr3Physics.h new file mode 100644 index 0000000000000000000000000000000000000000..740f68073c1720f552ed9b5c92e062233178af2d --- /dev/null +++ b/NPLib/LaBr3/TLaBr3Physics.h @@ -0,0 +1,120 @@ +#ifndef __LaBr3Physics__ +#define __LaBr3Physics__ +/***************************************************************************** + * Copyright (C) 2009-2013 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: matta@ipno.in2p3.fr * + * * + * Creation Date : November 2009 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class hold theLaBr3 Detector Physics * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +// STL +#include <vector> +using namespace std ; + +class TLaBr3Spectra; +// ROOT +#include "TObject.h" + +// NPL +#include "TLaBr3Data.h" +#include "TLaBr3Spectra.h" +#include "../include/VDetector.h" +#include "../include/CalibrationManager.h" + +class TLaBr3Physics : public TObject, public NPA::VDetector +{ + public: // Constructor and Destructor + TLaBr3Physics(); + ~TLaBr3Physics(); + + public: + void Clear(); + void Clear(const Option_t*) {}; + + public: // Calibrated Data + vector<UShort_t> DetectorNumber ; + vector<Double_t> Energy; + vector<Double_t> Time; + + public: // inherrited from VDetector + // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token + void ReadConfiguration(string); + + + // Add Parameter to the CalibrationManger + void AddParameterToCalibrationManager(); + + // 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 InitializeRootInputRaw() ; + + // Activated associated Branches and link it to the private member DetectorPhysics address + // In this method mother Branches (Detector) AND daughter leaf (parameter) have to be activated + void InitializeRootInputPhysics() ; + + // Create associated branches and associated private member DetectorPhysics address + void 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 BuildPhysicalEvent(); + + // Same as above, but only the simplest event and/or simple method are used (low multiplicity, faster algorythm but less efficient ...). + // This method aimed to be used for analysis performed during experiment, when speed is requiered. + // NB: This method can eventually be the same as BuildPhysicalEvent. + void BuildSimplePhysicalEvent(); + + // Same as above but for online analysis + void BuildOnlinePhysicalEvent() {BuildPhysicalEvent();}; + + // Give and external TLaBr3Data object to TLaBr3Physics. Needed for online analysis for example. + void SetRawDataPointer(TLaBr3Data* rawDataPointer) {EventData = rawDataPointer;} + + // Those two method all to clear the Event Physics or Data + void ClearEventPhysics() {Clear();} + void ClearEventData() {EventData->Clear();} + + // Method related to the TSpectra classes, aimed at providing a framework for online applications + // Instantiate the Spectra class and the histogramm throught it + void InitSpectra(); + // Fill the spectra hold by the spectra class + void FillSpectra(); + // Used for Online mainly, perform check on the histo and for example change their color if issues are found + void CheckSpectra(); + // Used for Online only, clear all the spectra hold by the Spectra class + void ClearSpectra(); + // Clear The PreTeated object + void ClearPreTreatedData() {PreTreatedData->Clear();} + + // Remove bad channel, calibrate the data and apply threshold + void PreTreat(); + + private: // Data not writted in the tree + int NumberOfDetector ;//! + TLaBr3Data* EventData ;//! + TLaBr3Data* PreTreatedData ;//! + TLaBr3Physics* EventPhysics ;//! + TLaBr3Spectra* m_Spectra;//! + double m_LaBr3_E_Threshold; + double m_LaBr3_RAW_Threshold; + public: // Spectra Getter + map< vector<string> , TH1*> GetSpectra(); + + ClassDef(TLaBr3Physics,1) // LaBr3Physics structure +}; + +#endif diff --git a/NPLib/LaBr3/TLaBr3Spectra.cxx b/NPLib/LaBr3/TLaBr3Spectra.cxx new file mode 100644 index 0000000000000000000000000000000000000000..c52e1ec91d593890bd62aac5995ec8629c09abfc --- /dev/null +++ b/NPLib/LaBr3/TLaBr3Spectra.cxx @@ -0,0 +1,433 @@ +/***************************************************************************** + * Copyright (C) 2009-2013 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: N. de Sereville contact address: deserevi@ipno.in2p3.fr * + * * + * Creation Date : dec 2013 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class holds all the online spectra needed for LaBr3 * + * * + *---------------------------------------------------------------------------* + * Comment: * + * + first version (not complete yet) * + * * + * * + *****************************************************************************/ + +// STL +#include <iostream> +#include <cstdlib> +#include <stdexcept> + +// NPL +#include "TLaBr3Spectra.h" +#include "NPOptionManager.h" +#include "NPGlobalSystemOfUnits.h" +#include "NPPhysicalConstants.h" +#ifdef NP_SYSTEM_OF_UNITS_H +using namespace NPUNITS; +#endif + + +// ROOT +#include "string.h" +#include "TDirectory.h" +#include "TFile.h" + + +//////////////////////////////////////////////////////////////////////////////// +TLaBr3Spectra::TLaBr3Spectra() +{ + fNumberDetector = 0; +} + + + +//////////////////////////////////////////////////////////////////////////////// +TLaBr3Spectra::TLaBr3Spectra(unsigned int NumberOfDetectors) +{ + if(NPOptionManager::getInstance()->GetVerboseLevel()>0) + cout << "************************************************" << endl + << "TLaBr3Spectra : Initalising control spectra for " + << NumberOfDetectors << " detectorss" << endl + << "************************************************" << endl ; + + fNumberDetector = NumberOfDetectors; + + InitRawSpectra(); + InitPreTreatedSpectra(); + InitPhysicsSpectra(); +} + + + + +//////////////////////////////////////////////////////////////////////////////// +TLaBr3Spectra::~TLaBr3Spectra(){ +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TLaBr3Spectra::InitRawSpectra() +{ + string name; + int NbrBin = 512; + int MinBin = 0; + int MaxBin = 16384; + for (unsigned int i = 0; i < fNumberDetector; i++) { // loop on number of detectors + // LABR3_E_RAW + name = Form("LABR3_%d_E_RAW", i+1);cout<<Form("LABR3_%d_E_RAW", i+1)<<endl; + AddHisto1D(name, name, NbrBin, MinBin, MaxBin, "LABR3/RAW/ENERGY"); + + // LABR3_T_RAW + name = Form("LABR3_%d_T_RAW", i+1); + AddHisto1D(name, name, NbrBin, MinBin, MaxBin, "LABR3/RAW/TIME"); + } // end loop on number of detectors + + // LABR3_E_RAW + name = "LABR3_E_RAW"; + AddHisto2D(name, name, fNumberDetector, 1, fNumberDetector+1, NbrBin, MinBin, MaxBin, "LABR3/RAW/ENERGY"); + + // LABR3_T_RAW + name = "LABR3_T_RAW"; + AddHisto2D(name, name, fNumberDetector, 1, fNumberDetector+1, NbrBin, MinBin, MaxBin, "LABR3/RAW/TIME"); + + // LABR3_HIT_E_RAW + name = "LABR3_HITPATTERN_E_RAW"; + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "LABR3/RAW/ENERGY"); + + // LABR3_HIT_T_RAW + name = "LABR3_HITPATTERN_T_RAW"; + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "LABR3/RAW/TIME"); + + // E_RAW_MULT + name = "LABR3_E_RAW_MULT"; + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "LABR3/RAW/MULT"); + + // T_RAW_MULT + name = "LABR3_T_RAW_MULT"; + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "LABR3/RAW/MULT"); +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TLaBr3Spectra::InitPreTreatedSpectra() +{ + string name; + int NbrBin = 512; + int MinBinE = 0; + int MaxBinE = 10; // MeV + int MinBinT = 0; + int MaxBinT = 1; // us + + for (unsigned int i = 0; i < fNumberDetector; i++) { // loop on number of detectors + // LABR3_E_CAL + name = Form("LABR3_%d_E_CAL", i+1); + AddHisto1D(name, name, NbrBin, MinBinE, MaxBinE, "LABR3/CAL/ENERGY"); + + // LABR3_T_CAL + name = Form("LABR3_%d_T_CAL", i+1); + AddHisto1D(name, name, NbrBin, MinBinT, MaxBinT, "LABR3/CAL/TIME"); + + } // end loop on number of detectors + + // LABR3_E_CAL + name = "LABR3_ESUM_CAL"; + AddHisto1D(name, name, NbrBin, MinBinE, MaxBinE, "LABR3/CAL/ENERGY"); + + // LABR3_E_CAL + name = "LABR3_E_CAL"; + AddHisto2D(name, name, fNumberDetector, 1, fNumberDetector+1, NbrBin, MinBinE, MaxBinE, "LABR3/CAL/ENERGY"); + + // LABR3_T_CAL + name = "LABR3_T_CAL"; + AddHisto2D(name, name, fNumberDetector, 1, fNumberDetector+1, NbrBin, MinBinT, MaxBinT, "LABR3/CAL/TIME"); + + // LABR3_HIT_E_CAL + name = "LABR3_HITPATTERN_E_CAL"; + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "LABR3/CAL/ENERGY"); + + // LABR3_HIT_T_CAL + name = "LABR3_HITPATTERN_T_CAL"; + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "LABR3/CAL/TIME"); + + // E_CAL_MULT + name = "LABR3_E_CAL_MULT"; + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "LABR3/CAL/MULT"); + + // T_CAL_MULT + name = "LABR3_T_CAL_MULT"; + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "LABR3/CAL/MULT"); +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TLaBr3Spectra::InitPhysicsSpectra() +{ + string name; + + int NbrBin = 512; + int MinBinE = 0; + int MaxBinE = 10; + int MinBinT = 0; + int MaxBinT = 1; + + // Energy-Time Correlation + for (unsigned int i = 0 ; i < fNumberDetector ; i++) { // loop on number of detectors + name = Form("LABR3_%d_E_TOF", i+1); + AddHisto2D(name, name, NbrBin, MinBinE, MaxBinE, NbrBin, MinBinT, MaxBinT, "LABR3/PHY"); + } + + // E-TOF: + name = "LABR3_E_TOF"; + AddHisto2D(name, name, NbrBin, MinBinE, MaxBinE, NbrBin, MinBinT, MaxBinT, "LABR3/PHY"); +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TLaBr3Spectra::FillRawSpectra(TLaBr3Data* RawData) +{ + string name; + string family; + + // E_RAW + for (unsigned int i = 0; i < RawData->GetEnergyMult(); i++) { + name = Form("LABR3_%d_E_RAW", RawData->GetENumber(i)); + family = "LABR3/RAW/ENERGY"; + GetHisto(family,name) -> Fill(RawData->GetEEnergy(i)); + } + + // T_RAW + for (unsigned int i = 0; i < RawData->GetTimeMult(); i++) { + name = Form("LABR3_%d_T_RAW", RawData->GetTNumber(i)); + family = "LABR3/RAW/TIME"; + GetHisto(family,name) -> Fill(RawData->GetTTime(i)); + } + + // LABR3_E_RAW + name = "LABR3_E_RAW"; + family = "LABR3/RAW/ENERGY"; + for (unsigned int i = 0; i < RawData->GetEnergyMult(); i++) { + GetHisto(family,name) -> Fill(RawData->GetENumber(i), RawData->GetEEnergy(i)); + } + + // LABR3_T_RAW + name = "LABR3_T_RAW"; + family = "LABR3/RAW/TIME"; + for (unsigned int i = 0; i < RawData->GetTimeMult(); i++) { + GetHisto(family,name) -> Fill(RawData->GetTNumber(i), RawData->GetTTime(i)); + } + + // LABR3_HIT_E_RAW + name = "LABR3_HITPATTERN_E_RAW"; + family = "LABR3/RAW/ENERGY"; + for (unsigned int i = 0; i < RawData->GetEnergyMult(); i++) { + GetHisto(family,name) -> Fill(RawData->GetENumber(i)); + } + + // LABR3_HIT_T_RAW + name = "LABR3_HITPATTERN_T_RAW"; + family = "LABR3/RAW/TIME"; + for (unsigned int i = 0; i < RawData->GetTimeMult(); i++) { + GetHisto(family,name) -> Fill(RawData->GetTNumber(i)); + } + + // E_RAW_MULT + name = "LABR3_E_RAW_MULT"; + family = "LABR3/RAW/MULT"; + GetHisto(family,name) -> Fill(RawData->GetEnergyMult()); + + // T_RAW_MULT + name = "LABR3_T_RAW_MULT"; + family = "LABR3/RAW/MULT"; + GetHisto(family,name) -> Fill(RawData->GetTimeMult()); +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TLaBr3Spectra::FillPreTreatedSpectra(TLaBr3Data* PreTreatedData) +{ + string name; + string family; + + // E_CAL + for (unsigned int i = 0; i < PreTreatedData->GetEnergyMult(); i++) { + name = Form("LABR3_%d_E_CAL", PreTreatedData->GetENumber(i)); + family = "LABR3/CAL/ENERGY"; + GetHisto(family,name) -> Fill(PreTreatedData->GetEEnergy(i)); + } + + // T_CAL + for (unsigned int i = 0; i < PreTreatedData->GetTimeMult(); i++) { + name = Form("LABR3_%d_T_CAL", PreTreatedData->GetTNumber(i)); + family = "LABR3/CAL/TIME"; + GetHisto(family,name) -> Fill(PreTreatedData->GetTTime(i)); + } + + // LABR3_E_CAL + name = "LABR3_E_CAL"; + family = "LABR3/CAL/ENERGY"; + for (unsigned int i = 0; i < PreTreatedData->GetEnergyMult(); i++) { + GetHisto(family,name) -> Fill(PreTreatedData->GetENumber(i), PreTreatedData->GetEEnergy(i)); + } + + // LABR3_T_CAL + name = "LABR3_T_CAL"; + family = "LABR3/CAL/TIME"; + for (unsigned int i = 0; i < PreTreatedData->GetTimeMult(); i++) { + GetHisto(family,name) -> Fill(PreTreatedData->GetTNumber(i), PreTreatedData->GetTTime(i)); + } + + // LABR3_HIT_E_CAL + name = "LABR3_HITPATTERN_E_CAL"; + family = "LABR3/CAL/ENERGY"; + for (unsigned int i = 0; i < PreTreatedData->GetEnergyMult(); i++) { + GetHisto(family,name) -> Fill(PreTreatedData->GetENumber(i)); + } + + // LABR3_HIT_T_CAL + name = "LABR3_HITPATTERN_T_CAL"; + family = "LABR3/CAL/TIME"; + for (unsigned int i = 0; i < PreTreatedData->GetTimeMult(); i++) { + GetHisto(family,name) -> Fill(PreTreatedData->GetTNumber(i)); + } + + // E_CAL_MULT + name = "LABR3_E_CAL_MULT"; + family = "LABR3/CAL/MULT"; + GetHisto(family,name) -> Fill(PreTreatedData->GetEnergyMult()); + + // T_CAL_MULT + name = "LABR3_T_CAL_MULT"; + family = "LABR3/CAL/MULT"; + GetHisto(family,name) -> Fill(PreTreatedData->GetTimeMult()); +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TLaBr3Spectra::FillPhysicsSpectra(TLaBr3Physics* Physics) +{ + string name; + string family = "LABR3/PHY"; + + + // Energy-Time Correlation + for (unsigned int i = 0 ; i < Physics->DetectorNumber.size(); i++) { // loop on number of detectors + name = Form("LABR3_%d_E_TOF", i+1); + GetHisto(family,name) -> Fill(Physics->Time[i], Physics->Energy[i]); + } + + // E-TOF: + name = "LABR3_E_TOF"; + for (unsigned int i = 0 ; i < Physics->DetectorNumber.size(); i++) { // loop on number of detectors + GetHisto(family,name) -> Fill(Physics->Time[i], Physics->Energy[i]); + } +} + + + +//////////////////////////////////////////////////////////////////////////////// +TH1* TLaBr3Spectra::AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family){ + // create histo + TH1 *hist = new TH1D(name.c_str(), title.c_str(), nbinsx, xlow, xup); + + vector<string> index ; + index.push_back(family); + index.push_back(name); + + // fill map + fMapHisto[index]=hist; + + return hist; +} + + + +//////////////////////////////////////////////////////////////////////////////// +TH1* TLaBr3Spectra::AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, Int_t nbinsy, Double_t ylow, Double_t yup, string family){ + // create histo + TH1 *hist = new TH2D(name.c_str(), title.c_str(), nbinsx, xlow, xup, nbinsy, ylow, yup); + + vector<string> index ; + index.push_back(family); + index.push_back(name); + + // fill map + fMapHisto[index]=hist; + + return hist; +} + + + +//////////////////////////////////////////////////////////////////////////////// +TH1* TLaBr3Spectra::GetHisto(string& family, string& name){ + vector<string> index; + index.push_back(family); + index.push_back(name); + TH1* histo ; + + try{ + histo = fMapHisto.at(index); + } + + catch(const std::out_of_range& oor){ + cout << "ERROR : the folowing Histo has been requested by TLaBr3Spectra and does not exist: family:" << family << " name: " << name << endl ; + exit(1); + } + + return histo; +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TLaBr3Spectra::WriteHisto(string filename) +{ + TFile *f = NULL; + + if (filename != "VOID") { + f = new TFile(filename.c_str(), "RECREATE"); + } + + map< vector<string>, TH1* >::iterator it; + for (it=fMapHisto.begin(); it!=fMapHisto.end(); ++it) { + it->second->Write(); + } + + if (filename != "VOID") { + f->Close(); + delete f; + } +} + + + +/////////////////////////////////////////////////////////////////////////////// +void TLaBr3Spectra::CheckSpectra() +{ + map< vector<string>, TH1* >::iterator it; + Color_t ok_color = kTeal+9; + Color_t warning_color = kOrange+8; warning_color *= 1; + Color_t bad_color = kRed; bad_color *= 1; + + for (it=fMapHisto.begin(); it!=fMapHisto.end(); ++it) + { + it->second->SetLineColor(ok_color); + it->second->SetFillStyle(1001); + it->second->SetFillColor(ok_color); + } +} diff --git a/NPLib/LaBr3/TLaBr3Spectra.h b/NPLib/LaBr3/TLaBr3Spectra.h new file mode 100644 index 0000000000000000000000000000000000000000..2fd12cd33aadd52bd40d50e9c02d8b2e220037dd --- /dev/null +++ b/NPLib/LaBr3/TLaBr3Spectra.h @@ -0,0 +1,82 @@ +#ifndef TLABR3SPECTRA_H +#define TLABR3SPECTRA_H +/***************************************************************************** + * Copyright (C) 2009-2013 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: N. de Sereville contact address: deserevi@ipno.in2p3.fr * + * * + * Creation Date : dec 2013 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class holds all the online spectra needed for LaBr3 * + * * + *---------------------------------------------------------------------------* + * Comment: * + * + first version (not complete yet) * + * * + * * + *****************************************************************************/ + +// C++ STL headers +#include <map> + +// ROOT headers +#include "TObject.h" +#include <TH1.h> +#include <TH2.h> + +// NPLib headers +#include "TLaBr3Data.h" +#include "TLaBr3Physics.h" +using namespace std; + +// ForwardDeclaration +class TLaBr3Physics; + +class TLaBr3Spectra { + public: + // constructor and destructor + TLaBr3Spectra(); + TLaBr3Spectra(unsigned int NumberOfTelescope); + ~TLaBr3Spectra(); + + private: + // Instantiate and register histo to maps + TH1* AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family); + TH1* AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, + Int_t nbinsy, Double_t ylow, Double_t yup, string family); + + // Initialization methods + void InitRawSpectra(); + void InitPreTreatedSpectra(); + void InitPhysicsSpectra(); + + public: + // Filling methods + void FillRawSpectra(TLaBr3Data*); + void FillPreTreatedSpectra(TLaBr3Data*); + void FillPhysicsSpectra(TLaBr3Physics*); + // Check the Spectra + void CheckSpectra(); + + public: + // get map histo which will be used for GSpectra in GUser + map< vector<string>, TH1* > GetMapHisto() const {return fMapHisto;} + TH1* GetHisto(string& family,string& name); + void WriteHisto(string filename="VOID"); + + private: // Information on CHARISSA + unsigned int fNumberDetector; + + private: + // map holding histo pointers and their family names + map< vector<string>, TH1* > fMapHisto; +}; + +#endif diff --git a/NPLib/MUST2/TMust2Physics.cxx b/NPLib/MUST2/TMust2Physics.cxx index 754d2562802b79c978fe9ab3025d3e47f99846ef..9ff701a2bcc6c451eecadd8a7de84bf0a57b9064 100644 --- a/NPLib/MUST2/TMust2Physics.cxx +++ b/NPLib/MUST2/TMust2Physics.cxx @@ -1060,8 +1060,13 @@ void TMust2Physics::ClearSpectra(){ // To be done } /////////////////////////////////////////////////////////////////////////// -map< vector<TString> , TH1*> TMust2Physics::GetSpectra() { -return m_Spectra->GetMapHisto(); +map< vector<string> , TH1*> TMust2Physics::GetSpectra() { + if(m_Spectra) + return m_Spectra->GetMapHisto(); + else{ + map< vector<string> , TH1*> empty; + return empty; + } } /////////////////////////////////////////////////////////////////////////// void TMust2Physics::AddParameterToCalibrationManager() diff --git a/NPLib/MUST2/TMust2Physics.h b/NPLib/MUST2/TMust2Physics.h index 951e91d5778a564749cefc5266fcb0ec09be9fe0..c701379079bda28f2e8f7bb7f5b081dbf1f699c9 100644 --- a/NPLib/MUST2/TMust2Physics.h +++ b/NPLib/MUST2/TMust2Physics.h @@ -276,7 +276,7 @@ class TMust2Physics : public TObject, public NPA::VDetector{ TMust2Spectra* m_Spectra;//! public: // Spectra Getter - map< vector<TString> , TH1*> GetSpectra(); + map< vector<string> , TH1*> GetSpectra(); ClassDef(TMust2Physics,1) // Must2Physics structure }; diff --git a/NPLib/MUST2/TMust2Spectra.cxx b/NPLib/MUST2/TMust2Spectra.cxx index 8000eb4e60731a12642b062ed773d21ef3152c84..e1c3ee32c81ded8dc7f5cf6e0bbd26d8c2ff3947 100644 --- a/NPLib/MUST2/TMust2Spectra.cxx +++ b/NPLib/MUST2/TMust2Spectra.cxx @@ -3,7 +3,7 @@ * * * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * * For the list of contributors see $NPTOOL/Licence/Contributors * - *****************************************************************************/ + ****************************************************************************/ /***************************************************************************** * Original Author: N. de Sereville contact address: deserevi@ipno.in2p3.fr * @@ -21,6 +21,10 @@ * * *****************************************************************************/ +// STL +#include <stdexcept> +#include <iostream> +#include <cstdlib> // NPL #include "TMust2Spectra.h" #include "NPOptionManager.h" @@ -32,11 +36,10 @@ using namespace NPUNITS; // ROOT -#include "TString.h" +#include "string.h" #include "TDirectory.h" #include "TFile.h" - //////////////////////////////////////////////////////////////////////////////// TMust2Spectra::TMust2Spectra(){ fNumberOfTelescope = 0; @@ -71,54 +74,54 @@ TMust2Spectra::~TMust2Spectra(){ //////////////////////////////////////////////////////////////////////////////// void TMust2Spectra::InitRawSpectra(){ - TString name; + string name; for (unsigned int i = 0; i < fNumberOfTelescope; i++) { // loop on number of detectors // STRX_E_RAW - name = Form("MM%d_STRX_E_RAW", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_STRX_E_RAW"; AddHisto2D(name, name, fStripX, 1, fStripX+1, 512, 0, 8192, "MUST2/RAW/STRXE"); // STRY_E_RAW - name = Form("MM%d_STRY_E_RAW", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_STRY_E_RAW"; AddHisto2D(name, name, fStripY, 1, fStripY+1, 512, 0, 8192, "MUST2/RAW/STRYE"); // STRX_T_RAW - name = Form("MM%d_STRX_T_RAW", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_STRX_T_RAW"; AddHisto2D(name, name, fStripX, 1, fStripX+1, 512, 0, 8192, "MUST2/RAW/STRXT"); // STRY_T_RAW - name = Form("MM%d_STRY_T_RAW", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_STRY_T_RAW"; AddHisto2D(name, name, fStripY, 1, fStripY+1, 512, 0, 8192, "MUST2/RAW/STRYT"); // SILI_E_RAW - name = Form("MM%d_SILI_E_RAW", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_SILI_E_RAW"; AddHisto2D(name, name, fPadSili, 1, fPadSili+1, 512, 0, 8192, "MUST2/RAW/SILIE"); // SILI_T_RAW - name = Form("MM%d_SILI_T_RAW", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_SILI_T_RAW"; AddHisto2D(name, name, fPadSili, 1, fPadSili+1, 512, 0, 8192, "MUST2/RAW/SILIT"); // CSI_E_RAW - name = Form("MM%d_CSI_E_RAW", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_CSI_E_RAW"; AddHisto2D(name, name, fCrystalCsI, 1, fCrystalCsI+1, 512, 0, 16384, "MUST2/RAW/CSIE"); // CSI_T_RAW - name = Form("MM%d_CSI_T_RAW", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_CSI_T_RAW"; AddHisto2D(name, name, fCrystalCsI, 1, fCrystalCsI+1, 512, 0, 8192, "MUST2/RAW/CSIT"); // STRX_RAW_MULT - name = Form("MM%d_STRX_RAW_MULT", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_STRX_RAW_MULT"; AddHisto1D(name, name, fStripX, 1, fStripX+1, "MUST2/RAW/MULT"); // STRY_RAW_MULT - name = Form("MM%d_STRY_RAW_MULT", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_STRY_RAW_MULT"; AddHisto1D(name, name, fStripX, 1, fStripX+1, "MUST2/RAW/MULT"); // SILI_RAW_MULT - name = Form("MM%d_SILI_RAW_MULT", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_SILI_RAW_MULT"; AddHisto1D(name, name, fPadSili, 1, fPadSili+1, "MUST2/RAW/MULT"); // CSI_RAW_MULT - name = Form("MM%d_CSI_RAW_MULT", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_CSI_RAW_MULT"; AddHisto1D(name, name, fCrystalCsI, 1, fCrystalCsI+1, "MUST2/RAW/MULT"); } // end loop on number of detectors } @@ -126,59 +129,59 @@ void TMust2Spectra::InitRawSpectra(){ //////////////////////////////////////////////////////////////////////////////// void TMust2Spectra::InitPreTreatedSpectra() { - TString name; + string name; for (unsigned int i = 0; i < fNumberOfTelescope; i++) { // loop on number of detectors // STRX_E_CAL - name = Form("MM%d_STRX_E_CAL", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_STRX_E_CAL"; AddHisto2D(name, name, fStripX, 1, fStripX+1, 500, 0, 50, "MUST2/CAL/STRXE"); // STRY_E_CAL - name = Form("MM%d_STRY_E_CAL", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_STRY_E_CAL"; AddHisto2D(name, name, fStripY, 1, fStripY+1, 500, 0, 50, "MUST2/CAL/STRYE"); // STRX_T_CAL - name = Form("MM%d_STRX_T_CAL", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_STRX_T_CAL"; AddHisto2D(name, name, fStripX, 1, fStripX+1, 500, 0, 500, "MUST2/CAL/STRXT"); // STRY_T_CAL - name = Form("MM%d_STRY_T_CAL", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_STRY_T_CAL"; AddHisto2D(name, name, fStripY, 1, fStripY+1, 500, 0, 500, "MUST2/CAL/STRYT"); // SILI_E_CAL - name = Form("MM%d_SILI_E_CAL", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_SILI_E_CAL"; AddHisto2D(name, name, fPadSili, 1, fPadSili+1, 500, 0, 50, "MUST2/CAL/SILIE"); // SILI_T_CAL - name = Form("MM%d_SILI_T_CAL", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_SILI_T_CAL"; AddHisto2D(name, name, fPadSili, 1, fPadSili+1, 500, 0, 50, "MUST2/CAL/SILIT"); // CSI_E_CAL - name = Form("MM%d_CSI_E_CAL", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_CSI_E_CAL"; AddHisto2D(name, name, fCrystalCsI, 1, fCrystalCsI+1, 500, 0, 500, "MUST2/CAL/CSIE"); // CSI_T_CAL - name = Form("MM%d_CSI_T_CAL", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_CSI_T_CAL"; AddHisto2D(name, name, fCrystalCsI, 1, fCrystalCsI+1, 500, 0, 50, "MUST2/CAL/CSIT"); // STRX_CAL_MULT - name = Form("MM%d_STRX_CAL_MULT", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_STRX_CAL_MULT"; AddHisto1D(name, name, fStripX, 1, fStripX+1, "MUST2/CAL/MULT"); // STRY_CAL_MULT - name = Form("MM%d_STRY_CAL_MULT", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_STRY_CAL_MULT"; AddHisto1D(name, name, fStripX, 1, fStripX+1, "MUST2/CAL/MULT"); // SILI_CAL_MULT - name = Form("MM%d_SILI_CAL_MULT", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_SILI_CAL_MULT"; AddHisto1D(name, name, fPadSili, 1, fPadSili+1, "MUST2/CAL/MULT"); // CSI_CAL_MULT - name = Form("MM%d_CSI_CAL_MULT", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_CSI_CAL_MULT"; AddHisto1D(name, name, fCrystalCsI, 1, fCrystalCsI+1, "MUST2/CAL/MULT"); // CSI_CAL_ID for(unsigned int j = 0 ; j < fCrystalCsI ; j++){ - name = Form("MM%d_CSI%d_CAL_ID", i+1,j+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_CSI"+MUST2_LOCAL::itoa(j+1)+"_CAL_ID"; AddHisto2D(name, name,8192,0,16384,500,0,50, "MUST2/CAL/ID"); } } // end loop on number of detectors @@ -186,7 +189,7 @@ void TMust2Spectra::InitPreTreatedSpectra() //////////////////////////////////////////////////////////////////////////////// void TMust2Spectra::InitPhysicsSpectra(){ - TString name; + string name; // X-Y Impact Matrix name = "MM_IMPACT_MATRIX"; AddHisto2D(name, name,500,-150,150,500,-150,150, "MUST2/PHY"); @@ -197,14 +200,14 @@ void TMust2Spectra::InitPhysicsSpectra(){ // X-Y Energy Correlation for (unsigned int i = 0 ; i < fNumberOfTelescope ; i++) { // loop on number of detectors - name = Form("MM%d_XY_COR", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_XY_COR"; AddHisto2D(name, name,500,0,50,500,0,50, "MUST2/PHY"); } // ID Plot // E-TOF: name = "MM_E_TOF"; - AddHisto2D(name, name,500,0,50,1000,200,1200,"MUST2/PHY"); + AddHisto2D(name, name,500,0,50,500,200,1200,"MUST2/PHY"); // SILIE-DE: name = "MM_SILIE_E"; @@ -222,19 +225,19 @@ void TMust2Spectra::InitPhysicsSpectra(){ // ID plot detector by detector for (unsigned int i = 0; i < fNumberOfTelescope; i++) { // loop on number of detectors // E-TOF: - name = Form("MM%d_E_TOF",i+1); - AddHisto2D(name, name,500,0,50,1000,200,1200,"MUST2/PHY"); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_E_TOF"; + AddHisto2D(name, name,500,0,50,500,200,1200,"MUST2/PHY"); // SILIE-DE: - name = Form("MM%d_SILIE_E",i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_SILIE_E"; AddHisto2D(name, name,500,0,200,500,0,50,"MUST2/PHY"); // CSI-DE: - name = Form("MM%d_CSIE_E",i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_CSIE_E"; AddHisto2D(name, name,500,0,500,500,0,50,"MUST2/PHY"); // Etot-DE: - name = Form("MM%d_Etot_E",i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_Etot_E"; AddHisto2D(name, name,500,0,500,500,0,50,"MUST2/PHY"); } } @@ -243,12 +246,12 @@ void TMust2Spectra::InitPhysicsSpectra(){ //////////////////////////////////////////////////////////////////////////////// void TMust2Spectra::FillRawSpectra(TMust2Data* RawData){ - TString name; - TString family; + string name; + string family; // STRX_E for (unsigned int i = 0; i < RawData->GetMMStripXEMult(); i++) { - name = Form("MM%d_STRX_E_RAW", RawData->GetMMStripXEDetectorNbr(i) ); + name = "MM"+MUST2_LOCAL::itoa(RawData->GetMMStripXEDetectorNbr(i))+"_STRX_E_RAW"; family = "MUST2/RAW/STRXE"; GetHisto(family,name) @@ -258,7 +261,7 @@ void TMust2Spectra::FillRawSpectra(TMust2Data* RawData){ // STRY_E for (unsigned int i = 0; i < RawData->GetMMStripYEMult(); i++) { - name = Form("MM%d_STRY_E_RAW", RawData->GetMMStripYEDetectorNbr(i) ); + name = "MM"+MUST2_LOCAL::itoa( RawData->GetMMStripYEDetectorNbr(i) )+"_STRY_E_RAW"; family = "MUST2/RAW/STRYE"; GetHisto(family,name) @@ -268,7 +271,7 @@ void TMust2Spectra::FillRawSpectra(TMust2Data* RawData){ // STRX_T for (unsigned int i = 0; i < RawData->GetMMStripXTMult(); i++) { - name = Form("MM%d_STRX_T_RAW", RawData->GetMMStripXTDetectorNbr(i) ); + name = "MM"+MUST2_LOCAL::itoa(RawData->GetMMStripXTDetectorNbr(i))+"_STRX_T_RAW"; family = "MUST2/RAW/STRXT"; GetHisto(family,name) @@ -277,7 +280,7 @@ void TMust2Spectra::FillRawSpectra(TMust2Data* RawData){ } // STRY_T for (unsigned int i = 0; i < RawData->GetMMStripYTMult(); i++) { - name = Form("MM%d_STRY_T_RAW", RawData->GetMMStripYTDetectorNbr(i) ); + name = "MM"+MUST2_LOCAL::itoa(RawData->GetMMStripYTDetectorNbr(i))+"_STRY_T_RAW"; family = "MUST2/RAW/STRYT"; GetHisto(family,name) @@ -287,7 +290,7 @@ void TMust2Spectra::FillRawSpectra(TMust2Data* RawData){ // SILI_E for (unsigned int i = 0; i < RawData->GetMMSiLiEMult(); i++) { - name = Form("MM%d_SILI_E_RAW", RawData->GetMMSiLiEDetectorNbr(i) ); + name = "MM"+MUST2_LOCAL::itoa( RawData->GetMMSiLiEDetectorNbr(i))+"_SILI_E_RAW"; family = "MUST2/RAW/SILIE"; GetHisto(family,name) @@ -297,7 +300,7 @@ void TMust2Spectra::FillRawSpectra(TMust2Data* RawData){ // SILI_T for (unsigned int i = 0; i < RawData->GetMMSiLiTMult(); i++) { - name = Form("MM%d_SILI_T_RAW", RawData->GetMMSiLiTDetectorNbr(i) ); + name = "MM"+MUST2_LOCAL::itoa(RawData->GetMMSiLiTDetectorNbr(i))+"_SILI_T_RAW"; family = "MUST2/RAW/SILIT"; GetHisto(family,name) @@ -307,7 +310,7 @@ void TMust2Spectra::FillRawSpectra(TMust2Data* RawData){ // CSI_E for (unsigned int i = 0; i < RawData->GetMMCsIEMult(); i++) { - name = Form("MM%d_CSI_E_RAW", RawData->GetMMCsIEDetectorNbr(i) ); + name = "MM"+MUST2_LOCAL::itoa(RawData->GetMMCsIEDetectorNbr(i))+"_CSI_E_RAW"; family = "MUST2/RAW/CSIE"; GetHisto(family,name) @@ -317,7 +320,7 @@ void TMust2Spectra::FillRawSpectra(TMust2Data* RawData){ // CSI_T for (unsigned int i = 0; i < RawData->GetMMCsITMult(); i++) { - name = Form("MM%d_CSI_T_RAW", RawData->GetMMCsITDetectorNbr(i) ); + name = "MM"+MUST2_LOCAL::itoa( RawData->GetMMCsITDetectorNbr(i))+"_CSI_T_RAW"; family = "MUST2/RAW/CSIT"; GetHisto(family,name) @@ -336,7 +339,7 @@ void TMust2Spectra::FillRawSpectra(TMust2Data* RawData){ for( unsigned int i = 0; i < fNumberOfTelescope; i++){ - name = Form("MM%d_STRX_RAW_MULT", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_STRX_RAW_MULT"; family= "MUST2/RAW/MULT"; GetHisto(family,name) -> Fill(myMULT[i]); @@ -351,7 +354,7 @@ void TMust2Spectra::FillRawSpectra(TMust2Data* RawData){ } for( unsigned int i = 0; i < fNumberOfTelescope; i++){ - name = Form("MM%d_STRY_RAW_MULT", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_STRY_RAW_MULT"; family= "MUST2/RAW/MULT"; GetHisto(family,name) -> Fill(myMULT[i]); @@ -366,7 +369,7 @@ void TMust2Spectra::FillRawSpectra(TMust2Data* RawData){ } for( unsigned int i = 0; i < fNumberOfTelescope; i++){ - name = Form("MM%d_SILI_RAW_MULT", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_SILI_RAW_MULT"; family= "MUST2/RAW/MULT"; GetHisto(family,name) -> Fill(myMULT[i]); @@ -381,7 +384,7 @@ void TMust2Spectra::FillRawSpectra(TMust2Data* RawData){ } for( unsigned int i = 0; i < fNumberOfTelescope; i++){ - name = Form("MM%d_CSI_RAW_MULT", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_CSI_RAW_MULT"; family= "MUST2/RAW/MULT"; GetHisto(family,name) -> Fill(myMULT[i]); @@ -391,11 +394,11 @@ void TMust2Spectra::FillRawSpectra(TMust2Data* RawData){ //////////////////////////////////////////////////////////////////////////////// void TMust2Spectra::FillPreTreatedSpectra(TMust2Data* PreTreatedData){ - TString name ; - TString family; + string name ; + string family; // STRX_E for (unsigned int i = 0; i < PreTreatedData->GetMMStripXEMult(); i++) { - name = Form("MM%d_STRX_E_CAL", PreTreatedData->GetMMStripXEDetectorNbr(i) ); + name = "MM"+MUST2_LOCAL::itoa(PreTreatedData->GetMMStripXEDetectorNbr(i))+"_STRX_E_CAL"; family = "MUST2/CAL/STRXE"; GetHisto(family,name) @@ -404,7 +407,7 @@ void TMust2Spectra::FillPreTreatedSpectra(TMust2Data* PreTreatedData){ } // STRY_E for (unsigned int i = 0; i < PreTreatedData->GetMMStripYEMult(); i++) { - name = Form("MM%d_STRY_E_CAL", PreTreatedData->GetMMStripYEDetectorNbr(i) ); + name = "MM"+MUST2_LOCAL::itoa( PreTreatedData->GetMMStripYEDetectorNbr(i))+"_STRY_E_CAL"; family = "MUST2/CAL/STRYE"; GetHisto(family,name) @@ -413,7 +416,7 @@ void TMust2Spectra::FillPreTreatedSpectra(TMust2Data* PreTreatedData){ } // STRX_T for (unsigned int i = 0; i < PreTreatedData->GetMMStripXTMult(); i++) { - name = Form("MM%d_STRX_T_CAL", PreTreatedData->GetMMStripXTDetectorNbr(i) ); + name = "MM"+MUST2_LOCAL::itoa(PreTreatedData->GetMMStripXTDetectorNbr(i))+"_STRX_T_CAL"; family = "MUST2/CAL/STRXT"; GetHisto(family,name) @@ -422,7 +425,7 @@ void TMust2Spectra::FillPreTreatedSpectra(TMust2Data* PreTreatedData){ } // STRY_T for (unsigned int i = 0; i < PreTreatedData->GetMMStripYTMult(); i++) { - name = Form("MM%d_STRY_T_CAL", PreTreatedData->GetMMStripYTDetectorNbr(i) ); + name = "MM"+MUST2_LOCAL::itoa(PreTreatedData->GetMMStripYTDetectorNbr(i))+"_STRY_T_CAL"; family = "MUST2/CAL/STRYT"; GetHisto(family,name) @@ -431,7 +434,7 @@ void TMust2Spectra::FillPreTreatedSpectra(TMust2Data* PreTreatedData){ } // SILI_E for (unsigned int i = 0; i < PreTreatedData->GetMMSiLiEMult(); i++) { - name = Form("MM%d_SILI_E_CAL", PreTreatedData->GetMMSiLiEDetectorNbr(i) ); + name = "MM"+MUST2_LOCAL::itoa(PreTreatedData->GetMMSiLiEDetectorNbr(i) )+"_SILI_E_CAL"; family = "MUST2/CAL/SILIE"; GetHisto(family,name) @@ -440,7 +443,7 @@ void TMust2Spectra::FillPreTreatedSpectra(TMust2Data* PreTreatedData){ } // SILI_T for (unsigned int i = 0; i < PreTreatedData->GetMMSiLiTMult(); i++) { - name = Form("MM%d_SILI_T_CAL", PreTreatedData->GetMMSiLiTDetectorNbr(i) ); + name = "MM"+MUST2_LOCAL::itoa(PreTreatedData->GetMMSiLiTDetectorNbr(i))+"_SILI_T_CAL"; family = "MUST2/CAL/SILIT"; GetHisto(family,name) @@ -449,7 +452,7 @@ void TMust2Spectra::FillPreTreatedSpectra(TMust2Data* PreTreatedData){ } // CSI_E for (unsigned int i = 0; i < PreTreatedData->GetMMCsIEMult(); i++) { - name = Form("MM%d_CSI_E_CAL", PreTreatedData->GetMMCsIEDetectorNbr(i) ); + name = "MM"+MUST2_LOCAL::itoa(PreTreatedData->GetMMCsIEDetectorNbr(i))+"_CSI_E_CAL"; family = "MUST2/CAL/CSIE"; GetHisto(family,name) @@ -459,7 +462,7 @@ void TMust2Spectra::FillPreTreatedSpectra(TMust2Data* PreTreatedData){ // CSI_T for (unsigned int i = 0; i < PreTreatedData->GetMMCsITMult(); i++) { - name = Form("MM%d_CSI_T_CAL", PreTreatedData->GetMMCsITDetectorNbr(i) ); + name = "MM"+MUST2_LOCAL::itoa(PreTreatedData->GetMMCsITDetectorNbr(i))+"_CSI_T_CAL"; family = "MUST2/CAL/CSIT"; GetHisto(family,name) @@ -478,7 +481,7 @@ void TMust2Spectra::FillPreTreatedSpectra(TMust2Data* PreTreatedData){ for( unsigned int i = 0; i < fNumberOfTelescope; i++){ - name = Form("MM%d_STRX_CAL_MULT", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_STRX_CAL_MULT"; family= "MUST2/CAL/MULT"; GetHisto(family,name) -> Fill(myMULT[i]); @@ -493,7 +496,7 @@ void TMust2Spectra::FillPreTreatedSpectra(TMust2Data* PreTreatedData){ } for( unsigned int i = 0; i < fNumberOfTelescope; i++){ - name = Form("MM%d_STRY_CAL_MULT", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_STRY_CAL_MULT"; family= "MUST2/CAL/MULT"; GetHisto(family,name) -> Fill(myMULT[i]); @@ -508,7 +511,7 @@ void TMust2Spectra::FillPreTreatedSpectra(TMust2Data* PreTreatedData){ } for( unsigned int i = 0; i < fNumberOfTelescope; i++){ - name = Form("MM%d_SILI_CAL_MULT", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_SILI_CAL_MULT"; family= "MUST2/CAL/MULT"; GetHisto(family,name) -> Fill(myMULT[i]); @@ -523,7 +526,7 @@ void TMust2Spectra::FillPreTreatedSpectra(TMust2Data* PreTreatedData){ } for( unsigned int i = 0; i < fNumberOfTelescope; i++){ - name = Form("MM%d_CSI_CAL_MULT", i+1); + name = "MM"+MUST2_LOCAL::itoa(i+1)+"_CSI_CAL_MULT"; family= "MUST2/CAL/MULT"; GetHisto(family,name) -> Fill(myMULT[i]); @@ -535,8 +538,7 @@ void TMust2Spectra::FillPreTreatedSpectra(TMust2Data* PreTreatedData){ for (unsigned int j = 0; j < PreTreatedData->GetMMCsIEMult(); j++) { if(PreTreatedData->GetMMStripXEDetectorNbr(i) == PreTreatedData->GetMMCsIEDetectorNbr(j)){ - name = Form("MM%d_CSI%d_CAL_ID", - PreTreatedData->GetMMStripXEDetectorNbr(i),PreTreatedData->GetMMCsIECristalNbr(j)); + name = "MM"+MUST2_LOCAL::itoa(PreTreatedData->GetMMStripXEDetectorNbr(i))+"_CSI"+MUST2_LOCAL::itoa(PreTreatedData->GetMMCsIECristalNbr(j))+"_CAL_ID"; GetHisto(family,name) -> Fill(PreTreatedData->GetMMCsIEEnergy(j), @@ -550,8 +552,8 @@ void TMust2Spectra::FillPreTreatedSpectra(TMust2Data* PreTreatedData){ //////////////////////////////////////////////////////////////////////////////// void TMust2Spectra::FillPhysicsSpectra(TMust2Physics* Physics){ - TString name; - TString family= "MUST2/PHY"; + string name; + string family= "MUST2/PHY"; // X-Y Impact Matrix for(unsigned int i = 0 ; i < Physics->Si_E.size(); i++){ @@ -566,7 +568,7 @@ void TMust2Spectra::FillPhysicsSpectra(TMust2Physics* Physics){ GetHisto(family,name)-> Fill(Theta,Physics->Si_E[i]); // STRX_E_CAL - name = Form("MM%d_XY_COR", Physics->TelescopeNumber[i]); + name = "MM"+MUST2_LOCAL::itoa( Physics->TelescopeNumber[i])+"_XY_COR"; GetHisto(family,name)-> Fill(Physics->Si_EX[i],Physics->Si_EY[i]); @@ -576,7 +578,7 @@ void TMust2Spectra::FillPhysicsSpectra(TMust2Physics* Physics){ name = "MM_E_TOF"; GetHisto(family,name)->Fill(Physics->Si_E[i],Physics->Si_T[i]); - name = Form("MM%d_E_TOF", Physics->TelescopeNumber[i]); + name = "MM"+MUST2_LOCAL::itoa(Physics->TelescopeNumber[i])+"_E_TOF"; GetHisto(family,name)->Fill(Physics->Si_E[i],Physics->Si_T[i]); } @@ -586,7 +588,7 @@ void TMust2Spectra::FillPhysicsSpectra(TMust2Physics* Physics){ Etot = Physics->SiLi_E[i]; GetHisto(family,name)->Fill(Physics->SiLi_E[i],Physics->Si_E[i]); - name = Form("MM%d_SILIE_E", Physics->TelescopeNumber[i]); + name = "MM"+MUST2_LOCAL::itoa(Physics->TelescopeNumber[i])+"_SILIE_E"; GetHisto(family,name)->Fill(Physics->SiLi_E[i],Physics->Si_E[i]); } @@ -594,7 +596,7 @@ void TMust2Spectra::FillPhysicsSpectra(TMust2Physics* Physics){ name = "MM_CSIE_E"; Etot += Physics->CsI_E[i]; GetHisto(family,name)->Fill(Physics->CsI_E[i],Physics->Si_E[i]); - name = Form("MM%d_CSIE_E", Physics->TelescopeNumber[i]); + name = "MM"+MUST2_LOCAL::itoa(Physics->TelescopeNumber[i])+"_CSIE_E"; GetHisto(family,name)->Fill(Physics->CsI_E[i],Physics->Si_E[i]); } @@ -602,7 +604,7 @@ void TMust2Spectra::FillPhysicsSpectra(TMust2Physics* Physics){ if(Etot>0){ name = "MM_Etot_E"; GetHisto(family,name)->Fill(Etot,Physics->Si_E[i]); - name = Form("MM%d_Etot_E", Physics->TelescopeNumber[i]); + name = "MM"+MUST2_LOCAL::itoa(Physics->TelescopeNumber[i])+"_Etot_E"; GetHisto(family,name)->Fill(Etot,Physics->Si_E[i]); } @@ -610,11 +612,11 @@ void TMust2Spectra::FillPhysicsSpectra(TMust2Physics* Physics){ } //////////////////////////////////////////////////////////////////////////////// -TH1* TMust2Spectra::AddHisto1D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, TString family){ +TH1* TMust2Spectra::AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family){ // create histo - TH1 *hist = new TH1D(name, title, nbinsx, xlow, xup); + TH1 *hist = new TH1D(name.c_str(), title.c_str(), nbinsx, xlow, xup); - vector<TString> index ; + vector<string> index ; index.push_back(family); index.push_back(name); @@ -625,11 +627,11 @@ TH1* TMust2Spectra::AddHisto1D(TString name, TString title, Int_t nbinsx, Double } //////////////////////////////////////////////////////////////////////////////// -TH1* TMust2Spectra::AddHisto2D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, Int_t nbinsy, Double_t ylow, Double_t yup, TString family){ +TH1* TMust2Spectra::AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, Int_t nbinsy, Double_t ylow, Double_t yup, string family){ // create histo - TH1 *hist = new TH2D(name, title, nbinsx, xlow, xup, nbinsy, ylow, yup); + TH1 *hist = new TH2D(name.c_str(), title.c_str(), nbinsx, xlow, xup, nbinsy, ylow, yup); - vector<TString> index ; + vector<string> index ; index.push_back(family); index.push_back(name); @@ -640,24 +642,34 @@ TH1* TMust2Spectra::AddHisto2D(TString name, TString title, Int_t nbinsx, Double } //////////////////////////////////////////////////////////////////////////////// -TH1* TMust2Spectra::GetHisto(TString family, TString name){ - vector<TString> index ; +TH1* TMust2Spectra::GetHisto(string& family, string& name){ + vector<string> index; + index.reserve(2); index.push_back(family); index.push_back(name); + TH1* histo ; + + try{ + histo = fMapHisto.at(index); + } - // fill map - return fMapHisto.at(index); + catch(const std::out_of_range& oor){ + cout << "ERROR : the folowing Histo has been requested by TMust2Spectra and does not exist: family:" << family << " name: " << name << endl ; + exit(1); + } + + return histo; } //////////////////////////////////////////////////////////////////////////////// -void TMust2Spectra::WriteHisto(TString filename){ +void TMust2Spectra::WriteHisto(string filename){ TFile* f=NULL; if(filename!="VOID"){ - f = new TFile(filename,"RECREATE"); + f = new TFile(filename.c_str(),"RECREATE"); } - map< vector<TString>, TH1* >::iterator it; + map< vector<string>, TH1* >::iterator it; for (it=fMapHisto.begin(); it!=fMapHisto.end(); ++it){ it->second->Write(); @@ -671,7 +683,7 @@ void TMust2Spectra::WriteHisto(TString filename){ } /////////////////////////////////////////////////////////////////////////////// void TMust2Spectra::CheckSpectra(){ - map< vector<TString>, TH1* >::iterator it; + map< vector<string>, TH1* >::iterator it; Color_t ok_color = kTeal+9; Color_t warning_color = kOrange+8; warning_color *= 1; Color_t bad_color = kRed; bad_color *= 1; diff --git a/NPLib/MUST2/TMust2Spectra.h b/NPLib/MUST2/TMust2Spectra.h index 308004ad288ceac0a5365c9bb305dd5e345eff8d..ec3d3e3d2c476fcd6920e16950b583ca3e00c694 100644 --- a/NPLib/MUST2/TMust2Spectra.h +++ b/NPLib/MUST2/TMust2Spectra.h @@ -30,7 +30,6 @@ #include "TObject.h" #include <TH1.h> #include <TH2.h> -#include <TString.h> // NPLib headers #include "TMust2Data.h" @@ -49,9 +48,9 @@ class TMust2Spectra { private: // Instantiate and register histo to maps - TH1* AddHisto1D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, TString family); - TH1* AddHisto2D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, - Int_t nbinsy, Double_t ylow, Double_t yup,TString family); + TH1* AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family); + TH1* AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, + Int_t nbinsy, Double_t ylow, Double_t yup,string family); // Initialization methods void InitRawSpectra(); @@ -68,9 +67,9 @@ class TMust2Spectra { public: // get map histo which will be used for GSpectra in GUser - map< vector<TString>, TH1* > GetMapHisto() const {return fMapHisto;} - TH1* GetHisto(TString family,TString name); - void WriteHisto(TString filename="VOID"); + map< vector<string>, TH1* > GetMapHisto() const {return fMapHisto;} + TH1* GetHisto(string& family,string& name); + void WriteHisto(string filename="VOID"); private: // Information on MUST2 unsigned int fNumberOfTelescope; @@ -81,7 +80,7 @@ class TMust2Spectra { private: // map holding histo pointers and their family names - map< vector<TString>, TH1* > fMapHisto; + map< vector<string>, TH1* > fMapHisto; }; #endif diff --git a/NPLib/Makefile b/NPLib/Makefile index 4a1f3f20b646507a4a16834dc0e6b0e84271bb39..4a530248935088509bbfa973ba9d6ace8fded96b 100644 --- a/NPLib/Makefile +++ b/NPLib/Makefile @@ -3,59 +3,53 @@ include $(NPTOOL)/NPLib/Makefile.arch #include /usr/local/root-5.32.01/etc/Makefile.arch #------------------------------------------------------------------------------ -SHARELIB = SharedLib +SHARELIB = $(shell cat .core_libs) +SHARELIB += $(shell cat .detector_libs) FILLINC = FillIncludeDir FILLLIB = FillLibraryDir LIBLIST = liblistfile -all: $(SHARELIB) $(FILLLIB) $(LIBLIST) +#Silence the process +all: .SILENT +.SILENT: $(SHARELIB) $(LIBLIST) + #------------------------------------------------------------------------------ ############### fillinclib ############## FillIncludeDir: ./scripts/fillincdir.sh -FillLibraryDir: - ./scripts/filllibdir.sh -#ifeq ($(ARCH),macosx) +FillLibraryDir: $(SHARELIB) $(FILLINC) ifeq ($(findstring macosx, $(ARCH)), macosx) ./scripts/filllibmacdir.sh endif ############### liblist ############## -liblistfile: +liblistfile: $(FILLLIB) $(SHARELIB) $(FILLIB) ./scripts/buildliblist.sh -############### sharedlib ############## -SharedLib: - ./scripts/makefile.sh +########### actual target ############## +# include makefile created by the configure script +# where the wanted detector are defined +include $(NPTOOL)/NPLib/Makefile.detector ############# Clean and More ########## clean: - $(NPTOOL)/NPLib/scripts/makefile.sh clean detector - -cleancore: - $(NPTOOL)/NPLib/scripts/makefile.sh clean core - + rm -f ./*/*.o + distclean: - @echo " + Deleting libraries in lib directory....." + @echo " + Deleting libraries in lib directory" rm -f ./lib/* - @echo " + Deleting header files in include directory....." + @echo " + Deleting header files in include directory" rm -f ./include/* - @echo " + Deleting liblist file....." + @echo " + Deleting liblist file" rm -f liblist + @echo " + Emptying Makefile.detector" + rm -f Makefile.detector + touch Makefile.detector + @echo " + Deleting NPToolLogon" rm -f ./scripts/NPToolLogon_C* - ./scripts/makefile.sh distclean detector - ./scripts/makefile.sh distclean core - -# include makefile created by the configure script -# where the wanted detector are defined -include $(NPTOOL)/NPLib/Makefile.detector - -.SUFFIXES: .$(SrcSuf) - -### - -.$(SrcSuf).$(ObjSuf): - $(CXX) $(CXXFLAGS) $(INCLUDE) -c $< - - + @echo " + Deleting intermediate compilation files" + rm -f ./*/*Dict* + rm -f ./*/*.o + @echo " + Deleting shared libraries files in detector directory" + rm -f ./*/*.so diff --git a/NPLib/Physics/NPReaction.cxx b/NPLib/Physics/NPReaction.cxx index b26c96698e2d88912b9e3198bdd8e245fe7f5d12..b25a373b60fbc8391396e10fbfad6f1d37ecb0eb 100644 --- a/NPLib/Physics/NPReaction.cxx +++ b/NPLib/Physics/NPReaction.cxx @@ -88,6 +88,8 @@ Reaction::Reaction(){ ++offset; fCrossSectionHist = new TH1F(Form("EnergyHist_%i",offset),"Reaction_CS",1,0,180); + fExcitationEnergyHist = NULL; + fshoot3=true; fshoot4=true; @@ -151,11 +153,11 @@ Reaction::Reaction(string reaction){ ++offset; fCrossSectionHist = new TH1F(Form("EnergyHist_%i",offset),"Reaction_CS",1,0,180); + fCrossSectionHist = NULL; + fshoot3=true; fshoot4=true; - - initializePrecomputeVariable(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -176,6 +178,9 @@ Reaction::~Reaction(){ if(fCrossSectionHist) delete fCrossSectionHist; + + if(fExcitationEnergyHist) + delete fExcitationEnergyHist; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -208,6 +213,13 @@ double Reaction::ShootRandomThetaCM(){ SetThetaCM( theta=fCrossSectionHist->GetRandom()*deg ); return theta; } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void Reaction::ShootRandomExcitationEnergy(){ + if(fExcitationEnergyHist){ + SetExcitation4(fExcitationEnergyHist->GetRandom()); + } +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Reaction::KineRelativistic(double &ThetaLab3, double &KineticEnergyLab3, double &ThetaLab4, double &KineticEnergyLab4){ @@ -308,6 +320,7 @@ void Reaction::ReadConfigurationFile(string Path){ bool check_Heavy = false ; bool check_ExcitationEnergy3 = false ; bool check_ExcitationEnergy4 = false ; + bool check_ExcitationEnergyDistribution = false; bool check_CrossSectionPath = false ; bool check_shoot3 = false ; bool check_shoot4 = false; @@ -385,7 +398,16 @@ void Reaction::ReadConfigurationFile(string Path){ 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; @@ -442,7 +464,7 @@ void Reaction::ReadConfigurationFile(string Path){ /////////////////////////////////////////////////// // If all Token found toggle out if (check_Beam && check_Target && check_Light && check_Heavy && check_ExcitationEnergy3 - && check_ExcitationEnergy4 && check_CrossSectionPath && check_shoot4 && check_shoot3) + && (check_ExcitationEnergy4 || check_ExcitationEnergyDistribution ) && check_CrossSectionPath && check_shoot4 && check_shoot3) ReadingStatus = false; } } diff --git a/NPLib/Physics/NPReaction.h b/NPLib/Physics/NPReaction.h index 72a2b9654bddc29f6d05a858370b349d33dd7e38..2c4130c5d4566b0bffb82dba8a8838416627bb1d 100644 --- a/NPLib/Physics/NPReaction.h +++ b/NPLib/Physics/NPReaction.h @@ -53,169 +53,172 @@ using namespace NPL; using namespace std; namespace NPL{ - + class Reaction{ - - public: // Constructors and Destructors - Reaction(); - // 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 - Reaction(string); - virtual ~Reaction(); - - public: // Various Method - void ReadConfigurationFile(string Path); - - private: - int fVerboseLevel; - - private: // use for Monte Carlo simulation - bool fshoot3; - bool fshoot4; - - private: // use to display the kinematical line - TGraph* fKineLine3 ; - TGraph* fKineLine4 ; - TGraph* fTheta3VsTheta4; - TGraph* fLineBrho3; - TGraph* fAngleLine; - private: - Beam* fNuclei1; // Beam - Nucleus* fNuclei2; // Target - Nucleus* fNuclei3; // Light ejectile - Nucleus* fNuclei4; // Heavy ejectile - double fQValue; // Q-value in MeV - double fBeamEnergy; // Beam energy in MeV - double fThetaCM; // Center-of-mass angle in radian - double fExcitation3; // Excitation energy in MeV - double fExcitation4; // Excitation energy in MeV - TH1F* fCrossSectionHist; - - public: + + public: // Constructors and Destructors + Reaction(); + // 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 + Reaction(string); + virtual ~Reaction(); + + public: // Various Method + void ReadConfigurationFile(string Path); + + private: + int fVerboseLevel; + + private: // use for Monte Carlo simulation + bool fshoot3; + bool fshoot4; + + private: // use to display the kinematical line + TGraph* fKineLine3 ; + TGraph* fKineLine4 ; + TGraph* fTheta3VsTheta4; + TGraph* fLineBrho3; + TGraph* fAngleLine; + private: + Beam* fNuclei1; // Beam + Nucleus* fNuclei2; // Target + Nucleus* fNuclei3; // Light ejectile + Nucleus* fNuclei4; // Heavy ejectile + double fQValue; // Q-value in MeV + double fBeamEnergy; // Beam energy in MeV + double fThetaCM; // Center-of-mass angle in radian + double fExcitation3; // Excitation energy in MeV + double fExcitation4; // Excitation energy in MeV + TH1F* fCrossSectionHist; // Differential cross section in CM frame + TH1F* fExcitationEnergyHist; // Distribution of Excitation energy + public: // Getters and Setters - void SetBeamEnergy(double eBeam) {fBeamEnergy = eBeam; initializePrecomputeVariable();} - void SetThetaCM(double angle) {fThetaCM = angle; initializePrecomputeVariable();} - void SetExcitation3(double exci) {fExcitation3 = exci; initializePrecomputeVariable();} - void SetExcitation4(double exci) {fExcitation4 = exci; initializePrecomputeVariable();} + void SetBeamEnergy(double eBeam) {fBeamEnergy = eBeam; initializePrecomputeVariable();} + void SetThetaCM(double angle) {fThetaCM = angle; initializePrecomputeVariable();} + void SetExcitation3(double exci) {fExcitation3 = exci; initializePrecomputeVariable();} + void SetExcitation4(double exci) {fExcitation4 = exci; initializePrecomputeVariable();} // For retro compatibility - void SetExcitationLight(double exci) {fExcitation3 = exci; initializePrecomputeVariable();} - void SetExcitationHeavy(double exci) {fExcitation4 = exci; initializePrecomputeVariable();} - void SetVerboseLevel(int verbose) {fVerboseLevel = verbose;} - void SetCrossSectionHist (TH1F* CrossSectionHist) {delete fCrossSectionHist; fCrossSectionHist = CrossSectionHist;} - - double GetBeamEnergy() const {return fBeamEnergy;} - double GetThetaCM() const {return fThetaCM;} - double GetExcitation3() const {return fExcitation3;} - double GetExcitation4() const {return fExcitation4;} - double GetQValue() const {return fQValue;} - Nucleus* GetNucleus1() const {return fNuclei1;} - Nucleus* GetNucleus2() const {return fNuclei2;} - Nucleus* GetNucleus3() const {return fNuclei3;} - Nucleus* GetNucleus4() const {return fNuclei4;} - TH1F* GetCrossSectionHist() const {return fCrossSectionHist;} - int GetVerboseLevel() const {return fVerboseLevel;} - bool GetShoot3() const {return fshoot3;} - bool GetShoot4() const {return fshoot4;} - - - public: + void SetExcitationLight(double exci) {fExcitation3 = exci; initializePrecomputeVariable();} + void SetExcitationHeavy(double exci) {fExcitation4 = exci; initializePrecomputeVariable();} + void SetVerboseLevel(int verbose) {fVerboseLevel = verbose;} + void SetCrossSectionHist (TH1F* CrossSectionHist) {delete fCrossSectionHist; fCrossSectionHist = CrossSectionHist;} + + double GetBeamEnergy() const {return fBeamEnergy;} + double GetThetaCM() const {return fThetaCM;} + double GetExcitation3() const {return fExcitation3;} + double GetExcitation4() const {return fExcitation4;} + double GetQValue() const {return fQValue;} + Nucleus* GetNucleus1() const {return fNuclei1;} + Nucleus* GetNucleus2() const {return fNuclei2;} + Nucleus* GetNucleus3() const {return fNuclei3;} + Nucleus* GetNucleus4() const {return fNuclei4;} + TH1F* GetCrossSectionHist() const {return fCrossSectionHist;} + int GetVerboseLevel() const {return fVerboseLevel;} + bool GetShoot3() const {return fshoot3;} + bool GetShoot4() const {return fshoot4;} + + + public: // Modify the CS histo to so cross section shoot is within ]HalfOpenAngleMin,HalfOpenAngleMax[ - void SetCSAngle(double CSHalfOpenAngleMin,double CSHalfOpenAngleMax); - - private: // intern precompute variable - void initializePrecomputeVariable(); - double m1; - double m2; - double m3; - double m4; - + void SetCSAngle(double CSHalfOpenAngleMin,double CSHalfOpenAngleMax); + + private: // intern precompute variable + void initializePrecomputeVariable(); + double m1; + double m2; + double m3; + double m4; + // Lorents Vector - TLorentzVector fEnergyImpulsionLab_1; - TLorentzVector fEnergyImpulsionLab_2; - TLorentzVector fEnergyImpulsionLab_3; - TLorentzVector fEnergyImpulsionLab_4; - TLorentzVector fTotalEnergyImpulsionLab; - - TLorentzVector fEnergyImpulsionCM_1; - TLorentzVector fEnergyImpulsionCM_2; - TLorentzVector fEnergyImpulsionCM_3; - TLorentzVector fEnergyImpulsionCM_4; - TLorentzVector fTotalEnergyImpulsionCM; - + TLorentzVector fEnergyImpulsionLab_1; + TLorentzVector fEnergyImpulsionLab_2; + TLorentzVector fEnergyImpulsionLab_3; + TLorentzVector fEnergyImpulsionLab_4; + TLorentzVector fTotalEnergyImpulsionLab; + + TLorentzVector fEnergyImpulsionCM_1; + TLorentzVector fEnergyImpulsionCM_2; + TLorentzVector fEnergyImpulsionCM_3; + TLorentzVector fEnergyImpulsionCM_4; + TLorentzVector fTotalEnergyImpulsionCM; + // Impulsion Vector3 - TVector3 fImpulsionLab_1; - TVector3 fImpulsionLab_2; - TVector3 fImpulsionLab_3; - TVector3 fImpulsionLab_4; - - TVector3 fImpulsionCM_1; - TVector3 fImpulsionCM_2; - TVector3 fImpulsionCM_3; - TVector3 fImpulsionCM_4; - + TVector3 fImpulsionLab_1; + TVector3 fImpulsionLab_2; + TVector3 fImpulsionLab_3; + TVector3 fImpulsionLab_4; + + TVector3 fImpulsionCM_1; + TVector3 fImpulsionCM_2; + TVector3 fImpulsionCM_3; + TVector3 fImpulsionCM_4; + // CM Energy composante & CM impulsion norme - Double_t ECM_1; - Double_t ECM_2; - Double_t ECM_3; - Double_t ECM_4; - Double_t pCM_1; - Double_t pCM_2; - Double_t pCM_3; - Double_t pCM_4; - + Double_t ECM_1; + Double_t ECM_2; + Double_t ECM_3; + Double_t ECM_4; + Double_t pCM_1; + Double_t pCM_2; + Double_t pCM_3; + Double_t pCM_4; + // Mandelstam variable - Double_t s; - + Double_t s; + // Center of Mass Kinematic - Double_t BetaCM; - - public: - TLorentzVector GetEnergyImpulsionLab_1() const {return fEnergyImpulsionLab_1;} - TLorentzVector GetEnergyImpulsionLab_2() const {return fEnergyImpulsionLab_2;} - TLorentzVector GetEnergyImpulsionLab_3() const {return fEnergyImpulsionLab_3;} - TLorentzVector GetEnergyImpulsionLab_4() const {return fEnergyImpulsionLab_4;} - - - public: // Kinematics - // Check that the reaction is alowed - bool CheckKinematic(); - + Double_t BetaCM; + + public: + TLorentzVector GetEnergyImpulsionLab_1() const {return fEnergyImpulsionLab_1;} + TLorentzVector GetEnergyImpulsionLab_2() const {return fEnergyImpulsionLab_2;} + TLorentzVector GetEnergyImpulsionLab_3() const {return fEnergyImpulsionLab_3;} + TLorentzVector GetEnergyImpulsionLab_4() const {return fEnergyImpulsionLab_4;} + + + public: // Kinematics + // Check that the reaction is alowed + bool CheckKinematic(); + // Use fCrossSectionHist to shoot a Random ThetaCM and set fThetaCM to this value - double ShootRandomThetaCM(); - + double ShootRandomThetaCM(); + + // Use fExcitationEnergyHist to shoot a Random Excitation energy and set fExcitation4 to this value + void ShootRandomExcitationEnergy(); + // Compute ThetaLab and EnergyLab for product of reaction - void KineRelativistic(double &ThetaLab3, double &KineticEnergyLab3, - double &ThetaLab4, double &KineticEnergyLab4); - + void KineRelativistic(double &ThetaLab3, double &KineticEnergyLab3, + double &ThetaLab4, double &KineticEnergyLab4); + // Return Excitation Energy - double ReconstructRelativistic(double EnergyLab, double ThetaLab); - + double ReconstructRelativistic(double EnergyLab, double ThetaLab); + // Return ThetaCM // EnergyLab: energy measured in the laboratory frame // ExcitationEnergy: excitation energy previously calculated. - double EnergyLabToThetaCM(double EnergyLab, double ThetaLab); - - void SetNuclei3(double EnergyLab, double ThetaLab); - - TGraph* GetKinematicLine3(double AngleStep_CM=1); - TGraph* GetKinematicLine4(double AngleStep_CM=1); - TGraph* GetBrhoLine3(double AngleStep_CM=1); - TGraph* GetThetaLabVersusThetaCM(double AngleStep_CM=1); - TGraph* GetTheta3VsTheta4(double AngleStep_CM=1); - void PrintKinematic(); - double GetP_CM_1() {return pCM_1;} - double GetP_CM_2() {return pCM_2;} - double GetP_CM_3() {return pCM_3;} - double GetP_CM_4() {return pCM_4;} - double GetE_CM_1() {return ECM_1;} - double GetE_CM_2() {return ECM_2;} - double GetE_CM_3() {return ECM_3;} - double GetE_CM_4() {return ECM_4;} - + double EnergyLabToThetaCM(double EnergyLab, double ThetaLab); + + void SetNuclei3(double EnergyLab, double ThetaLab); + + TGraph* GetKinematicLine3(double AngleStep_CM=1); + TGraph* GetKinematicLine4(double AngleStep_CM=1); + TGraph* GetBrhoLine3(double AngleStep_CM=1); + TGraph* GetThetaLabVersusThetaCM(double AngleStep_CM=1); + TGraph* GetTheta3VsTheta4(double AngleStep_CM=1); + void PrintKinematic(); + double GetP_CM_1() {return pCM_1;} + double GetP_CM_2() {return pCM_2;} + double GetP_CM_3() {return pCM_3;} + double GetP_CM_4() {return pCM_4;} + double GetE_CM_1() {return ECM_1;} + double GetE_CM_2() {return ECM_2;} + double GetE_CM_3() {return ECM_3;} + double GetE_CM_4() {return ECM_4;} + // Print private paremeter - void Print() const; - -ClassDef(Reaction,0) + void Print() const; + + ClassDef(Reaction,0) }; } diff --git a/NPLib/SiLi/Makefile b/NPLib/SiLi/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..755cabf2ca130604056dd11477c90a7b44e46871 --- /dev/null +++ b/NPLib/SiLi/Makefile @@ -0,0 +1,40 @@ +include ../Makefile.arch + +#------------------------------------------------------------------------------ +SHARELIB = libSiLi.so + +all: $(SHARELIB) +#------------------------------------------------------------------------------ +############### Detector ############## + +## SiLi ## +libSiLi.so: TSiLiData.o TSiLiDataDict.o TSiLiPhysics.o TSiLiPhysicsDict.o TSiLiSpectra.o + $(LD) $(SOFLAGS) $^ $(OutPutOpt) $@ + +TSiLiDataDict.cxx: TSiLiData.h + rootcint -f $@ -c $^ + +TSiLiPhysicsDict.cxx: TSiLiPhysics.h + rootcint -f $@ -c $^ + +# dependances +TSiLiData.o: TSiLiData.cxx TSiLiData.h +TSiLiPhysics.o: TSiLiPhysics.cxx TSiLiPhysics.h +TSiLiSpectra.o: TSiLiSpectra.cxx TSiLiSpectra.h +####################################### + +############# Clean and More ########## +clean: + @rm -f core *~ *.o *Dict* + +distclean: + make clean; rm -f *.so + +.SUFFIXES: .$(SrcSuf) + +### + +.$(SrcSuf).$(ObjSuf): + $(CXX) $(CXXFLAGS) $(INCLUDE) -c $< + + diff --git a/NPLib/SiLi/TSiLiData.cxx b/NPLib/SiLi/TSiLiData.cxx new file mode 100644 index 0000000000000000000000000000000000000000..e09ddc57c1d3035b72b7a11cec89f4916805e808 --- /dev/null +++ b/NPLib/SiLi/TSiLiData.cxx @@ -0,0 +1,64 @@ +/***************************************************************************** + * Copyright (C) 2009-2013 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: matta@ipno.in2p3.fr * + * * + * Creation Date : * + *---------------------------------------------------------------------------* + * Decription: * + * * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ +#include <iostream> +#include "TSiLiData.h" + + +ClassImp(TSiLiData) + +TSiLiData::TSiLiData() +{ +} + + + +TSiLiData::~TSiLiData() +{ +} + + + +void TSiLiData::Clear() +{ + // Energy + fSiLi_E_Number.clear(); + fSiLi_E_Energy.clear(); + // Time + fSiLi_T_Number.clear(); + fSiLi_T_Time.clear(); +} + + + +void TSiLiData::Dump() const +{ + cout << "XXXXXXXXXXXXXXXXXXXXXXXX TSiLi: New Event XXXXXXXXXXXXXXXXX" << endl; + + // Energy + for (unsigned short i = 0 ; i< fSiLi_E_Energy.size() ; i ++) { + cout << "SiLi Number " << fSiLi_E_Number[i] << " Energy: " << fSiLi_E_Energy[i] << endl; + } + + // Time + for (unsigned short i = 0 ; i< fSiLi_T_Time.size() ; i ++) { + cout << "SiLi Number " << fSiLi_T_Number[i] << " Time: " << fSiLi_T_Time[i] << endl; + } +} diff --git a/NPLib/SiLi/TSiLiData.h b/NPLib/SiLi/TSiLiData.h new file mode 100644 index 0000000000000000000000000000000000000000..f7f2eaff59b10b867dbec55b644158be9a53f8f8 --- /dev/null +++ b/NPLib/SiLi/TSiLiData.h @@ -0,0 +1,67 @@ +#ifndef __SILIDATA__ +#define __SILIDATA__ +/***************************************************************************** + * Copyright (C) 2009-2013 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: contact address: * + * * + * Creation Date : * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ +#include <vector> + +#include "TObject.h" +using namespace std ; + + +class TSiLiData : public TObject { + private: + // Energy + vector<short> fSiLi_E_Number; + vector<double> fSiLi_E_Energy; + // Time + vector<short> fSiLi_T_Number; + vector<double> fSiLi_T_Time; + + public: + TSiLiData(); + virtual ~TSiLiData(); + + void Clear(); + void Clear(const Option_t*) {}; + void Dump() const; + + ///////////////////// GETTERS //////////////////////// + // Energy + unsigned int GetEnergyMult() {return fSiLi_E_Number.size();} + int GetENumber(int i) {return fSiLi_E_Number[i];} + double GetEEnergy(int i) {return fSiLi_E_Energy[i];} + // Time + unsigned int GetTimeMult() {return fSiLi_T_Number.size();} + int GetTNumber(int i) {return fSiLi_T_Number[i];} + double GetTTime(int i) {return fSiLi_T_Time[i];} + + ///////////////////// SETTERS //////////////////////// + // Energy + void SetENumber(int N) {fSiLi_E_Number.push_back(N);} + void SetEEnergy(double E) {fSiLi_E_Energy.push_back(E);} + // time + void SetTNumber(int N) {fSiLi_T_Number.push_back(N);} + void SetTTime(double T) {fSiLi_T_Time.push_back(T);} + + ClassDef(TSiLiData,1) // SiLiData structure +}; + +#endif diff --git a/NPLib/SiLi/TSiLiPhysics.cxx b/NPLib/SiLi/TSiLiPhysics.cxx new file mode 100644 index 0000000000000000000000000000000000000000..13972ea2f981383c3f1e27fce38c0eb4d6252395 --- /dev/null +++ b/NPLib/SiLi/TSiLiPhysics.cxx @@ -0,0 +1,321 @@ +/***************************************************************************** + * Copyright (C) 2009-2013 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: matta@ipno.in2p3.fr * + * * + * Creation Date : november 2009 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class hold SiLi Physics * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +// NPL +#include "TSiLiPhysics.h" +#include "../include/RootOutput.h" +#include "../include/RootInput.h" + +// STL +#include <iostream> +#include <sstream> +#include <fstream> +#include <limits> +#include <stdlib.h> +using namespace std; + +// ROOT +#include "TChain.h" + +// tranform an integer to a string +string itoa(int value) +{ + 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; + } + +/////////////////////////////////////////////////////////////////////////// +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 ; + + // 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, "SiLi") == 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; + } + + 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 << "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 ; + } + } + } + } + +/////////////////////////////////////////////////////////////////////////// +void TSiLiPhysics::AddParameterToCalibrationManager() + { + CalibrationManager* Cal = CalibrationManager::getInstance(); + + for(int i = 0 ; i < NumberOfDetector ; i++) + { + Cal->AddParameter("SiLi", "Detector"+itoa(i+1)+"_E","SiLi_Detector"+itoa(i+1)+"_E") ; + Cal->AddParameter("SiLi", "Detector"+itoa(i+1)+"_T","SiLi_Detector"+itoa(i+1)+"_T") ; + } + } + +/////////////////////////////////////////////////////////////////////////// +void TSiLiPhysics::InitializeRootInputRaw() + { + 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 ); + } +/////////////////////////////////////////////////////////////////////////// +void TSiLiPhysics::InitializeRootOutput() + { + TTree* outputTree = RootOutput::getInstance()->GetTree() ; + outputTree->Branch( "SiLi" , "TSiLiPhysics" , &EventPhysics ) ; + } +/////////////////////////////////////////////////////////////////////////// +void TSiLiPhysics::InitSpectra(){ + m_Spectra = new TSiLiSpectra(NumberOfDetector); +} + +/////////////////////////////////////////////////////////////////////////// +void TSiLiPhysics::FillSpectra(){ + m_Spectra -> FillRawSpectra(EventData); + m_Spectra -> FillPreTreatedSpectra(PreTreatedData); + m_Spectra -> FillPhysicsSpectra(EventPhysics); +} +/////////////////////////////////////////////////////////////////////////// +void TSiLiPhysics::CheckSpectra(){ + m_Spectra->CheckSpectra(); +} +/////////////////////////////////////////////////////////////////////////// +void TSiLiPhysics::ClearSpectra(){ + // To be done +} +/////////////////////////////////////////////////////////////////////////// +map< vector<string> , TH1*> TSiLiPhysics::GetSpectra() { + if(m_Spectra) + return m_Spectra->GetMapHisto(); + else{ + map< vector<string> , TH1*> empty; + return empty; + } +} +/////////////////////////////////////////////////////////////////////////// + +void TSiLiPhysics::PreTreat(){ + + // X + // E + ClearPreTreatedData(); + double E,T; + for(unsigned int i = 0 ; i < EventData->GetEnergyMult() ; ++i) + { + if( EventData->GetEEnergy(i)>m_SiLi_RAW_Threshold ) + { + E=CalibrationManager::getInstance()->ApplyCalibration("SiLi/Detector" + 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"+itoa(EventData->GetTNumber(i))+"_T",EventData->GetTTime(i) ) ; + PreTreatedData->SetTNumber( EventData->GetTNumber(i) ); + PreTreatedData->SetTTime( T ); + + } + +} +/////////////////////////////////////////////////////////////////////////// +void TSiLiPhysics::BuildPhysicalEvent() + { + BuildSimplePhysicalEvent() ; + } + +/////////////////////////////////////////////////////////////////////////// +void TSiLiPhysics::BuildSimplePhysicalEvent() + { + 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++) + { + 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); + } + 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/SiLi/TSiLiPhysics.h b/NPLib/SiLi/TSiLiPhysics.h new file mode 100644 index 0000000000000000000000000000000000000000..d7ab296760f27a10cfe0c4559ed7eb421d5b64b7 --- /dev/null +++ b/NPLib/SiLi/TSiLiPhysics.h @@ -0,0 +1,120 @@ +#ifndef __SiLiPhysics__ +#define __SiLiPhysics__ +/***************************************************************************** + * Copyright (C) 2009-2013 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: matta@ipno.in2p3.fr * + * * + * Creation Date : November 2009 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class hold theSiLi Detector Physics * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +// STL +#include <vector> +using namespace std ; + +class TSiLiSpectra; +// ROOT +#include "TObject.h" + +// NPL +#include "TSiLiData.h" +#include "TSiLiSpectra.h" +#include "../include/VDetector.h" +#include "../include/CalibrationManager.h" + +class TSiLiPhysics : public TObject, public NPA::VDetector +{ + public: // Constructor and Destructor + TSiLiPhysics(); + ~TSiLiPhysics(); + + public: + void Clear(); + void Clear(const Option_t*) {}; + + public: // Calibrated Data + vector<UShort_t> DetectorNumber ; + vector<Double_t> Energy; + vector<Double_t> Time; + + public: // inherrited from VDetector + // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token + void ReadConfiguration(string); + + + // Add Parameter to the CalibrationManger + void AddParameterToCalibrationManager(); + + // 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 InitializeRootInputRaw() ; + + // Activated associated Branches and link it to the private member DetectorPhysics address + // In this method mother Branches (Detector) AND daughter leaf (parameter) have to be activated + void InitializeRootInputPhysics() ; + + // Create associated branches and associated private member DetectorPhysics address + void 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 BuildPhysicalEvent(); + + // Same as above, but only the simplest event and/or simple method are used (low multiplicity, faster algorythm but less efficient ...). + // This method aimed to be used for analysis performed during experiment, when speed is requiered. + // NB: This method can eventually be the same as BuildPhysicalEvent. + void BuildSimplePhysicalEvent(); + + // Same as above but for online analysis + void BuildOnlinePhysicalEvent() {BuildPhysicalEvent();}; + + // Give and external TSiLiData object to TSiLiPhysics. Needed for online analysis for example. + void SetRawDataPointer(TSiLiData* rawDataPointer) {EventData = rawDataPointer;} + + // Those two method all to clear the Event Physics or Data + void ClearEventPhysics() {Clear();} + void ClearEventData() {EventData->Clear();} + + // Method related to the TSpectra classes, aimed at providing a framework for online applications + // Instantiate the Spectra class and the histogramm throught it + void InitSpectra(); + // Fill the spectra hold by the spectra class + void FillSpectra(); + // Used for Online mainly, perform check on the histo and for example change their color if issues are found + void CheckSpectra(); + // Used for Online only, clear all the spectra hold by the Spectra class + void ClearSpectra(); + // Clear The PreTeated object + void ClearPreTreatedData() {PreTreatedData->Clear();} + + // Remove bad channel, calibrate the data and apply threshold + void PreTreat(); + + private: // Data not writted in the tree + int NumberOfDetector ;//! + TSiLiData* EventData ;//! + TSiLiData* PreTreatedData ;//! + TSiLiPhysics* EventPhysics ;//! + TSiLiSpectra* m_Spectra;//! + double m_SiLi_E_Threshold; + double m_SiLi_RAW_Threshold; + public: // Spectra Getter + map< vector<string> , TH1*> GetSpectra(); + + ClassDef(TSiLiPhysics,1) // SiLiPhysics structure +}; + +#endif diff --git a/NPLib/SiLi/TSiLiSpectra.cxx b/NPLib/SiLi/TSiLiSpectra.cxx new file mode 100644 index 0000000000000000000000000000000000000000..d526bc569776b443918f0f5eaecc48b66431c571 --- /dev/null +++ b/NPLib/SiLi/TSiLiSpectra.cxx @@ -0,0 +1,434 @@ +/***************************************************************************** + * Copyright (C) 2009-2013 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: N. de Sereville contact address: deserevi@ipno.in2p3.fr * + * * + * Creation Date : dec 2013 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class holds all the online spectra needed for SiLi * + * * + *---------------------------------------------------------------------------* + * Comment: * + * + first version (not complete yet) * + * * + * * + *****************************************************************************/ + +// STL +#include <iostream> +#include <cstdlib> +#include <stdexcept> + +// NPL +#include "TSiLiSpectra.h" +#include "NPOptionManager.h" +#include "NPGlobalSystemOfUnits.h" +#include "NPPhysicalConstants.h" +#ifdef NP_SYSTEM_OF_UNITS_H +using namespace NPUNITS; +#endif + + +// ROOT +#include "string.h" +#include "TDirectory.h" +#include "TFile.h" + + +//////////////////////////////////////////////////////////////////////////////// +TSiLiSpectra::TSiLiSpectra() +{ + fNumberDetector = 0; +} + + + +//////////////////////////////////////////////////////////////////////////////// +TSiLiSpectra::TSiLiSpectra(unsigned int NumberOfDetectors) +{ + if(NPOptionManager::getInstance()->GetVerboseLevel()>0) + cout << "************************************************" << endl + << "TSiLiSpectra : Initalising control spectra for " + << NumberOfDetectors << " detectorss" << endl + << "************************************************" << endl ; + + fNumberDetector = NumberOfDetectors; + + InitRawSpectra(); + InitPreTreatedSpectra(); + InitPhysicsSpectra(); +} + + + + +//////////////////////////////////////////////////////////////////////////////// +TSiLiSpectra::~TSiLiSpectra(){ +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TSiLiSpectra::InitRawSpectra() +{ + string name; + int NbrBin = 512; + int MinBin = 0; + int MaxBin = 16384; + + for (unsigned int i = 0; i < fNumberDetector; i++) { // loop on number of detectors + // SILI_E_RAW + name = Form("SILI_%d_E_RAW", i+1); + AddHisto1D(name, name, NbrBin, MinBin, MaxBin, "SILI/RAW/ENERGY"); + + // SILI_T_RAW + name = Form("SILI_%d_T_RAW", i+1); + AddHisto1D(name, name, NbrBin, MinBin, MaxBin, "SILI/RAW/TIME"); + } // end loop on number of detectors + + // SILI_E_RAW + name = "SILI_E_RAW"; + AddHisto2D(name, name, fNumberDetector, 1, fNumberDetector+1, NbrBin, MinBin, MaxBin, "SILI/RAW/ENERGY"); + + // SILI_T_RAW + name = "SILI_T_RAW"; + AddHisto2D(name, name, fNumberDetector, 1, fNumberDetector+1, NbrBin, MinBin, MaxBin, "SILI/RAW/TIME"); + + // SILI_HIT_E_RAW + name = "SILI_HITPATTERN_E_RAW"; + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "SILI/RAW/ENERGY"); + + // SILI_HIT_T_RAW + name = "SILI_HITPATTERN_T_RAW"; + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "SILI/RAW/TIME"); + + // E_RAW_MULT + name = "SILI_E_RAW_MULT"; + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "SILI/RAW/MULT"); + + // T_RAW_MULT + name = "SILI_T_RAW_MULT"; + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "SILI/RAW/MULT"); +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TSiLiSpectra::InitPreTreatedSpectra() +{ + string name; + int NbrBin = 512; + int MinBinE = 0; + int MaxBinE = 10; // MeV + int MinBinT = 0; + int MaxBinT = 1; // us + + for (unsigned int i = 0; i < fNumberDetector; i++) { // loop on number of detectors + // SILI_E_CAL + name = Form("SILI_%d_E_CAL", i+1); + AddHisto1D(name, name, NbrBin, MinBinE, MaxBinE, "SILI/CAL/ENERGY"); + + // SILI_T_CAL + name = Form("SILI_%d_T_CAL", i+1); + AddHisto1D(name, name, NbrBin, MinBinT, MaxBinT, "SILI/CAL/TIME"); + + } // end loop on number of detectors + + // SILI_E_CAL + name = "SILI_ESUM_CAL"; + AddHisto1D(name, name, NbrBin, MinBinE, MaxBinE, "SILI/CAL/ENERGY"); + + // SILI_E_CAL + name = "SILI_E_CAL"; + AddHisto2D(name, name, fNumberDetector, 1, fNumberDetector+1, NbrBin, MinBinE, MaxBinE, "SILI/CAL/ENERGY"); + + // SILI_T_CAL + name = "SILI_T_CAL"; + AddHisto2D(name, name, fNumberDetector, 1, fNumberDetector+1, NbrBin, MinBinT, MaxBinT, "SILI/CAL/TIME"); + + // SILI_HIT_E_CAL + name = "SILI_HITPATTERN_E_CAL"; + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "SILI/CAL/ENERGY"); + + // SILI_HIT_T_CAL + name = "SILI_HITPATTERN_T_CAL"; + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "SILI/CAL/TIME"); + + // E_CAL_MULT + name = "SILI_E_CAL_MULT"; + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "SILI/CAL/MULT"); + + // T_CAL_MULT + name = "SILI_T_CAL_MULT"; + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "SILI/CAL/MULT"); +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TSiLiSpectra::InitPhysicsSpectra() +{ + string name; + + int NbrBin = 512; + int MinBinE = 0; + int MaxBinE = 10; + int MinBinT = 0; + int MaxBinT = 1; + + // Energy-Time Correlation + for (unsigned int i = 0 ; i < fNumberDetector ; i++) { // loop on number of detectors + name = Form("SILI_%d_E_TOF", i+1); + AddHisto2D(name, name, NbrBin, MinBinE, MaxBinE, NbrBin, MinBinT, MaxBinT, "SILI/PHY"); + } + + // E-TOF: + name = "SILI_E_TOF"; + AddHisto2D(name, name, NbrBin, MinBinE, MaxBinE, NbrBin, MinBinT, MaxBinT, "SILI/PHY"); +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TSiLiSpectra::FillRawSpectra(TSiLiData* RawData) +{ + string name; + string family; + + // E_RAW + for (unsigned int i = 0; i < RawData->GetEnergyMult(); i++) { + name = Form("SILI_%d_E_RAW", RawData->GetENumber(i)); + family = "SILI/RAW/ENERGY"; + GetHisto(family,name) -> Fill(RawData->GetEEnergy(i)); + } + + // T_RAW + for (unsigned int i = 0; i < RawData->GetTimeMult(); i++) { + name = Form("SILI_%d_T_RAW", RawData->GetTNumber(i)); + family = "SILI/RAW/TIME"; + GetHisto(family,name) -> Fill(RawData->GetTTime(i)); + } + + // SILI_E_RAW + name = "SILI_E_RAW"; + family = "SILI/RAW/ENERGY"; + for (unsigned int i = 0; i < RawData->GetEnergyMult(); i++) { + GetHisto(family,name) -> Fill(RawData->GetENumber(i), RawData->GetEEnergy(i)); + } + + // SILI_T_RAW + name = "SILI_T_RAW"; + family = "SILI/RAW/TIME"; + for (unsigned int i = 0; i < RawData->GetTimeMult(); i++) { + GetHisto(family,name) -> Fill(RawData->GetTNumber(i), RawData->GetTTime(i)); + } + + // SILI_HIT_E_RAW + name = "SILI_HITPATTERN_E_RAW"; + family = "SILI/RAW/ENERGY"; + for (unsigned int i = 0; i < RawData->GetEnergyMult(); i++) { + GetHisto(family,name) -> Fill(RawData->GetENumber(i)); + } + + // SILI_HIT_T_RAW + name = "SILI_HITPATTERN_T_RAW"; + family = "SILI/RAW/TIME"; + for (unsigned int i = 0; i < RawData->GetTimeMult(); i++) { + GetHisto(family,name) -> Fill(RawData->GetTNumber(i)); + } + + // E_RAW_MULT + name = "SILI_E_RAW_MULT"; + family = "SILI/RAW/MULT"; + GetHisto(family,name) -> Fill(RawData->GetEnergyMult()); + + // T_RAW_MULT + name = "SILI_T_RAW_MULT"; + family = "SILI/RAW/MULT"; + GetHisto(family,name) -> Fill(RawData->GetTimeMult()); +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TSiLiSpectra::FillPreTreatedSpectra(TSiLiData* PreTreatedData) +{ + string name; + string family; + + // E_CAL + for (unsigned int i = 0; i < PreTreatedData->GetEnergyMult(); i++) { + name = Form("SILI_%d_E_CAL", PreTreatedData->GetENumber(i)); + family = "SILI/CAL/ENERGY"; + GetHisto(family,name) -> Fill(PreTreatedData->GetEEnergy(i)); + } + + // T_CAL + for (unsigned int i = 0; i < PreTreatedData->GetTimeMult(); i++) { + name = Form("SILI_%d_T_CAL", PreTreatedData->GetTNumber(i)); + family = "SILI/CAL/TIME"; + GetHisto(family,name) -> Fill(PreTreatedData->GetTTime(i)); + } + + // SILI_E_CAL + name = "SILI_E_CAL"; + family = "SILI/CAL/ENERGY"; + for (unsigned int i = 0; i < PreTreatedData->GetEnergyMult(); i++) { + GetHisto(family,name) -> Fill(PreTreatedData->GetENumber(i), PreTreatedData->GetEEnergy(i)); + } + + // SILI_T_CAL + name = "SILI_T_CAL"; + family = "SILI/CAL/TIME"; + for (unsigned int i = 0; i < PreTreatedData->GetTimeMult(); i++) { + GetHisto(family,name) -> Fill(PreTreatedData->GetTNumber(i), PreTreatedData->GetTTime(i)); + } + + // SILI_HIT_E_CAL + name = "SILI_HITPATTERN_E_CAL"; + family = "SILI/CAL/ENERGY"; + for (unsigned int i = 0; i < PreTreatedData->GetEnergyMult(); i++) { + GetHisto(family,name) -> Fill(PreTreatedData->GetENumber(i)); + } + + // SILI_HIT_T_CAL + name = "SILI_HITPATTERN_T_CAL"; + family = "SILI/CAL/TIME"; + for (unsigned int i = 0; i < PreTreatedData->GetTimeMult(); i++) { + GetHisto(family,name) -> Fill(PreTreatedData->GetTNumber(i)); + } + + // E_CAL_MULT + name = "SILI_E_CAL_MULT"; + family = "SILI/CAL/MULT"; + GetHisto(family,name) -> Fill(PreTreatedData->GetEnergyMult()); + + // T_CAL_MULT + name = "SILI_T_CAL_MULT"; + family = "SILI/CAL/MULT"; + GetHisto(family,name) -> Fill(PreTreatedData->GetTimeMult()); +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TSiLiSpectra::FillPhysicsSpectra(TSiLiPhysics* Physics) +{ + string name; + string family = "SILI/PHY"; + + + // Energy-Time Correlation + for (unsigned int i = 0 ; i < Physics->DetectorNumber.size(); i++) { // loop on number of detectors + name = Form("SILI_%d_E_TOF", i+1); + GetHisto(family,name) -> Fill(Physics->Time[i], Physics->Energy[i]); + } + + // E-TOF: + name = "SILI_E_TOF"; + for (unsigned int i = 0 ; i < Physics->DetectorNumber.size(); i++) { // loop on number of detectors + GetHisto(family,name) -> Fill(Physics->Time[i], Physics->Energy[i]); + } +} + + + +//////////////////////////////////////////////////////////////////////////////// +TH1* TSiLiSpectra::AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family){ + // create histo + TH1 *hist = new TH1D(name.c_str(), title.c_str(), nbinsx, xlow, xup); + + vector<string> index ; + index.push_back(family); + index.push_back(name); + + // fill map + fMapHisto[index]=hist; + + return hist; +} + + + +//////////////////////////////////////////////////////////////////////////////// +TH1* TSiLiSpectra::AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, Int_t nbinsy, Double_t ylow, Double_t yup, string family){ + // create histo + TH1 *hist = new TH2D(name.c_str(), title.c_str(), nbinsx, xlow, xup, nbinsy, ylow, yup); + + vector<string> index ; + index.push_back(family); + index.push_back(name); + + // fill map + fMapHisto[index]=hist; + + return hist; +} + + + +//////////////////////////////////////////////////////////////////////////////// +TH1* TSiLiSpectra::GetHisto(string& family, string& name){ + vector<string> index; + index.push_back(family); + index.push_back(name); + TH1* histo ; + + try{ + histo = fMapHisto.at(index); + } + + catch(const std::out_of_range& oor){ + cout << "ERROR : the folowing Histo has been requested by TSiLiSpectra and does not exist: family:" << family << " name: " << name << endl ; + exit(1); + } + + return histo; +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TSiLiSpectra::WriteHisto(string filename) +{ + TFile *f = NULL; + + if (filename != "VOID") { + f = new TFile(filename.c_str(), "RECREATE"); + } + + map< vector<string>, TH1* >::iterator it; + for (it=fMapHisto.begin(); it!=fMapHisto.end(); ++it) { + it->second->Write(); + } + + if (filename != "VOID") { + f->Close(); + delete f; + } +} + + + +/////////////////////////////////////////////////////////////////////////////// +void TSiLiSpectra::CheckSpectra() +{ + map< vector<string>, TH1* >::iterator it; + Color_t ok_color = kTeal+9; + Color_t warning_color = kOrange+8; warning_color *= 1; + Color_t bad_color = kRed; bad_color *= 1; + + for (it=fMapHisto.begin(); it!=fMapHisto.end(); ++it) + { + it->second->SetLineColor(ok_color); + it->second->SetFillStyle(1001); + it->second->SetFillColor(ok_color); + } +} diff --git a/NPLib/SiLi/TSiLiSpectra.h b/NPLib/SiLi/TSiLiSpectra.h new file mode 100644 index 0000000000000000000000000000000000000000..e8622f18f42b2acee72b05bef6b7d4be44eec6e2 --- /dev/null +++ b/NPLib/SiLi/TSiLiSpectra.h @@ -0,0 +1,82 @@ +#ifndef TSILI_H +#define TSILI_H +/***************************************************************************** + * Copyright (C) 2009-2013 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: N. de Sereville contact address: deserevi@ipno.in2p3.fr * + * * + * Creation Date : dec 2013 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class holds all the online spectra needed for SiLi * + * * + *---------------------------------------------------------------------------* + * Comment: * + * + first version (not complete yet) * + * * + * * + *****************************************************************************/ + +// C++ STL headers +#include <map> + +// ROOT headers +#include "TObject.h" +#include <TH1.h> +#include <TH2.h> + +// NPLib headers +#include "TSiLiData.h" +#include "TSiLiPhysics.h" +using namespace std; + +// ForwardDeclaration +class TSiLiPhysics; + +class TSiLiSpectra { + public: + // constructor and destructor + TSiLiSpectra(); + TSiLiSpectra(unsigned int NumberOfTelescope); + ~TSiLiSpectra(); + + private: + // Instantiate and register histo to maps + TH1* AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family); + TH1* AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, + Int_t nbinsy, Double_t ylow, Double_t yup, string family); + + // Initialization methods + void InitRawSpectra(); + void InitPreTreatedSpectra(); + void InitPhysicsSpectra(); + + public: + // Filling methods + void FillRawSpectra(TSiLiData*); + void FillPreTreatedSpectra(TSiLiData*); + void FillPhysicsSpectra(TSiLiPhysics*); + // Check the Spectra + void CheckSpectra(); + + public: + // get map histo which will be used for GSpectra in GUser + map< vector<string>, TH1* > GetMapHisto() const {return fMapHisto;} + TH1* GetHisto(string& family,string& name); + void WriteHisto(string filename="VOID"); + + private: // Information on CHARISSA + unsigned int fNumberDetector; + + private: + // map holding histo pointers and their family names + map< vector<string>, TH1* > fMapHisto; +}; + +#endif diff --git a/NPLib/SiRes/Makefile b/NPLib/SiRes/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..a58805605a4f89d2d7a6d7e6ead66f7d2a1de929 --- /dev/null +++ b/NPLib/SiRes/Makefile @@ -0,0 +1,40 @@ +include ../Makefile.arch + +#------------------------------------------------------------------------------ +SHARELIB = libSiRes.so + +all: $(SHARELIB) +#------------------------------------------------------------------------------ +############### Detector ############## + +## SiRes ## +libSiRes.so: TSiResData.o TSiResDataDict.o TSiResPhysics.o TSiResPhysicsDict.o TSiResSpectra.o + $(LD) $(SOFLAGS) $^ $(OutPutOpt) $@ + +TSiResDataDict.cxx: TSiResData.h + rootcint -f $@ -c $^ + +TSiResPhysicsDict.cxx: TSiResPhysics.h + rootcint -f $@ -c $^ + +# dependances +TSiResData.o: TSiResData.cxx TSiResData.h +TSiResPhysics.o: TSiResPhysics.cxx TSiResPhysics.h +TSiResSpectra.o: TSiResSpectra.cxx TSiResSpectra.h +####################################### + +############# Clean and More ########## +clean: + @rm -f core *~ *.o *Dict* + +distclean: + make clean; rm -f *.so + +.SUFFIXES: .$(SrcSuf) + +### + +.$(SrcSuf).$(ObjSuf): + $(CXX) $(CXXFLAGS) $(INCLUDE) -c $< + + diff --git a/NPLib/SiRes/TSiResData.cxx b/NPLib/SiRes/TSiResData.cxx new file mode 100644 index 0000000000000000000000000000000000000000..84ab71c514c13eba0902ef1f9d5f7ad9d692d77b --- /dev/null +++ b/NPLib/SiRes/TSiResData.cxx @@ -0,0 +1,66 @@ +/***************************************************************************** + * Copyright (C) 2009-2013 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: matta@ipno.in2p3.fr * + * * + * Creation Date : * + *---------------------------------------------------------------------------* + * Decription: * + * * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ +#include <iostream> +#include "TSiResData.h" + + +ClassImp(TSiResData) + +TSiResData::TSiResData() +{ +} + + + +TSiResData::~TSiResData() +{ +} + + + +void TSiResData::Clear() +{ + // Energy + fSiRes_E_Number.clear(); + fSiRes_E_Channel.clear(); + fSiRes_E_Energy.clear(); + // Time + fSiRes_T_Number.clear(); + fSiRes_T_Time.clear(); + fSiRes_E_EnergyBack.clear(); +} + + + +void TSiResData::Dump() const +{ + cout << "XXXXXXXXXXXXXXXXXXXXXXXX TSiRes: New Event XXXXXXXXXXXXXXXXX" << endl; + + // Energy + for (unsigned short i = 0 ; i< fSiRes_E_Energy.size() ; i ++) { + cout << "SiRes Number " << fSiRes_E_Number[i] << " Energy: " << fSiRes_E_Energy[i] << endl; + } + + // Time + for (unsigned short i = 0 ; i< fSiRes_T_Time.size() ; i ++) { + cout << "SiRes Number " << fSiRes_T_Number[i] << " Time: " << fSiRes_T_Time[i] << endl; + } +} diff --git a/NPLib/SiRes/TSiResData.h b/NPLib/SiRes/TSiResData.h new file mode 100644 index 0000000000000000000000000000000000000000..17006e0263815c2202bf9078e0bcccdd4c02358b --- /dev/null +++ b/NPLib/SiRes/TSiResData.h @@ -0,0 +1,78 @@ +#ifndef __SIRESDATA__ +#define __SIRESDATA__ +/***************************************************************************** + * Copyright (C) 2009-2013 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: contact address: * + * * + * Creation Date : * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ +#include <vector> +#include <iostream> + +#include "TObject.h" +using namespace std ; + + +class TSiResData : public TObject { + private: + // Energy + vector<int> fSiRes_E_Number; + vector<int> fSiRes_E_Channel; + vector<double> fSiRes_E_Energy; + // Time + vector<int> fSiRes_T_Number; + vector<double> fSiRes_T_Time; + vector<int> fSiRes_E_EnergyBack_Number; + vector<double> fSiRes_E_EnergyBack; + + public: + TSiResData(); + virtual ~TSiResData(); + + void Clear(); + void Clear(const Option_t*) {}; + void Dump() const; + + ///////////////////// GETTERS //////////////////////// + // Energy + unsigned int GetEnergyMult() {return fSiRes_E_Number.size();} + int GetEChannelNumber(int i) {return fSiRes_E_Channel[i];} + int GetEDetectorNumber(int i) {return fSiRes_E_Number[i];} + double GetEEnergy(int i) {return fSiRes_E_Energy[i];} + // Time + unsigned int GetTimeMult() {return fSiRes_T_Number.size();} + int GetTDetectorNumber(int i) {return fSiRes_T_Number[i];} + double GetTTime(int i) {return fSiRes_T_Time[i];} + double GetEEnergyBack(int i) {return fSiRes_E_EnergyBack[i];} + int GetEEnergyBackDetectorNumber(int i) {return fSiRes_E_EnergyBack_Number[i];} + double GetEEnergyBackMult() {return fSiRes_E_EnergyBack.size();} + + ///////////////////// SETTERS //////////////////////// + // Energy + void SetEDetectorNumber(int N) {fSiRes_E_Number.push_back(N);} + void SetEChannelNumber(int channel) {fSiRes_E_Channel.push_back(channel);} + void SetEEnergy(double E) {fSiRes_E_Energy.push_back(E);} + // time + void SetTDetectorNumber(int N) {fSiRes_T_Number.push_back(N);} + void SetTTime(double T) {fSiRes_T_Time.push_back(T);} + void SetEEnergyBack(double E) {fSiRes_E_EnergyBack.push_back(E);} + void SetEEnergyBackDetectorNumber(int N) {fSiRes_E_EnergyBack_Number.push_back(N);} + + ClassDef(TSiResData,1) // SiResData structure +}; + +#endif diff --git a/NPLib/SiRes/TSiResPhysics.cxx b/NPLib/SiRes/TSiResPhysics.cxx new file mode 100644 index 0000000000000000000000000000000000000000..a07c71aea59326967f1276dd2af7c44fa676b67b --- /dev/null +++ b/NPLib/SiRes/TSiResPhysics.cxx @@ -0,0 +1,348 @@ +/***************************************************************************** + * Copyright (C) 2009-2013 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: matta@ipno.in2p3.fr * + * * + * Creation Date : november 2009 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class hold SiRes Physics * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +// NPL +#include "TSiResPhysics.h" +#include "../include/RootOutput.h" +#include "../include/RootInput.h" + +// STL +#include <iostream> +#include <sstream> +#include <fstream> +#include <limits> +#include <stdlib.h> +using namespace std; + +// ROOT +#include "TChain.h" + +// tranform an integer to a string +string itoa(int value) +{ + char buffer [33]; + sprintf(buffer,"%d",value); + return buffer; +} + +ClassImp(TSiResPhysics) +/////////////////////////////////////////////////////////////////////////// +TSiResPhysics::TSiResPhysics() + { + NumberOfDetector = 0 ; + EventData = new TSiResData ; + PreTreatedData = new TSiResData ; + EventPhysics = this ; + m_SiRes_E_Threshold = 0; + m_SiRes_RAW_Threshold = 0; + m_SiRes_EBack_Threshold = 0; + m_SiRes_RAWBack_Threshold = 0; + } + +/////////////////////////////////////////////////////////////////////////// +TSiResPhysics::~TSiResPhysics() + {} + +/////////////////////////////////////////////////////////////////////////// +void TSiResPhysics::Clear() + { + DetectorNumber.clear() ; + ChannelNumber.clear() ; + Energy.clear() ; + Time.clear() ; + EnergyBack.clear() ; + x.clear() ; + y.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 ; + + // 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, "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; + } + + 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 ; + } + } + } + } + +/////////////////////////////////////////////////////////////////////////// +void TSiResPhysics::AddParameterToCalibrationManager() + { + CalibrationManager* Cal = CalibrationManager::getInstance(); + + for(int i = 0 ; i < NumberOfDetector ; i++) + { + for( int j = 0 ; j < 4 ; j++) + { + Cal->AddParameter("SiRes", "Detector"+itoa(i+1)+"_E","SiRes_Detector"+itoa(i+1)+"_E") ; + } + Cal->AddParameter("SiRes", "Detector"+itoa(i+1)+"_EBack","SiRes_Detector"+itoa(i+1)+"_EBack") ; + Cal->AddParameter("SiRes", "Detector"+itoa(i+1)+"_T","SiRes_Detector"+itoa(i+1)+"_T") ; + + } + } + +/////////////////////////////////////////////////////////////////////////// +void TSiResPhysics::InitializeRootInputRaw() + { + TChain* inputChain = RootInput::getInstance()->GetChain() ; + inputChain->SetBranchStatus ( "SiRes" , true ) ; + inputChain->SetBranchStatus ( "fSiRes_*" , true ) ; + inputChain->SetBranchAddress( "SiRes" , &EventData ) ; + } +/////////////////////////////////////////////////////////////////////////// +void TSiResPhysics::InitializeRootInputPhysics() + { + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus ( "SiRes", true ); + inputChain->SetBranchStatus ( "DetectorNumber", true ); + inputChain->SetBranchStatus ( "ChannelNumber", true ); + inputChain->SetBranchStatus ( "Energy", true ); + inputChain->SetBranchStatus ( "EnergyBack", true ); + inputChain->SetBranchStatus ( "Time", true ); + inputChain->SetBranchAddress( "SiRes", &EventPhysics ); + } +/////////////////////////////////////////////////////////////////////////// +void TSiResPhysics::InitializeRootOutput() + { + TTree* outputTree = RootOutput::getInstance()->GetTree() ; + outputTree->Branch( "SiRes" , "TSiResPhysics" , &EventPhysics ) ; + } +/////////////////////////////////////////////////////////////////////////// +void TSiResPhysics::InitSpectra(){ + m_Spectra = new TSiResSpectra(NumberOfDetector); +} + +/////////////////////////////////////////////////////////////////////////// +void TSiResPhysics::FillSpectra(){ + m_Spectra -> FillRawSpectra(EventData); + m_Spectra -> FillPreTreatedSpectra(PreTreatedData); + m_Spectra -> FillPhysicsSpectra(EventPhysics); +} +/////////////////////////////////////////////////////////////////////////// +void TSiResPhysics::CheckSpectra(){ + m_Spectra->CheckSpectra(); +} +/////////////////////////////////////////////////////////////////////////// +void TSiResPhysics::ClearSpectra(){ + // To be done +} +/////////////////////////////////////////////////////////////////////////// +map< vector<string> , TH1*> TSiResPhysics::GetSpectra() { + if(m_Spectra) + return m_Spectra->GetMapHisto(); + else{ + map< vector<string> , TH1*> empty; + return empty; + } +} +/////////////////////////////////////////////////////////////////////////// + +void TSiResPhysics::PreTreat(){ + + // X + // E + ClearPreTreatedData(); + double E,T; + E=-1000; T=-1000; + int N=-1000; + for(unsigned int i = 0 ; i < EventData->GetEnergyMult() ; i++) + { + if( EventData->GetEEnergy(i)>m_SiRes_RAW_Threshold ) + { + + E=CalibrationManager::getInstance()->ApplyCalibration("SiRes/Detector" + itoa( EventData->GetEDetectorNumber(i) ) +"_Channel"+itoa( EventData->GetEChannelNumber(i) )+"_E",EventData->GetEEnergy(i)); + //if(E>m_SiRes_E_Threshold) + { + N=EventData->GetEDetectorNumber(i); + PreTreatedData->SetEDetectorNumber( N ); + PreTreatedData->SetEChannelNumber( EventData->GetEChannelNumber(i) ); + PreTreatedData->SetEEnergy( E ); + } + } + } + for(unsigned int i = 0 ; i < EventData->GetEEnergyBackMult() ; i++) + { + if( EventData->GetEEnergyBack(i)>m_SiRes_RAWBack_Threshold && EventData->GetEEnergyBackDetectorNumber(i)==N ) + { + E=CalibrationManager::getInstance()->ApplyCalibration("SiRes/Detector" + itoa( EventData->GetEEnergyBackDetectorNumber(i) ) +"_E",EventData->GetEEnergyBack(i)); + if(E>m_SiRes_EBack_Threshold) + { + PreTreatedData->SetEEnergyBackDetectorNumber( EventData->GetEEnergyBackDetectorNumber(i) ); + PreTreatedData->SetEEnergyBack( E ); + if(EventData->GetTimeMult()>0) + { + T=CalibrationManager::getInstance()->ApplyCalibration("SiRes/Detector"+itoa(EventData->GetTDetectorNumber(i))+"_T",EventData->GetTTime(i) ) ; + } + PreTreatedData->SetTTime( T ); + } + } + } +} +/////////////////////////////////////////////////////////////////////////// +void TSiResPhysics::BuildPhysicalEvent() + { + BuildSimplePhysicalEvent() ; + } + + +/////////////////////////////////////////////////////////////////////////// +void TSiResPhysics::BuildSimplePhysicalEvent() + { + PreTreat(); + for(unsigned int i = 0 ; i < PreTreatedData->GetEnergyMult() ; i++) + { + DetectorNumber.push_back( PreTreatedData->GetEDetectorNumber(i) ) ; + ChannelNumber.push_back( PreTreatedData->GetEChannelNumber(i) ) ; + Energy.push_back( PreTreatedData->GetEEnergy(i) ); + } + for(unsigned int i = 0 ; i < EventData->GetEEnergyBackMult() ; i++) + { + EnergyBack.push_back( PreTreatedData->GetEEnergyBack(i) ); +//to be corrected when we read time + //} + //for(unsigned int i = 0 ; i < EventData->GetTimeMult() ; i++) + //{ + Time.push_back( PreTreatedData->GetTTime(i) ); + } + if(PreTreatedData->GetEnergyMult()==4)Treat(); + + } +/////////////////////////////////////////////////////////////////////////// +void TSiResPhysics::Treat() + { + double E1=-1000; double E2=-1000; double E3=-1000; double E4=-1000; + for(unsigned int i = 0 ; i < EventData->GetEnergyMult() ; i++) + { + if(ChannelNumber[i]==0)E1=Energy[i];//DH + if(ChannelNumber[i]==1)E2=Energy[i];//DB + if(ChannelNumber[i]==2)E3=Energy[i];//GB + if(ChannelNumber[i]==3)E4=Energy[i];//GH + } + x.push_back( 1+(E1+E2-E3-E4) / (E1+E2+E3+E4) ) ; + y.push_back( 1+(E1+E4-E2-E3) / (E1+E2+E3+E4) ) ; + } diff --git a/NPLib/SiRes/TSiResPhysics.h b/NPLib/SiRes/TSiResPhysics.h new file mode 100644 index 0000000000000000000000000000000000000000..66833dfff06e67f7395b4ecbd339a644841f2805 --- /dev/null +++ b/NPLib/SiRes/TSiResPhysics.h @@ -0,0 +1,127 @@ +#ifndef __SiResPhysics__ +#define __SiResPhysics__ +/***************************************************************************** + * Copyright (C) 2009-2013 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: matta@ipno.in2p3.fr * + * * + * Creation Date : November 2009 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class hold theSiRes Detector Physics * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +// STL +#include <vector> +using namespace std ; + +class TSiResSpectra; +// ROOT +#include "TObject.h" + +// NPL +#include "TSiResData.h" +#include "TSiResSpectra.h" +#include "../include/VDetector.h" +#include "../include/CalibrationManager.h" + +class TSiResPhysics : public TObject, public NPA::VDetector +{ + public: // Constructor and Destructor + TSiResPhysics(); + ~TSiResPhysics(); + + public: + void Clear(); + void Clear(const Option_t*) {}; + + public: // Calibrated Data + vector<UShort_t> DetectorNumber ; + vector<Double_t> Energy; + vector<UShort_t> ChannelNumber; + vector<Double_t> EnergyBack; + vector<Double_t> Time; + vector<Double_t> x; + vector<Double_t> y; + + public: // inherrited from VDetector + // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token + void ReadConfiguration(string); + + + // Add Parameter to the CalibrationManger + void AddParameterToCalibrationManager(); + + // 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 InitializeRootInputRaw() ; + + // Activated associated Branches and link it to the private member DetectorPhysics address + // In this method mother Branches (Detector) AND daughter leaf (parameter) have to be activated + void InitializeRootInputPhysics() ; + + // Create associated branches and associated private member DetectorPhysics address + void 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 BuildPhysicalEvent(); + + // Same as above, but only the simplest event and/or simple method are used (low multiplicity, faster algorythm but less efficient ...). + // This method aimed to be used for analysis performed during experiment, when speed is requiered. + // NB: This method can eventually be the same as BuildPhysicalEvent. + void BuildSimplePhysicalEvent(); + + // Same as above but for online analysis + void BuildOnlinePhysicalEvent() {BuildPhysicalEvent();}; + + // Give and external TSiResData object to TSiResPhysics. Needed for online analysis for example. + void SetRawDataPointer(TSiResData* rawDataPointer) {EventData = rawDataPointer;} + + // Those two method all to clear the Event Physics or Data + void ClearEventPhysics() {Clear();} + void ClearEventData() {EventData->Clear();} + + // Method related to the TSpectra classes, aimed at providing a framework for online applications + // Instantiate the Spectra class and the histogramm throught it + void InitSpectra(); + // Fill the spectra hold by the spectra class + void FillSpectra(); + // Used for Online mainly, perform check on the histo and for example change their color if issues are found + void CheckSpectra(); + // Used for Online only, clear all the spectra hold by the Spectra class + void ClearSpectra(); + // Clear The PreTeated object + void ClearPreTreatedData() {PreTreatedData->Clear();} + + // Remove bad channel, calibrate the data and apply threshold + void PreTreat(); + void Treat(); + + private: // Data not writted in the tree + int NumberOfDetector ;//! + TSiResData* EventData ;//! + TSiResData* PreTreatedData ;//! + TSiResPhysics* EventPhysics ;//! + TSiResSpectra* m_Spectra;//! + double m_SiRes_E_Threshold; + double m_SiRes_RAW_Threshold; + double m_SiRes_EBack_Threshold; + double m_SiRes_RAWBack_Threshold; + public: // Spectra Getter + map< vector<string> , TH1*> GetSpectra(); + + ClassDef(TSiResPhysics,1) // SiResPhysics structure +}; + +#endif diff --git a/NPLib/SiRes/TSiResSpectra.cxx b/NPLib/SiRes/TSiResSpectra.cxx new file mode 100644 index 0000000000000000000000000000000000000000..f4f246016da1a2515f3eedbbbb8c06b183333ace --- /dev/null +++ b/NPLib/SiRes/TSiResSpectra.cxx @@ -0,0 +1,372 @@ +/***************************************************************************** + * Copyright (C) 2009-2013 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: N. de Sereville contact address: deserevi@ipno.in2p3.fr * + * * + * Creation Date : dec 2013 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class holds all the online spectra needed for SiRes * + * * + *---------------------------------------------------------------------------* + * Comment: * + * + first version (not complete yet) * + * * + * * + *****************************************************************************/ + +// STL +#include <iostream> +#include <cstdlib> +#include <stdexcept> + +// NPL +#include "TSiResSpectra.h" +#include "NPOptionManager.h" +#include "NPGlobalSystemOfUnits.h" +#include "NPPhysicalConstants.h" +#ifdef NP_SYSTEM_OF_UNITS_H +using namespace NPUNITS; +#endif + + +// ROOT +#include "string.h" +#include "TDirectory.h" +#include "TFile.h" + + +//////////////////////////////////////////////////////////////////////////////// +TSiResSpectra::TSiResSpectra() +{ + fNumberDetector = 0; +} + + + +//////////////////////////////////////////////////////////////////////////////// +TSiResSpectra::TSiResSpectra(unsigned int NumberOfDetectors) +{ + if(NPOptionManager::getInstance()->GetVerboseLevel()>0) + cout << "************************************************" << endl + << "TSiResSpectra : Initalising control spectra for " + << NumberOfDetectors << " detectorss" << endl + << "************************************************" << endl ; + + fNumberDetector = NumberOfDetectors; + + InitRawSpectra(); + InitPreTreatedSpectra(); + InitPhysicsSpectra(); +} + + + + +//////////////////////////////////////////////////////////////////////////////// +TSiResSpectra::~TSiResSpectra(){ +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TSiResSpectra::InitRawSpectra() +{ + string name; + int NbrBin = 512; + int MinBin = 0; + int MaxBin = 16384; + for(unsigned int j=0; j<fNumberDetector; j++) + { + for (unsigned int i = 0; i < 4; i++) { // loop on channels + // SiRes_E_RAW + name = Form("SiRes_%d_%d_E_RAW", j+1, i+1); + AddHisto1D(name, name, NbrBin, MinBin, MaxBin, "SiRes/RAW/ENERGY"); + } // end loop on number of detectors + + //SiRes_E_RAW + name = Form("SiRes_%d_E_RAW",j+1); + AddHisto2D(name, name, fNumberDetector, 1, fNumberDetector+1, NbrBin, MinBin, MaxBin, "SiRes/RAW/ENERGY"); + + // SiRes_E_RAW + name = Form("SiRes_%d_EBack_RAW", j+1); + AddHisto1D(name, name, NbrBin, MinBin, MaxBin, "SiRes/RAW/ENERGY"); + + // SiRes_T_RAW + name = Form("SiRes_%d_T_RAW",j+1); + AddHisto1D(name, name, NbrBin, MinBin, MaxBin, "SiRes/RAW/TIME"); + + // E_RAW_MULT + name = Form("SiRes_%d_E_RAW_MULT", j+1); + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "SiRes/RAW/MULT"); + + } +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TSiResSpectra::InitPreTreatedSpectra() +{ + string name; + int NbrBin = 512; + int MinBin = 0; + int MaxBin = 10; // MeV + int MinBinT = 0; + int MaxBinT = 1; // us + for(unsigned int j=0; j<fNumberDetector; j++) + { + for (unsigned int i = 0; i < 4; i++) { // loop on channels + // SiRes_E_RAW + name = Form("SiRes_%d_%d_E_CAL", j+1, i+1); + AddHisto1D(name, name, NbrBin, MinBin, MaxBin, "SiRes/CAL/ENERGY"); + } // end loop on number of detectors + + //SiRes_E_RAW + name = Form("SiRes_%d_E_CAL",j+1); + AddHisto2D(name, name, fNumberDetector, 1, fNumberDetector+1, NbrBin, MinBin, MaxBin, "SiRes/CAL/ENERGY"); + + // SiRes_E_RAW + name = Form("SiRes_%d_EBack_CAL", j+1); + AddHisto1D(name, name, NbrBin, MinBin, MaxBin, "SiRes/CAL/ENERGY"); + + // SiRes_T_RAW + name = Form("SiRes_%d_T_CAL",j+1); + AddHisto1D(name, name, NbrBin, MinBin, MaxBin, "SiRes/CAL/TIME"); + + // E_RAW_MULT + name = Form("SiRes_%d_E_CAL_MULT", j+1); + AddHisto1D(name, name, fNumberDetector, 1, fNumberDetector+1, "SiRes/CAL/MULT"); + + } + +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TSiResSpectra::InitPhysicsSpectra() +{ + string name; + + int NbrBin = 100; + int MinBin = 0; + int MaxBin = 10; + int MinBinT = 0; + int MaxBinT = 1; // us + for (unsigned int j = 0; j < fNumberDetector; j++) + { + name = Form("SiRes_%d_XY", j+1); + AddHisto2D(name, name, NbrBin, MinBin, MaxBin, NbrBin, MinBin, MaxBin, "SiRes/PHY"); + // EBack-TOF: + name = Form("SiRes_%d_EBack_TOF", j+1); + AddHisto2D(name, name, NbrBin, MinBin, MaxBin, NbrBin, MinBinT, MaxBinT, "SiRes/PHY"); + } +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TSiResSpectra::FillRawSpectra(TSiResData* RawData) +{ + string name; + string family; + int NbrBin = 100; + int MinBin = 0; + int MaxBin = 10; + for (unsigned int i = 0; i < RawData->GetEnergyMult(); i++) { + name = Form("SiRes_%d_%d_E_RAW", RawData->GetEDetectorNumber(i), RawData->GetEChannelNumber(i)); + family = "SiRes/RAW/ENERGY"; + GetHisto(family,name) -> Fill(RawData->GetEEnergy(i)); + + name = Form("SiRes_%d_E_RAW", RawData->GetEDetectorNumber(i)); + family = "SiRes/RAW/ENERGY"; + GetHisto(family,name) -> Fill(RawData->GetEChannelNumber(i),RawData->GetEEnergy(i)); + + } +// SiRes_E_RAW + for (unsigned int i = 0; i < RawData->GetEEnergyBackMult(); i++) { + name = Form("SiRes_%d_EBack_RAW",RawData->GetEEnergyBackDetectorNumber(i)); + family = "SiRes/RAW/ENERGY"; + GetHisto(family,name) -> Fill(RawData->GetEEnergyBack(i)); + } + + for (unsigned int i = 0; i < RawData->GetTimeMult(); i++) { + name = Form("SiRes_%d_T_RAW",RawData->GetTDetectorNumber(i)); + family = "SiRes/RAW/TIME"; + GetHisto(family,name) -> Fill(RawData->GetTTime(i)); + } + + for (unsigned int i = 0; i < RawData->GetEnergyMult(); i++) { + name = Form("SiRes_%d_E_RAW_MULT", RawData->GetEDetectorNumber(i)); + family = "SiRes/RAW/MULT"; + GetHisto(family,name) -> Fill(RawData->GetEnergyMult()); + + } + +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TSiResSpectra::FillPreTreatedSpectra(TSiResData* PreTreatedData) +{ + string name; + string family; + + int NbrBin = 100; + int MinBin = 0; + int MaxBin = 10; + for (unsigned int i = 0; i < PreTreatedData->GetEnergyMult(); i++) { + name = Form("SiRes_%d_%d_E_CAL", PreTreatedData->GetEDetectorNumber(i), PreTreatedData->GetEChannelNumber(i)); + family = "SiRes/CAL/ENERGY"; + GetHisto(family,name) -> Fill(PreTreatedData->GetEEnergy(i)); + + name = Form("SiRes_%d_E_CAL", PreTreatedData->GetEDetectorNumber(i)); + family = "SiRes/CAL/ENERGY"; + GetHisto(family,name) -> Fill(PreTreatedData->GetEChannelNumber(i),PreTreatedData->GetEEnergy(i)); + + } +// SiRes_E_RAW + for (unsigned int i = 0; i < PreTreatedData->GetEEnergyBackMult(); i++) { + name = Form("SiRes_%d_EBack_CAL",PreTreatedData->GetEEnergyBackDetectorNumber(i)); + family = "SiRes/CAL/ENERGY"; + GetHisto(family,name) -> Fill(PreTreatedData->GetEEnergyBack(i)); + } + + for (unsigned int i = 0; i < PreTreatedData->GetTimeMult(); i++) { + name = Form("SiRes_%d_T_CAL",PreTreatedData->GetTDetectorNumber(i)); + family = "SiRes/CAL/TIME"; + GetHisto(family,name) -> Fill(PreTreatedData->GetTTime(i)); + } + + for (unsigned int i = 0; i < PreTreatedData->GetEnergyMult(); i++) { + name = Form("SiRes_%d_E_CAL_MULT", PreTreatedData->GetEDetectorNumber(i)); + family = "SiRes/CAL/MULT"; + GetHisto(family,name) -> Fill(PreTreatedData->GetEnergyMult()); + + } // E_CAL + +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TSiResSpectra::FillPhysicsSpectra(TSiResPhysics* Physics) +{ + string name; + string family = "SiRes/PHY"; + + for (unsigned int i = 0; i < Physics->x.size(); i++) { + name = Form("SiRes_%d_XY",Physics->DetectorNumber[i]); + GetHisto(family,name) -> Fill(Physics->x[i],Physics->y[i]); + } + + for (unsigned int i = 0; i < Physics->EnergyBack.size(); i++) { + name = Form("SiRes_%d_EBack_TOF",Physics->DetectorNumber[i]); + GetHisto(family,name) -> Fill(Physics->EnergyBack[i],Physics->Time[i]); + } + + +} + + + +//////////////////////////////////////////////////////////////////////////////// +TH1* TSiResSpectra::AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family){ + // create histo + TH1 *hist = new TH1D(name.c_str(), title.c_str(), nbinsx, xlow, xup); + + vector<string> index ; + index.push_back(family); + index.push_back(name); + + // fill map + fMapHisto[index]=hist; + + return hist; +} + + + +//////////////////////////////////////////////////////////////////////////////// +TH1* TSiResSpectra::AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, Int_t nbinsy, Double_t ylow, Double_t yup, string family){ + // create histo + TH1 *hist = new TH2D(name.c_str(), title.c_str(), nbinsx, xlow, xup, nbinsy, ylow, yup); + + vector<string> index ; + index.push_back(family); + index.push_back(name); + + // fill map + fMapHisto[index]=hist; + + return hist; +} + + + +//////////////////////////////////////////////////////////////////////////////// +TH1* TSiResSpectra::GetHisto(string& family, string& name){ + vector<string> index; + index.push_back(family); + index.push_back(name); + TH1* histo ; + + try{ + histo = fMapHisto.at(index); + } + + catch(const std::out_of_range& oor){ + cout << "ERROR : the folowing Histo has been requested by TSiResSpectra and does not exist: family:" << family << " name: " << name << endl ; + exit(1); + } + + return histo; +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TSiResSpectra::WriteHisto(string filename) +{ + TFile *f = NULL; + + if (filename != "VOID") { + f = new TFile(filename.c_str(), "RECREATE"); + } + + map< vector<string>, TH1* >::iterator it; + for (it=fMapHisto.begin(); it!=fMapHisto.end(); ++it) { + it->second->Write(); + } + + if (filename != "VOID") { + f->Close(); + delete f; + } +} + + + +/////////////////////////////////////////////////////////////////////////////// +void TSiResSpectra::CheckSpectra() +{ + map< vector<string>, TH1* >::iterator it; + Color_t ok_color = kTeal+9; + Color_t warning_color = kOrange+8; warning_color *= 1; + Color_t bad_color = kRed; bad_color *= 1; + + for (it=fMapHisto.begin(); it!=fMapHisto.end(); ++it) + { + it->second->SetLineColor(ok_color); + it->second->SetFillStyle(1001); + it->second->SetFillColor(ok_color); + } +} diff --git a/NPLib/SiRes/TSiResSpectra.h b/NPLib/SiRes/TSiResSpectra.h new file mode 100644 index 0000000000000000000000000000000000000000..270d3038a080c404a1fa73fa140470be1dc50072 --- /dev/null +++ b/NPLib/SiRes/TSiResSpectra.h @@ -0,0 +1,82 @@ +#ifndef TSIRES_H +#define TSIRES_H +/***************************************************************************** + * Copyright (C) 2009-2013 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: N. de Sereville contact address: deserevi@ipno.in2p3.fr * + * * + * Creation Date : dec 2013 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class holds all the online spectra needed for SiRes * + * * + *---------------------------------------------------------------------------* + * Comment: * + * + first version (not complete yet) * + * * + * * + *****************************************************************************/ + +// C++ STL headers +#include <map> + +// ROOT headers +#include "TObject.h" +#include <TH1.h> +#include <TH2.h> + +// NPLib headers +#include "TSiResData.h" +#include "TSiResPhysics.h" +using namespace std; + +// ForwardDeclaration +class TSiResPhysics; + +class TSiResSpectra { + public: + // constructor and destructor + TSiResSpectra(); + TSiResSpectra(unsigned int NumberOfTelescope); + ~TSiResSpectra(); + + private: + // Instantiate and register histo to maps + TH1* AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family); + TH1* AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, + Int_t nbinsy, Double_t ylow, Double_t yup, string family); + + // Initialization methods + void InitRawSpectra(); + void InitPreTreatedSpectra(); + void InitPhysicsSpectra(); + + public: + // Filling methods + void FillRawSpectra(TSiResData*); + void FillPreTreatedSpectra(TSiResData*); + void FillPhysicsSpectra(TSiResPhysics*); + // Check the Spectra + void CheckSpectra(); + + public: + // get map histo which will be used for GSpectra in GUser + map< vector<string>, TH1* > GetMapHisto() const {return fMapHisto;} + TH1* GetHisto(string& family,string& name); + void WriteHisto(string filename="VOID"); + + private: // Information on CHARISSA + unsigned int fNumberDetector; + + private: + // map holding histo pointers and their family names + map< vector<string>, TH1* > fMapHisto; +}; + +#endif diff --git a/NPLib/Tiara/TTiaraBarrelData.h b/NPLib/Tiara/TTiaraBarrelData.h index f2e5e0b1bfe353d184dc34634bcf5da9716deaed..3b4f0663152f1cd27463fd34f298588c8c566a96 100644 --- a/NPLib/Tiara/TTiaraBarrelData.h +++ b/NPLib/Tiara/TTiaraBarrelData.h @@ -101,7 +101,7 @@ class TTiaraBarrelData : public TNamed { } // T - inline unsigned int GetFrontBackTMult(){ + inline unsigned int GetBackTMult(){ return fTiaraBarrel_BackT_DetectorNbr.size(); } diff --git a/NPLib/Tiara/TTiaraBarrelPhysics.cxx b/NPLib/Tiara/TTiaraBarrelPhysics.cxx index 5a75575f09ccfdebd33601cb2adb26fa28c2a453..ab0b8125c956f2f66b27711a3744a48d01363625 100644 --- a/NPLib/Tiara/TTiaraBarrelPhysics.cxx +++ b/NPLib/Tiara/TTiaraBarrelPhysics.cxx @@ -19,7 +19,7 @@ * * *****************************************************************************/ #include "TTiaraBarrelPhysics.h" - +using namespace TiaraBarrel_LOCAL; // STL #include <sstream> #include <iostream> @@ -50,13 +50,14 @@ ClassImp(TTiaraBarrelPhysics) m_PreTreatedData = new TTiaraBarrelData ; m_EventPhysics = this ; m_NumberOfDetector = 0 ; - + m_Take_E_Strip= true; m_Take_T_Back=true; - m_Strip_E_Threshold=0.4 ; - m_Back_E_Threshold =0; - m_OuterStrip_E_RAW_Threshold =0; + m_Strip_E_Threshold = 0.40 ; + m_Back_E_Threshold = 0.40 ; + m_Maximum_FrontBack_Difference = 0.4; m_OuterBack_E_Threshold =0; + m_Spectra = NULL ; } /////////////////////////////////////////////////////////////////////////// @@ -68,84 +69,80 @@ void TTiaraBarrelPhysics::BuildSimplePhysicalEvent(){ void TTiaraBarrelPhysics::BuildPhysicalEvent(){ PreTreat(); - - -} - -/////////////////////////////////////////////////////////////////////////// -void TTiaraBarrelPhysics::PreTreat(){ - ClearPreTreatedData(); - // Gain Calibration - // The cal function first call the MatchStick one - unsigned int sizeU = m_EventData-> GetFrontUpstreamEMult(); - unsigned int sizeD = m_EventData-> GetFrontDownstreamEMult(); - + unsigned int sizeU = m_PreTreatedData->GetFrontUpstreamEMult(); + unsigned int sizeD = m_PreTreatedData->GetFrontDownstreamEMult(); + unsigned int sizeB = m_PreTreatedData->GetBackEMult(); + for(unsigned int k = 0 ; k < sizeB ; k++){ for(unsigned int i = 0 ; i < sizeU ; i++){ - double EU = Cal_Strip_Upstream_E(i) ; - m_PreTreatedData->SetFrontUpstreamE(m_EventData-> GetFrontUpstreamEDetectorNbr(i), - m_EventData-> GetFrontUpstreamEStripNbr(i), - EU); - + if(m_PreTreatedData->GetFrontUpstreamEDetectorNbr(i) == m_PreTreatedData->GetBackEDetectorNbr(k)) for(unsigned int j = 0 ; j < sizeD ; j++){ - double ED = Cal_Strip_Downstream_E(j) ; - m_PreTreatedData->SetFrontDownstreamE(m_EventData-> GetFrontDownstreamEDetectorNbr(i), - m_EventData-> GetFrontDownstreamEStripNbr(i), - ED); - if(EU>0 && ED>0 && EU+ED > m_Strip_E_Threshold){ - if( m_EventData->GetFrontUpstreamEDetectorNbr(i) - == m_EventData->GetFrontDownstreamEDetectorNbr(j) - && m_EventData->GetFrontUpstreamEStripNbr(i) - == m_EventData->GetFrontDownstreamEStripNbr(j)){ + // same detector, same strip + if( m_PreTreatedData->GetFrontUpstreamEDetectorNbr(i) + == m_PreTreatedData->GetFrontDownstreamEDetectorNbr(j) + && m_PreTreatedData->GetFrontUpstreamEStripNbr(i) + == m_PreTreatedData->GetFrontDownstreamEStripNbr(j)){ - - double POS = - CalibrationManager::getInstance()->ApplyResistivePositionCalibration("TIARABARREL/B"+itoa(m_EventData->GetFrontUpstreamEDetectorNbr(i))+"_STRIP"+itoa(m_EventData->GetFrontUpstreamEStripNbr(i))+"_POS",(ED-EU)/(EU+ED)); - Strip_Pos.push_back(POS); - Strip_N.push_back(m_EventData->GetFrontUpstreamEStripNbr(i)); - DetectorNumber.push_back(m_EventData->GetFrontUpstreamEDetectorNbr(i)); - double E =(EU+ED) / CalibrationManager::getInstance() - ->ApplyCalibration("TIARABARREL/BALLISTIC_B" - + itoa(m_EventData->GetFrontDownstreamEDetectorNbr(i)) - + "_STRIP" - + itoa(m_EventData->GetFrontDownstreamEStripNbr(i)), - POS); - - - DetectorNumber.push_back(m_EventData->GetFrontDownstreamEDetectorNbr(i)); - Strip_N.push_back(m_EventData->GetFrontDownstreamEStripNbr(i)); - Strip_Pos.push_back(POS); - Strip_E.push_back(E); + double EU = m_PreTreatedData->GetFrontUpstreamEEnergy(i) ; + double ED = m_PreTreatedData->GetFrontDownstreamEEnergy(j); + + // Front back Energy match + // if(abs(m_PreTreatedData->GetBackEEnergy(k)-(EU+ED)) < m_Maximum_FrontBack_Difference){ + // I have no calibration of the back so replace by nothing ;) + if(true){ + double POS = + CalibrationManager::getInstance() + ->ApplyResistivePositionCalibration("TIARABARREL/B" + +itoa(m_PreTreatedData->GetFrontUpstreamEDetectorNbr(i)) + +"_STRIP"+itoa(m_PreTreatedData->GetFrontUpstreamEStripNbr(i)) + +"_POS",(ED-EU)/(EU+ED)); + + Strip_Pos.push_back(POS); + Strip_N.push_back(m_PreTreatedData->GetFrontUpstreamEStripNbr(i)); + DetectorNumber.push_back(m_PreTreatedData->GetFrontUpstreamEDetectorNbr(i)); + double E = (EU+ED) / CalibrationManager::getInstance() + ->ApplyCalibration("TIARABARREL/BALLISTIC_B" + + itoa(m_PreTreatedData->GetFrontDownstreamEDetectorNbr(i)) + + "_STRIP" + + itoa(m_PreTreatedData->GetFrontDownstreamEStripNbr(i)), + POS); + Strip_E.push_back(E); + } } } } } - - // Ballistic Deficit correction } /////////////////////////////////////////////////////////////////////////// -vector < TVector2 > TTiaraBarrelPhysics :: Match_Upstream_Downstream(){ - vector < TVector2 > ArrayOfGoodCouple ; - /* - // Prevent code from treating very high multiplicity Event - // Those event are not physical anyway and that improve speed. - if( m_PreTreatedData->GetRingEMult() > m_MaximumStripMultiplicityAllowed || m_PreTreatedData->GetSectorEMult() > m_MaximumStripMultiplicityAllowed ) - return ArrayOfGoodCouple; - - for(unsigned int i = 0 ; i < m_PreTreatedData->GetRingEMult(); i++) { - for(unsigned int j = 0 ; j < m_PreTreatedData->GetSectorEMult(); j++){ - // if same detector check energy - if ( m_PreTreatedData->GetRingEDetectorNbr(i) == m_PreTreatedData->GetSectorEDetectorNbr(j) ){ - // 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) ) ; - } +void TTiaraBarrelPhysics::PreTreat(){ + ClearPreTreatedData(); + // Gain Calibration + // The cal function first call the MatchStick one + unsigned int sizeU = m_EventData->GetFrontUpstreamEMult(); + unsigned int sizeD = m_EventData->GetFrontDownstreamEMult(); + unsigned int sizeB = m_EventData->GetBackEMult(); + + for(unsigned int i = 0 ; i < sizeU ; i++){ + double EU = Cal_Strip_Upstream_E(i) ; + if(EU > m_Strip_E_Threshold) + m_PreTreatedData->SetFrontUpstreamE(m_EventData->GetFrontUpstreamEDetectorNbr(i), + m_EventData->GetFrontUpstreamEStripNbr(i), + EU); } + + for(unsigned int j = 0 ; j < sizeD ; j++){ + double ED = Cal_Strip_Downstream_E(j) ; + if(ED>m_Strip_E_Threshold) + m_PreTreatedData->SetFrontDownstreamE(m_EventData->GetFrontDownstreamEDetectorNbr(j), + m_EventData->GetFrontDownstreamEStripNbr(j), + ED); } - */ - // Prevent to treat event with ambiguous matchin beetween X and Y - // if( ArrayOfGoodCouple.size() > m_PreTreatedData->GetRingEMult() ) ArrayOfGoodCouple.clear() ; - return ArrayOfGoodCouple; + + for(unsigned int k = 0 ; k < sizeB ; k++){ + double EB = Cal_Back_E(k) ; + if(EB > m_Back_E_Threshold) + m_PreTreatedData->SetBackE(m_EventData->GetBackEDetectorNbr(k),EB); + } } //////////////////////////////////////////////////////////////////////////// @@ -438,8 +435,14 @@ void TTiaraBarrelPhysics::ClearSpectra(){ // To be done } /////////////////////////////////////////////////////////////////////////// -map< vector<TString>,TH1* > TTiaraBarrelPhysics::GetSpectra() { - return m_Spectra->GetMapHisto(); +map< vector<string>,TH1* > TTiaraBarrelPhysics::GetSpectra() { + if(m_Spectra) + return m_Spectra->GetMapHisto(); + else{ + map< vector<string>,TH1* > empty; + return empty; + } + } /////////////////////////////////////////////////////////////////////////// void TTiaraBarrelPhysics::AddParameterToCalibrationManager(){ @@ -455,7 +458,11 @@ void TTiaraBarrelPhysics::AddParameterToCalibrationManager(){ Cal->AddParameter("TIARABARREL","BALLISTIC_B"+itoa(i+1)+"_STRIP"+itoa(j+1),"TIARABARREL_BALLISTIC_B"+itoa(i+1)+"_STRIP"+itoa(j+1)) ; Cal->AddParameter("TIARABARREL","B"+itoa(i+1)+"_STRIP"+itoa(j+1)+"_POS","TIARABARREL_B"+itoa(i+1)+"_STRIP"+itoa(j+1)+"_POS") ; + } + + Cal->AddParameter("TIARABARREL","TIARABARREL/B" + itoa( i+1 ) + "_BACK_E","TIARABARREL_B" + itoa( i+1 ) + "_BACK_E"); + } return; @@ -472,8 +479,9 @@ void TTiaraBarrelPhysics::InitializeRootInputRaw(){ /////////////////////////////////////////////////////////////////////////////// void TTiaraBarrelPhysics::InitializeRootInputPhysics(){ TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus("TiaraBarrel" , true ); inputChain->SetBranchStatus("EventMultiplicity",true); - inputChain->SetBranchStatus("DetectorNumber ",true); + inputChain->SetBranchStatus("DetectorNumber",true); inputChain->SetBranchStatus("Strip_E",true); inputChain->SetBranchStatus("Strip_T",true); inputChain->SetBranchStatus("Strip_N",true); @@ -489,6 +497,8 @@ void TTiaraBarrelPhysics::InitializeRootInputPhysics(){ inputChain->SetBranchStatus("Outer_Strip_N",true); inputChain->SetBranchStatus("Outer_Back_E",true); inputChain->SetBranchStatus("Outer_Back_T",true); + inputChain->SetBranchAddress("TiaraBarrel" , &m_EventPhysics ); + } /////////////////////////////////////////////////////////////////////////////// @@ -552,17 +562,16 @@ TVector3 TTiaraBarrelPhysics::GetDetectorNormal( const int i) const{ } /////////////////////////////////////////////////////////////////////////////// TVector3 TTiaraBarrelPhysics::GetPositionOfInteraction(const int i) const{ - // All in mm + // 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. ; - double X = Strip_N[i]*StripPitch-0.5*INNERBARREL_ActiveWafer_Width; double Y = INNERBARREL_PCB_Width*(0.5+sin(45*deg)) ; double Z = (Strip_Pos[i]-0.5)*INNERBARREL_ActiveWafer_Length ; - TVector3 POS(X,Y,Z); + TVector3 POS(X,Y,-Z); POS.RotateZ((DetectorNumber[i]-1)*45*deg); return( POS ) ; @@ -591,10 +600,12 @@ void TTiaraBarrelPhysics::InitializeStandardParameter(){ /////////////////////////////////////////////////////////////////////////////// // transform an integer to a string -string TTiaraBarrelPhysics::itoa(unsigned int value){ - char buffer [33]; - sprintf(buffer,"%d",value); - return buffer; +namespace TiaraBarrel_LOCAL{ + string itoa(unsigned int value){ + char buffer [33]; + sprintf(buffer,"%d",value); + return buffer; + } } /////////////////////////////////////////////////////////////////////////////// double TTiaraBarrelPhysics::Cal_Strip_Upstream_E(const int i){ @@ -616,3 +627,8 @@ double TTiaraBarrelPhysics::Match_Strip_Downstream_E(const int i){ return CalibrationManager::getInstance()->ApplyCalibration("TIARABARREL/MATCHSTICK_B" + itoa( m_EventData->GetFrontDownstreamEDetectorNbr(i) ) + "_DOWNSTREAM" + itoa( m_EventData->GetFrontDownstreamEStripNbr(i) ) + "_E", m_EventData->GetFrontDownstreamEEnergy(i) ); } +/////////////////////////////////////////////////////////////////////////////// +double TTiaraBarrelPhysics::Cal_Back_E(const int i){ + return CalibrationManager::getInstance()->ApplyCalibration("TIARABARREL/B" + itoa( m_EventData->GetBackEDetectorNbr(i) ) + "_BACK_E", m_EventData->GetBackEEnergy(i)); +} + diff --git a/NPLib/Tiara/TTiaraBarrelPhysics.h b/NPLib/Tiara/TTiaraBarrelPhysics.h index c5ea79d6c61984f39129b35ec57c68bdde8f2b3a..1928903203d889f3507af97c0549c3d2753c24f7 100644 --- a/NPLib/Tiara/TTiaraBarrelPhysics.h +++ b/NPLib/Tiara/TTiaraBarrelPhysics.h @@ -50,9 +50,6 @@ class TTiaraBarrelPhysics : public TObject, public NPA::VDetector{ void Clear(); void Clear(const Option_t*) {}; - public: - vector < TVector2 > Match_Upstream_Downstream() ; - public: // Provide Physical Multiplicity Int_t EventMultiplicity; @@ -167,12 +164,10 @@ class TTiaraBarrelPhysics : public TObject, public NPA::VDetector{ bool m_Take_T_Back;//! // Threshold - double m_Strip_E_RAW_Threshold ;//! double m_Strip_E_Threshold ;//! double m_Back_E_Threshold ;//! - double m_OuterStrip_E_RAW_Threshold ;//! double m_OuterBack_E_Threshold ;//! - + double m_Maximum_FrontBack_Difference ;//! private: // Root Input and Output tree classes TTiaraBarrelData* m_EventData;//! TTiaraBarrelData* m_PreTreatedData;//! @@ -195,19 +190,20 @@ class TTiaraBarrelPhysics : public TObject, public NPA::VDetector{ TTiaraBarrelSpectra* m_Spectra;//! public: - map< vector<TString>,TH1* > GetSpectra(); + map< vector<string>,TH1* > GetSpectra(); private: // Usefull method - // tranform an integer to a string - string itoa(unsigned int value); - // Calibrate data + // Calibrate data double Cal_Strip_Upstream_E(const int i); double Cal_Strip_Downstream_E(const int i); + double Cal_Back_E(const int i); double Match_Strip_Upstream_E(const int i); double Match_Strip_Downstream_E(const int i); ClassDef(TTiaraBarrelPhysics,1) // SharcPhysics structure }; - +namespace TiaraBarrel_LOCAL{ + string itoa(unsigned int value); +} #endif diff --git a/NPLib/Tiara/TTiaraBarrelSpectra.cxx b/NPLib/Tiara/TTiaraBarrelSpectra.cxx index 11ad691e0ddb2a33fdd308487ae1ec6e33b91fcd..330857283914835fdf156ac18fd39988645c751e 100644 --- a/NPLib/Tiara/TTiaraBarrelSpectra.cxx +++ b/NPLib/Tiara/TTiaraBarrelSpectra.cxx @@ -21,6 +21,11 @@ * * *****************************************************************************/ +// STL +#include <iostream> +#include <cstdlib> +#include <stdexcept> + // NPL #include "TTiaraBarrelSpectra.h" #include "NPOptionManager.h" @@ -32,7 +37,7 @@ using namespace NPUNITS; // ROOT -#include "TString.h" +#include "string.h" #include "TDirectory.h" #include "TFile.h" @@ -67,8 +72,8 @@ TTiaraBarrelSpectra::~TTiaraBarrelSpectra(){ //////////////////////////////////////////////////////////////////////////////// void TTiaraBarrelSpectra::InitRawSpectra(){ - TString name; - TString BaseFamily = "TIARA/BARREL/RAW/"; + string name; + string BaseFamily = "TIARA/BARREL/RAW/"; //// HIT //// // Inner Barrel @@ -108,23 +113,25 @@ void TTiaraBarrelSpectra::InitRawSpectra(){ // Inner Barrel for(unsigned int i = 0 ; i < fNumberOfDetector ; i++){ for(unsigned int j = 0 ; j < fInnerBarrelStrip;j++){ - name = Form("IB%d_VS%d_RAW",i+1,j+1); - AddHisto2D(name, name,1024,0,16384,1024,0,16384,BaseFamily+"VS"); + name = "IB"+TiaraBarrel_LOCAL::itoa(i+1)+"_VS"+TiaraBarrel_LOCAL::itoa(j+1)+"_RAW"; + AddHisto2D(name, name,1024,0,0,1024,0,0,BaseFamily+"VS"); } } } //////////////////////////////////////////////////////////////////////////////// void TTiaraBarrelSpectra::InitPreTreatedSpectra(){ - TString BaseFamily = "TIARA/BARREL/CAL/"; - TString name ; + string BaseFamily = "TIARA/BARREL/CAL/"; + string name ; //// VS //// // Inner Barrel for(unsigned int i = 0 ; i < fNumberOfDetector ; i++){ for(unsigned int j = 0 ; j < fInnerBarrelStrip;j++){ - name = Form("IB%d_VS%d_CAL",i+1,j+1); - AddHisto2D(name,name,2048,-1,30,2048,-1,30,BaseFamily+"VS"); + name = "IB"+TiaraBarrel_LOCAL::itoa(i+1)+"_VS"+TiaraBarrel_LOCAL::itoa(j+1)+"_CAL"; + AddHisto2D(name,name,2048,0,0,2048,0,0,BaseFamily+"VS"); } + name = "IB"+TiaraBarrel_LOCAL::itoa(i+1)+"_VS_BACK_CAL"; + AddHisto2D(name,name,2048,0,0,2048,0,0,BaseFamily+"VS"); } } @@ -136,7 +143,7 @@ string name ; // Inner Barrel for(unsigned int i = 0 ; i < fNumberOfDetector ; i++){ for(unsigned int j = 0 ; j < fInnerBarrelStrip;j++){ - name = Form("IB%d_EPOS%d_CAL",i+1,j+1); + name = "IB"+TiaraBarrel_LOCAL::itoa(i+1)+"_EPOS"+TiaraBarrel_LOCAL::itoa(j+1)+"_CAL"; AddHisto2D(name, name,1000,-0.5,1.5,1000,0,30,BaseFamily); } } @@ -144,7 +151,7 @@ string name ; // Inner Barrel for(unsigned int i = 0 ; i < fNumberOfDetector ; i++){ for(unsigned int j = 0 ; j < fInnerBarrelStrip;j++){ - name = Form("IB%d_ETHETA%d_CAL",i+1,j+1); + name = "IB"+TiaraBarrel_LOCAL::itoa(i+1)+"_ETHETA"+TiaraBarrel_LOCAL::itoa(j+1)+"_CAL"; AddHisto2D(name, name,360,0,180,1000,0,30,BaseFamily); } } @@ -157,9 +164,9 @@ string name ; //////////////////////////////////////////////////////////////////////////////// void TTiaraBarrelSpectra::FillRawSpectra(TTiaraBarrelData* RawData){ - TString name; - TString family; - TString BaseFamily = "TIARA/BARREL/RAW/"; + string name; + string family; + string BaseFamily = "TIARA/BARREL/RAW/"; // INNER_BARREL_US_HIT_RAW for (unsigned int i = 0; i < RawData->GetFrontUpstreamEMult(); i++) { @@ -232,7 +239,7 @@ void TTiaraBarrelSpectra::FillRawSpectra(TTiaraBarrelData* RawData){ int DoStreamDetNbr = RawData->GetFrontDownstreamEDetectorNbr(j); int DoStreamStrNbr = RawData->GetFrontDownstreamEStripNbr(j); if(UpStreamDetNbr==DoStreamDetNbr && UpStreamStrNbr==DoStreamStrNbr){ - name = Form("IB%d_VS%d_RAW",UpStreamDetNbr,UpStreamStrNbr); + name = "IB"+TiaraBarrel_LOCAL::itoa(UpStreamDetNbr)+"_VS"+TiaraBarrel_LOCAL::itoa(UpStreamStrNbr)+"_RAW"; GetHisto(family,name) ->Fill(RawData->GetFrontUpstreamEEnergy(i),RawData->GetFrontDownstreamEEnergy(j)); } @@ -242,21 +249,36 @@ void TTiaraBarrelSpectra::FillRawSpectra(TTiaraBarrelData* RawData){ //////////////////////////////////////////////////////////////////////////////// void TTiaraBarrelSpectra::FillPreTreatedSpectra(TTiaraBarrelData* PreTreatedData){ -TString BaseFamily = "TIARA/BARREL/CAL/"; +string BaseFamily = "TIARA/BARREL/CAL/"; // INNER_BARREL_VS_CAL - TString family = BaseFamily+"VS"; - TString name ; - for (unsigned int i = 0; i < PreTreatedData->GetFrontUpstreamEMult(); i++) { + string family = BaseFamily+"VS"; + string name ; + + unsigned int sizeU = PreTreatedData->GetFrontUpstreamEMult(); + unsigned int sizeD = PreTreatedData->GetFrontDownstreamEMult(); + unsigned int sizeB = PreTreatedData->GetBackEMult(); + + for (unsigned int i = 0; i < sizeU ; i++) { int UpStreamDetNbr = PreTreatedData->GetFrontUpstreamEDetectorNbr(i); int UpStreamStrNbr = PreTreatedData->GetFrontUpstreamEStripNbr(i); - for (unsigned int j = 0; j < PreTreatedData->GetFrontDownstreamEMult(); j++) { + for (unsigned int j = 0; j < sizeD ; j++) { int DoStreamDetNbr = PreTreatedData->GetFrontDownstreamEDetectorNbr(j); int DoStreamStrNbr = PreTreatedData->GetFrontDownstreamEStripNbr(j); if(UpStreamDetNbr==DoStreamDetNbr && UpStreamStrNbr==DoStreamStrNbr){ - name = Form("IB%d_VS%d_CAL",UpStreamDetNbr,UpStreamStrNbr); + name = "IB"+TiaraBarrel_LOCAL::itoa(UpStreamDetNbr)+"_VS"+TiaraBarrel_LOCAL::itoa(UpStreamStrNbr)+"_CAL"; GetHisto(family,name) - ->Fill(PreTreatedData->GetFrontUpstreamEEnergy(i),PreTreatedData->GetFrontDownstreamEEnergy(j)); + ->Fill(PreTreatedData->GetFrontUpstreamEEnergy(i),PreTreatedData->GetFrontDownstreamEEnergy(j)); + + for (unsigned int k = 0; k < sizeB; k++) { + if(UpStreamDetNbr == PreTreatedData->GetBackEDetectorNbr(k)){ + name = "IB"+TiaraBarrel_LOCAL::itoa(UpStreamDetNbr)+"_VS_BACK_CAL"; + GetHisto(family,name) + ->Fill(PreTreatedData->GetFrontUpstreamEEnergy(i) + +PreTreatedData->GetFrontDownstreamEEnergy(j), + PreTreatedData->GetBackEEnergy(k)); + } + } } } } @@ -264,34 +286,34 @@ TString BaseFamily = "TIARA/BARREL/CAL/"; //////////////////////////////////////////////////////////////////////////////// void TTiaraBarrelSpectra::FillPhysicsSpectra(TTiaraBarrelPhysics* Physics){ -string family = "TIARA/BARREL/PHY"; -string name ; + string family = "TIARA/BARREL/PHY"; + string name ; //// E POS //// // Inner Barrel - unsigned int size = Physics->Strip_E.size(); + //unsigned int size = Physics->Strip_E.size(); for(unsigned int i = 0 ; i < Physics->Strip_E.size() ; i++){ - name = Form("IB%d_EPOS%d_CAL",Physics->DetectorNumber[i],Physics->Strip_N[i]); - GetHisto(family,name) - ->Fill(Physics->Strip_Pos[i],Physics->Strip_E[i]); - - name = Form("IB%d_ETHETA%d_CAL",Physics->DetectorNumber[i],Physics->Strip_N[i]); - double Theta = Physics->GetPositionOfInteraction(i).Angle(TVector3(0,0,1)); + name ="IB"+TiaraBarrel_LOCAL::itoa(Physics->DetectorNumber[i])+"_EPOS"+TiaraBarrel_LOCAL::itoa(Physics->Strip_N[i])+"_CAL"; + GetHisto(family,name) + ->Fill(Physics->Strip_Pos[i],Physics->Strip_E[i]); - GetHisto(family,name) - ->Fill(Theta*rad/deg,Physics->Strip_E[i]); - - name = "IB_ETHETA_CAL"; - GetHisto(family,name) - ->Fill(Theta*rad/deg,Physics->Strip_E[i]); - } + name = "IB"+TiaraBarrel_LOCAL::itoa(Physics->DetectorNumber[i])+"_ETHETA"+TiaraBarrel_LOCAL::itoa(Physics->Strip_N[i])+"_CAL"; + double Theta = Physics->GetPositionOfInteraction(i).Angle(TVector3(0,0,1)); + + GetHisto(family,name) + ->Fill(Theta*rad/deg,Physics->Strip_E[i]); + + name = "IB_ETHETA_CAL"; + GetHisto(family,name) + ->Fill(Theta*rad/deg,Physics->Strip_E[i]); + } } //////////////////////////////////////////////////////////////////////////////// -TH1* TTiaraBarrelSpectra::AddHisto1D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, TString family){ +TH1* TTiaraBarrelSpectra::AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family){ // create histo - TH1 *hist = new TH1D(name, title, nbinsx, xlow, xup); + TH1 *hist = new TH1D(name.c_str(), title.c_str(), nbinsx, xlow, xup); - vector<TString> index ; + vector<string> index ; index.push_back(family); index.push_back(name); @@ -302,11 +324,11 @@ TH1* TTiaraBarrelSpectra::AddHisto1D(TString name, TString title, Int_t nbinsx, } //////////////////////////////////////////////////////////////////////////////// -TH1* TTiaraBarrelSpectra::AddHisto2D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, Int_t nbinsy, Double_t ylow, Double_t yup, TString family){ +TH1* TTiaraBarrelSpectra::AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, Int_t nbinsy, Double_t ylow, Double_t yup, string family){ // create histo - TH1 *hist = new TH2D(name, title, nbinsx, xlow, xup, nbinsy, ylow, yup); + TH1 *hist = new TH2D(name.c_str(), title.c_str(), nbinsx, xlow, xup, nbinsy, ylow, yup); - vector<TString> index ; + vector<string> index ; index.push_back(family); index.push_back(name); @@ -317,23 +339,34 @@ TH1* TTiaraBarrelSpectra::AddHisto2D(TString name, TString title, Int_t nbinsx, } //////////////////////////////////////////////////////////////////////////////// -TH1* TTiaraBarrelSpectra::GetHisto(TString family, TString name){ - vector<TString> index ; +TH1* TTiaraBarrelSpectra::GetHisto(string& family, string& name){ + vector<string> index; + index.reserve(2); index.push_back(family); index.push_back(name); - // fill map - return fMapHisto.at(index); + TH1* histo ; + + try{ + histo = fMapHisto.at(index); + } + + catch(const std::out_of_range& oor){ + cout << "ERROR : the folowing Histo has been requested by TTiaraBarrelSpectra and does not exist: family:" << family << " name: " << name << endl ; + exit(1); + } + + return histo; } //////////////////////////////////////////////////////////////////////////////// -void TTiaraBarrelSpectra::WriteHisto(TString filename){ +void TTiaraBarrelSpectra::WriteHisto(string filename){ TFile* f=NULL; if(filename!="VOID"){ - f = new TFile(filename,"RECREATE"); + f = new TFile(filename.c_str(),"RECREATE"); } - map< vector<TString>, TH1* >::iterator it; + map< vector<string>, TH1* >::iterator it; for (it=fMapHisto.begin(); it!=fMapHisto.end(); ++it){ it->second->Write(); @@ -347,7 +380,7 @@ void TTiaraBarrelSpectra::WriteHisto(TString filename){ } /////////////////////////////////////////////////////////////////////////////// void TTiaraBarrelSpectra::CheckSpectra(){ - map< vector<TString>, TH1* >::iterator it; + map< vector<string>, TH1* >::iterator it; Color_t ok_color = kTeal+9; Color_t warning_color = kOrange+8; warning_color *= 1; Color_t bad_color = kRed; bad_color *= 1; diff --git a/NPLib/Tiara/TTiaraBarrelSpectra.h b/NPLib/Tiara/TTiaraBarrelSpectra.h index 8b15478f38f2317f230ded3aa22f0958c71eaa3e..d41fc889e138a19a9d5347aff2c699a33ff85bc8 100644 --- a/NPLib/Tiara/TTiaraBarrelSpectra.h +++ b/NPLib/Tiara/TTiaraBarrelSpectra.h @@ -30,7 +30,6 @@ #include "TObject.h" #include <TH1.h> #include <TH2.h> -#include <TString.h> // NPLib headers #include "TTiaraBarrelData.h" @@ -49,9 +48,9 @@ class TTiaraBarrelSpectra { private: // Instantiate and register histo to maps - TH1* AddHisto1D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, TString family); - TH1* AddHisto2D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, - Int_t nbinsy, Double_t ylow, Double_t yup,TString family); + TH1* AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family); + TH1* AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, + Int_t nbinsy, Double_t ylow, Double_t yup,string family); // Initialization methods void InitRawSpectra(); @@ -68,9 +67,9 @@ class TTiaraBarrelSpectra { public: // get map histo which will be used for GSpectra in GUser - map< vector<TString>, TH1* > GetMapHisto() const {return fMapHisto;} - TH1* GetHisto(TString family,TString name); - void WriteHisto(TString filename="VOID"); + map< vector<string>, TH1* > GetMapHisto() const {return fMapHisto;} + TH1* GetHisto(string& family,string& name); + void WriteHisto(string filename="VOID"); private: // Information on TIARA/BARREL unsigned int fNumberOfDetector; @@ -79,7 +78,7 @@ class TTiaraBarrelSpectra { private: // map holding histo pointers and their family names - map< vector<TString>, TH1* > fMapHisto; + map< vector<string>, TH1* > fMapHisto; }; #endif diff --git a/NPLib/Tiara/TTiaraHyballPhysics.cxx b/NPLib/Tiara/TTiaraHyballPhysics.cxx index 51b67a680c43ffe9539a4947728eb9802c0f0337..3faf224b084803b064e59a21c67a97db49fbd986 100644 --- a/NPLib/Tiara/TTiaraHyballPhysics.cxx +++ b/NPLib/Tiara/TTiaraHyballPhysics.cxx @@ -52,19 +52,20 @@ ClassImp(TTiaraHyballPhysics) m_PreTreatedData = new TTiaraHyballData ; m_EventPhysics = this ; m_NumberOfDetector = 0 ; - m_MaximumStripMultiplicityAllowed = 10; - m_StripEnergyMatchingSigma = 0.060 ; - m_StripEnergyMatchingNumberOfSigma = 3; + m_MaximumStripMultiplicityAllowed = 100; + m_StripEnergyMatchingSigma = 1.00 ; + m_StripEnergyMatchingNumberOfSigma = 30; // Threshold m_StripRing_E_RAW_Threshold = 0 ; - m_StripRing_E_Threshold = 0.4 ; + m_StripRing_E_Threshold = 0.0 ; m_StripSector_E_RAW_Threshold = 0 ; - m_StripSector_E_Threshold = 0.4 ; + m_StripSector_E_Threshold = 0.0 ; m_Take_E_Ring=false; m_Take_T_Sector=true; + m_Spectra = NULL; } /////////////////////////////////////////////////////////////////////////// @@ -80,8 +81,8 @@ void TTiaraHyballPhysics::BuildPhysicalEvent(){ vector< TVector2 > couple = Match_Ring_Sector() ; EventMultiplicity = couple.size(); - unsigned int size = couple.size(); - for(unsigned int i = 0 ; i < size ; ++i){ + unsigned int MatchSize = couple.size(); + for(unsigned int i = 0 ; i < MatchSize ; ++i){ int N = m_PreTreatedData->GetRingEDetectorNbr(couple[i].X()) ; int Ring = m_PreTreatedData->GetRingEStripNbr(couple[i].X()) ; @@ -133,7 +134,6 @@ void TTiaraHyballPhysics::BuildPhysicalEvent(){ /////////////////////////////////////////////////////////////////////////// void TTiaraHyballPhysics::PreTreat(){ ClearPreTreatedData(); - // Ring E unsigned int sizeRingE = m_EventData->GetRingEMult(); for(unsigned int i = 0 ; i < sizeRingE ; ++i){ @@ -181,6 +181,7 @@ void TTiaraHyballPhysics::PreTreat(){ m_PreTreatedData->SetSectorTTime( Sector_T ); } } + return; } @@ -188,10 +189,10 @@ void TTiaraHyballPhysics::PreTreat(){ /////////////////////////////////////////////////////////////////////////// int TTiaraHyballPhysics :: CheckEvent(){ // Check the size of the different elements - if(m_PreTreatedData->GetSectorEMult() == m_PreTreatedData->GetRingEMult() ) +// if(m_PreTreatedData->GetSectorEMult() == m_PreTreatedData->GetRingEMult() ) return 1 ; // Regular Event - else + // else return -1 ; // Rejected Event } @@ -204,20 +205,25 @@ 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(); - for(unsigned int i = 0 ; i < m_PreTreatedData->GetRingEMult(); i++) { - for(unsigned int j = 0 ; j < m_PreTreatedData->GetSectorEMult(); j++){ + for(unsigned int i = 0 ; i < sizeR ; i++) { + 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 - if( abs( (m_PreTreatedData->GetRingEEnergy(i)-m_PreTreatedData->GetSectorEEnergy(j))/2. ) < m_StripEnergyMatchingNumberOfSigma*m_StripEnergyMatchingSigma ) - ArrayOfGoodCouple . push_back ( TVector2(i,j) ) ; + // 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) ) ; + } } } } - // Prevent to treat event with ambiguous matchin beetween X and Y if( ArrayOfGoodCouple.size() > m_PreTreatedData->GetRingEMult() ) ArrayOfGoodCouple.clear() ; + return ArrayOfGoodCouple; } @@ -517,8 +523,14 @@ void TTiaraHyballPhysics::ClearSpectra(){ // To be done } /////////////////////////////////////////////////////////////////////////// -map< vector<TString>,TH1* > TTiaraHyballPhysics::GetSpectra() { -return m_Spectra->GetMapHisto(); +map< vector<string>,TH1* > TTiaraHyballPhysics::GetSpectra() { + if(m_Spectra) + return m_Spectra->GetMapHisto(); + else{ + map< vector<string>,TH1* > empty; + return empty ; + } + } /////////////////////////////////////////////////////////////////////////// void TTiaraHyballPhysics::AddParameterToCalibrationManager(){ @@ -676,7 +688,7 @@ namespace TiaraHyball_LOCAL{ // Ring double fStrip_Ring_E(const TTiaraHyballData* m_EventData , const int i){ return CalibrationManager::getInstance()->ApplyCalibration( "TIARAHYBALL/D" + itoa( m_EventData->GetRingEDetectorNbr(i) ) + "_STRIP_RING" + itoa( m_EventData->GetRingEStripNbr(i) ) + "_E", - m_EventData->GetRingEEnergy(i) ); + fStrip_Ring_Matchstick(m_EventData,i) ); } double fStrip_Ring_Matchstick(const TTiaraHyballData* m_EventData , const int i){ return CalibrationManager::getInstance()->ApplyCalibration( "TIARAHYBALL/D" + itoa( m_EventData->GetRingEDetectorNbr(i) ) + "_STRIP_RING" + itoa( m_EventData->GetRingEStripNbr(i) ) + "_MATCHSTICK", @@ -690,12 +702,12 @@ namespace TiaraHyball_LOCAL{ // Sector double fStrip_Sector_E(const TTiaraHyballData* m_EventData , const int i){ - return CalibrationManager::getInstance()->ApplyCalibration( "TIARAHYBALL/D" + itoa( m_EventData->GetSectorTDetectorNbr(i) ) + "_STRIP_SECTOR" + itoa( m_EventData->GetSectorTStripNbr(i) ) +"_E", - m_EventData->GetSectorEEnergy(i) ); + return CalibrationManager::getInstance()->ApplyCalibration( "TIARAHYBALL/D" + itoa( m_EventData->GetSectorEDetectorNbr(i) ) + "_STRIP_SECTOR" + itoa( m_EventData->GetSectorEStripNbr(i) ) +"_E", + fStrip_Sector_Matchstick(m_EventData,i) ); } double fStrip_Sector_Matchstick(const TTiaraHyballData* m_EventData , const int i){ - return CalibrationManager::getInstance()->ApplyCalibration( "TIARAHYBALL/D" + itoa( m_EventData->GetSectorTDetectorNbr(i) ) + "_STRIP_SECTOR" + itoa( m_EventData->GetSectorTStripNbr(i) ) +"_MATCHSTICK", + return CalibrationManager::getInstance()->ApplyCalibration( "TIARAHYBALL/D" + itoa( m_EventData->GetSectorEDetectorNbr(i) ) + "_STRIP_SECTOR" + itoa( m_EventData->GetSectorEStripNbr(i) ) +"_MATCHSTICK", m_EventData->GetSectorEEnergy(i) ); } diff --git a/NPLib/Tiara/TTiaraHyballPhysics.h b/NPLib/Tiara/TTiaraHyballPhysics.h index 0a6022fb5c5f6105445212f0b54bada56ff813e3..384b53a9529eb09bd3d7893be7960d5119631f6c 100644 --- a/NPLib/Tiara/TTiaraHyballPhysics.h +++ b/NPLib/Tiara/TTiaraHyballPhysics.h @@ -175,7 +175,7 @@ class TTiaraHyballPhysics : public TObject, public NPA::VDetector{ double m_StripRing_E_Threshold ;//! double m_StripSector_E_RAW_Threshold ;//! double m_StripSector_E_Threshold ;//! - + double m_Maximum_FrontBack_Difference;//! private: // Root Input and Output tree classes TTiaraHyballData* m_EventData;//! TTiaraHyballData* m_PreTreatedData;//! @@ -195,7 +195,7 @@ class TTiaraHyballPhysics : public TObject, public NPA::VDetector{ TTiaraHyballSpectra* m_Spectra;//! public: - map< vector<TString>,TH1* > GetSpectra(); + map< vector<string>,TH1* > GetSpectra(); ClassDef(TTiaraHyballPhysics,1) // SharcPhysics structure }; @@ -211,7 +211,7 @@ namespace TiaraHyball_LOCAL{ // Sector double fStrip_Sector_E(const TTiaraHyballData* Data, const int i); - double fStrip_Sector_MatchStick(const TTiaraHyballData* Data, const int i); + double fStrip_Sector_Matchstick(const TTiaraHyballData* Data, const int i); double fStrip_Sector_T(const TTiaraHyballData* Data, const int i); } diff --git a/NPLib/Tiara/TTiaraHyballSpectra.cxx b/NPLib/Tiara/TTiaraHyballSpectra.cxx index 69b0c3b0b1420842966d0edefe1c2cfcee6a7bb3..6ec5a7853c59b576da9d37b79b3b2d30ba3cd1a6 100644 --- a/NPLib/Tiara/TTiaraHyballSpectra.cxx +++ b/NPLib/Tiara/TTiaraHyballSpectra.cxx @@ -21,6 +21,11 @@ * * *****************************************************************************/ +// STL +#include <iostream> +#include <cstdlib> +#include <stdexcept> + // NPL #include "TTiaraHyballSpectra.h" #include "NPOptionManager.h" @@ -31,7 +36,6 @@ using namespace NPUNITS; #endif // ROOT -#include "TString.h" #include "TDirectory.h" #include "TFile.h" @@ -60,7 +64,7 @@ TTiaraHyballSpectra::~TTiaraHyballSpectra(){ //////////////////////////////////////////////////////////////////////////////// void TTiaraHyballSpectra::InitRawSpectra(){ - TString name; + string name; // HIT_RING_RAW name = "HYB_HIT_RING_RAW"; @@ -81,11 +85,11 @@ void TTiaraHyballSpectra::InitRawSpectra(){ // MULT for (unsigned int i = 0; i < fWedgesNumber; ++i) { // loop on number of wedges // RING_RAW_MULT - name = Form("HYB_W%d_RING_E_RAW_MULT", i+1); + name = "HYB_W"+TiaraHyball_LOCAL::itoa(i+1)+"_RING_E_RAW_MULT"; AddHisto1D(name, name, fRingsNumber, 1, fRingsNumber+1, "TIARA/HYBALL/RAW/MULT"); // SECTOR_RAW_MULT - name = Form("HYB_W%d_SECT_E_RAW_MULT", i+1); + name = "HYB_W"+TiaraHyball_LOCAL::itoa(i+1)+"_SECT_E_RAW_MULT"; AddHisto1D(name, name, fSectorsNumber, 1, fSectorsNumber+1, "TIARA/HYBALL/RAW/MULT"); } // end loop on number of wedges } @@ -94,7 +98,7 @@ void TTiaraHyballSpectra::InitRawSpectra(){ //////////////////////////////////////////////////////////////////////////////// void TTiaraHyballSpectra::InitPreTreatedSpectra(){ - TString name; + string name; // HIT_RING_CAL name = "HYB_HIT_RING_CAL"; @@ -115,11 +119,11 @@ void TTiaraHyballSpectra::InitPreTreatedSpectra(){ // MULT for (unsigned int i = 0; i < fWedgesNumber; ++i) { // loop on number of wedges // RING_CAL_MULT - name = Form("HYB_W%d_RING_E_CAL_MULT", i+1); + name = "HYB_W"+TiaraHyball_LOCAL::itoa(i+1)+"_RING_E_CAL_MULT"; AddHisto1D(name, name, fRingsNumber, 1, fRingsNumber+1, "TIARA/HYBALL/CAL/MULT"); // SECTOR_CAL_MULT - name = Form("HYB_W%d_SECT_E_CAL_MULT", i+1); + name = "HYB_W"+TiaraHyball_LOCAL::itoa(i+1)+"_SECT_E_CAL_MULT"; AddHisto1D(name, name, fSectorsNumber, 1, fSectorsNumber+1, "TIARA/HYBALL/CAL/MULT"); } // end loop on number of wedges } @@ -128,7 +132,7 @@ void TTiaraHyballSpectra::InitPreTreatedSpectra(){ //////////////////////////////////////////////////////////////////////////////// void TTiaraHyballSpectra::InitPhysicsSpectra(){ - TString name; + string name; // X-Y Impact Matrix name = "HYB_IMPACT_MATRIX"; AddHisto2D(name, name, 500, -150, 150, 500, -150, 150, "TIARA/HYBALL/PHY"); @@ -146,8 +150,8 @@ void TTiaraHyballSpectra::InitPhysicsSpectra(){ //////////////////////////////////////////////////////////////////////////////// void TTiaraHyballSpectra::FillRawSpectra(TTiaraHyballData* RawData){ - TString name; - TString family; + string name; + string family; // HIT_RING_RAW family = "TIARA/HYBALL/RAW/HIT"; @@ -179,7 +183,7 @@ void TTiaraHyballSpectra::FillRawSpectra(TTiaraHyballData* RawData){ for (unsigned int i = 0; i < RawData->GetSectorEMult(); i++) { unsigned short channel = (RawData->GetSectorEDetectorNbr(i)-1) * fSectorsNumber + RawData->GetSectorEStripNbr(i); GetHisto(family, name) -> Fill(channel, RawData->GetSectorEEnergy(i)); - } +} // RING_RAW_MULT int myMULT[fWedgesNumber]; @@ -187,7 +191,7 @@ void TTiaraHyballSpectra::FillRawSpectra(TTiaraHyballData* RawData){ for (unsigned int i = 0; i < RawData->GetRingEMult(); i++) myMULT[(RawData->GetRingEDetectorNbr(i)-1)] += 1; for (unsigned int i = 0; i < fWedgesNumber; i++) { - name = Form("HYB_W%d_RING_E_RAW_MULT", i+1); + name = "HYB_W"+TiaraHyball_LOCAL::itoa(i+1)+"_RING_E_RAW_MULT"; family = "TIARA/HYBALL/RAW/MULT"; GetHisto(family,name) -> Fill(myMULT[i]); } @@ -197,7 +201,7 @@ void TTiaraHyballSpectra::FillRawSpectra(TTiaraHyballData* RawData){ for (unsigned int i = 0; i < RawData->GetSectorEMult(); i++) myMULT[(RawData->GetSectorEDetectorNbr(i)-1)] += 1; for (unsigned int i = 0; i < fWedgesNumber; i++) { - name = Form("HYB_W%d_SECT_E_RAW_MULT", i+1); + name = "HYB_W"+TiaraHyball_LOCAL::itoa(i+1)+"_SECT_E_RAW_MULT"; family = "TIARA/HYBALL/RAW/MULT"; GetHisto(family,name) -> Fill(myMULT[i]); } @@ -207,8 +211,8 @@ void TTiaraHyballSpectra::FillRawSpectra(TTiaraHyballData* RawData){ //////////////////////////////////////////////////////////////////////////////// void TTiaraHyballSpectra::FillPreTreatedSpectra(TTiaraHyballData* PreTreatedData){ - TString name; - TString family; + string name; + string family; // HIT_RING_CAL family = "TIARA/HYBALL/CAL/HIT"; @@ -248,7 +252,7 @@ void TTiaraHyballSpectra::FillPreTreatedSpectra(TTiaraHyballData* PreTreatedData for (unsigned int i = 0; i < PreTreatedData->GetRingEMult(); i++) myMULT[(PreTreatedData->GetRingEDetectorNbr(i)-1)] += 1; for (unsigned int i = 0; i < fWedgesNumber; i++) { - name = Form("HYB_W%d_RING_E_CAL_MULT", i+1); + name = "HYB_W"+TiaraHyball_LOCAL::itoa(i+1)+"_RING_E_CAL_MULT"; family = "TIARA/HYBALL/CAL/MULT"; GetHisto(family,name) -> Fill(myMULT[i]); } @@ -258,7 +262,7 @@ void TTiaraHyballSpectra::FillPreTreatedSpectra(TTiaraHyballData* PreTreatedData for (unsigned int i = 0; i < PreTreatedData->GetSectorEMult(); i++) myMULT[(PreTreatedData->GetSectorEDetectorNbr(i)-1)] += 1; for (unsigned int i = 0; i < fWedgesNumber; i++) { - name = Form("HYB_W%d_SECT_E_CAL_MULT", i+1); + name = "HYB_W"+TiaraHyball_LOCAL::itoa(i+1)+"_SECT_E_CAL_MULT"; family = "TIARA/HYBALL/CAL/MULT"; GetHisto(family,name) -> Fill(myMULT[i]); } @@ -268,35 +272,36 @@ void TTiaraHyballSpectra::FillPreTreatedSpectra(TTiaraHyballData* PreTreatedData //////////////////////////////////////////////////////////////////////////////// void TTiaraHyballSpectra::FillPhysicsSpectra(TTiaraHyballPhysics* Physics){ - /* TString name; - TString family= "TIARA/HYBALL/PHY"; + string name; + string family= "TIARA/HYBALL/PHY"; // X-Y Impact Matrix - for(unsigned int i = 0 ; i < Physics->Si_E.size(); i++){ - name = "MM_IMPACT_MATRIX"; + for(unsigned int i = 0 ; i < Physics->Strip_E.size(); i++){ + name = "HYB_IMPACT_MATRIX"; double x = Physics->GetPositionOfInteraction(i).x(); double y = Physics->GetPositionOfInteraction(i).y(); GetHisto(family,name)-> Fill(x,y); - name = "MM_THETA_E"; + name = "HYB_THETA_E"; double Theta = Physics->GetPositionOfInteraction(i).Angle(TVector3(0,0,1)); Theta = Theta/deg; - GetHisto(family,name)-> Fill(Theta,Physics->Si_E[i]); + GetHisto(family,name)-> Fill(Theta,Physics->Strip_E[i]); // STRX_E_CAL - name = Form("MM%d_XY_COR", Physics->TelescopeNumber[i]); - GetHisto(family,name)-> Fill(Physics->Si_EX[i],Physics->Si_EY[i]); - }*/ + name = "HYB_XY_COR"; + GetHisto(family,name)-> Fill(Physics->StripRing_E[i],Physics->StripSector_E[i]); + } + } //////////////////////////////////////////////////////////////////////////////// -TH1* TTiaraHyballSpectra::AddHisto1D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, TString family){ +TH1* TTiaraHyballSpectra::AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family){ // create histo - TH1 *hist = new TH1D(name, title, nbinsx, xlow, xup); + TH1 *hist = new TH1D(name.c_str(), title.c_str(), nbinsx, xlow, xup); - vector<TString> index; + vector<string> index; index.push_back(family); index.push_back(name); @@ -309,11 +314,11 @@ TH1* TTiaraHyballSpectra::AddHisto1D(TString name, TString title, Int_t nbinsx, //////////////////////////////////////////////////////////////////////////////// -TH1* TTiaraHyballSpectra::AddHisto2D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, Int_t nbinsy, Double_t ylow, Double_t yup, TString family){ +TH1* TTiaraHyballSpectra::AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, Int_t nbinsy, Double_t ylow, Double_t yup, string family){ // create histo - TH1 *hist = new TH2D(name, title, nbinsx, xlow, xup, nbinsy, ylow, yup); + TH1 *hist = new TH2D(name.c_str(), title.c_str(), nbinsx, xlow, xup, nbinsy, ylow, yup); - vector<TString> index; + vector<string> index; index.push_back(family); index.push_back(name); @@ -326,24 +331,33 @@ TH1* TTiaraHyballSpectra::AddHisto2D(TString name, TString title, Int_t nbinsx, //////////////////////////////////////////////////////////////////////////////// -TH1* TTiaraHyballSpectra::GetHisto(TString family, TString name){ - vector<TString> index; +TH1* TTiaraHyballSpectra::GetHisto(string& family, string& name){ + vector<string> index; + index.reserve(2); index.push_back(family); index.push_back(name); - return fMapHisto.at(index); -} - + TH1* histo ; + + try{ + histo = fMapHisto.at(index); + } + catch(const std::out_of_range& oor){ + cout << "ERROR : the folowing Histo has been requested by THyballSpectra and does not exist: family:" << family << " name: " << name << endl ; + exit(1); + } + return histo; +} //////////////////////////////////////////////////////////////////////////////// -void TTiaraHyballSpectra::WriteHisto(TString filename){ +void TTiaraHyballSpectra::WriteHisto(string filename){ TFile* f = NULL; if (filename != "VOID") { - f = new TFile(filename,"RECREATE"); + f = new TFile(filename.c_str(),"RECREATE"); } - map< vector<TString>, TH1* >::iterator it; + map< vector<string>, TH1* >::iterator it; for (it=fMapHisto.begin(); it!=fMapHisto.end(); ++it) { it->second->Write(); } diff --git a/NPLib/Tiara/TTiaraHyballSpectra.h b/NPLib/Tiara/TTiaraHyballSpectra.h index 7d0e67b31be9c06ab247ebaef40dfed9571a5941..10caa75b4734a39bb314df0ed17bac98b76e2f04 100644 --- a/NPLib/Tiara/TTiaraHyballSpectra.h +++ b/NPLib/Tiara/TTiaraHyballSpectra.h @@ -27,7 +27,6 @@ #include "TObject.h" #include <TH1.h> #include <TH2.h> -#include <TString.h> // NPLib headers #include "TTiaraHyballData.h" @@ -50,9 +49,9 @@ class TTiaraHyballSpectra { private: // Instantiate and register histo to maps - TH1* AddHisto1D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, TString family); - TH1* AddHisto2D(TString name, TString title, Int_t nbinsx, Double_t xlow, Double_t xup, - Int_t nbinsy, Double_t ylow, Double_t yup, TString family); + TH1* AddHisto1D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, string family); + TH1* AddHisto2D(string name, string title, Int_t nbinsx, Double_t xlow, Double_t xup, + Int_t nbinsy, Double_t ylow, Double_t yup, string family); // Initialization methods void InitRawSpectra(); @@ -67,9 +66,9 @@ class TTiaraHyballSpectra { public: // get map histo which will be used for GSpectra in GUser - map< vector<TString>, TH1* > GetMapHisto() const {return fMapHisto;} - TH1* GetHisto(TString family, TString name); - void WriteHisto(TString filename = "VOID"); + map< vector<string>, TH1* > GetMapHisto() const {return fMapHisto;} + TH1* GetHisto(string& family, string& name); + void WriteHisto(string filename = "VOID"); private: // Information on MUST2 unsigned int fRingsNumber; @@ -78,7 +77,7 @@ class TTiaraHyballSpectra { private: // map holding histo pointers and their family names - map< vector<TString>, TH1* > fMapHisto; + map< vector<string>, TH1* > fMapHisto; }; #endif diff --git a/NPLib/Tools/CalibrationManager.cxx b/NPLib/Tools/CalibrationManager.cxx index a03478b2a61c9ae7b8be73053c8fb64a4997fd1e..bf05eda83e90c1e5181ff5b23fa207be19a79a79 100644 --- a/NPLib/Tools/CalibrationManager.cxx +++ b/NPLib/Tools/CalibrationManager.cxx @@ -33,59 +33,59 @@ CalibrationManager* CalibrationManager::instance = 0; CalibrationManager* CalibrationManager::getInstance(string configFileName) - { - // A new instance of CalibrationManager is created if it does not exist: - if (instance == 0) { - instance = new CalibrationManager(configFileName); - } +{ + // A new instance of CalibrationManager is created if it does not exist: + if (instance == 0) { + instance = new CalibrationManager(configFileName); + } + + // The instance of CalibrationManager is returned: + return instance; +} - // The instance of CalibrationManager is returned: - return instance; - } - ////////////////////////////////////////////////////////////////// CalibrationManager::CalibrationManager(string configFileName) { - // Read configuration file Buffer - string lineBuffer, dataBuffer; - - // Open file - ifstream inputConfigFile; - inputConfigFile.open(configFileName.c_str()); - - cout << endl; - cout << "/////////// Calibration Information ///////////" << endl; - cout << "Getting list of Calibration File" << endl; - - if (!inputConfigFile) { - cout << "Calibration Path file :" << configFileName << " not found " << endl; - return; - } - - else { - cout << "Reading list of file from :" << configFileName << endl; - while (!inputConfigFile.eof()) { - getline(inputConfigFile, lineBuffer); - - // search for token giving the list of Root files to treat - if ( lineBuffer.compare(0, 19, "CalibrationFilePath") == 0 ) { - while (!inputConfigFile.eof()) { - inputConfigFile >> dataBuffer; - - // ignore comment Line - if (dataBuffer.compare(0, 1, "%") == 0) { - inputConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); - } - - else if (!inputConfigFile.eof()) { - AddFile(dataBuffer); - cout << "Adding file " << dataBuffer << " to Calibration" << endl; - } - } - } + // Read configuration file Buffer + string lineBuffer, dataBuffer; + + // Open file + ifstream inputConfigFile; + inputConfigFile.open(configFileName.c_str()); + + cout << endl; + cout << "/////////// Calibration Information ///////////" << endl; + cout << "Getting list of Calibration File" << endl; + + if (!inputConfigFile) { + cout << "Calibration Path file :" << configFileName << " not found " << endl; + return; + } + + else { + cout << "Reading list of file from :" << configFileName << endl; + while (!inputConfigFile.eof()) { + getline(inputConfigFile, lineBuffer); + + // search for token giving the list of Root files to treat + if ( lineBuffer.compare(0, 19, "CalibrationFilePath") == 0 ) { + while (!inputConfigFile.eof()) { + inputConfigFile >> dataBuffer; + + // ignore comment Line + if (dataBuffer.compare(0, 1, "%") == 0) { + inputConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); + } + + else if (!inputConfigFile.eof()) { + AddFile(dataBuffer); + cout << "Adding file " << dataBuffer << " to Calibration" << endl; + } + } } - } - cout << "/////////////////////////////////" << endl; + } + } + cout << "/////////////////////////////////" << endl; } ////////////////////////////////////////////////////////////////// @@ -95,245 +95,266 @@ CalibrationManager::~CalibrationManager() ////////////////////////////////////////////////////////////////// bool CalibrationManager::AddParameter(string DetectorName , string ParameterName , string Token ) { - string ParameterPath = DetectorName + "/" + ParameterName ; - fToken[Token] = ParameterPath ; - return true; + string ParameterPath = DetectorName + "/" + ParameterName ; + fToken[Token] = ParameterPath ; + return true; } ///////////////////////////////////////////////////////////////// void CalibrationManager::ClearCalibration() { - fCalibrationCoeff.clear(); + fCalibrationCoeff.clear(); } ///////////////////////////////////////////////////////////////// vector<double> CalibrationManager::GetCorrection(const string& ParameterPath) { - vector<double> Coeff ; - map< string , vector<double> >::iterator it ; - it = fCalibrationCoeff.find(ParameterPath) ; + vector<double> Coeff ; + map< string , vector<double> >::iterator it ; + it = fCalibrationCoeff.find(ParameterPath) ; - if(it == fCalibrationCoeff.end() ) - { - /* cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; - cout << " ERROR: PARAMETER " << ParameterPath << " IS NOT FOUND IN THE CALIBRATION DATA BASE " << endl ; - cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ;*/ + if(it == fCalibrationCoeff.end() ) + { + /* cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; + cout << " ERROR: PARAMETER " << ParameterPath << " IS NOT FOUND IN THE CALIBRATION DATA BASE " << endl ; + cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ;*/ - return Coeff ; - } + return Coeff ; + } - Coeff = it->second ; + Coeff = it->second ; - return(Coeff); + return(Coeff); } ////////////////////////////////////////////////////////////////// void CalibrationManager::LoadParameterFromFile() { - ifstream CalibFile ; - string DataBuffer ; - string LineBuffer ; - - // Get pointer to the TAsciifile CalibrationFile in RootOuput - TAsciiFile* AcsiiCalibration = RootOutput::getInstance()->GetAsciiFileCalibration(); - - - for(unsigned int i = 0 ; i < fFileList.size() ; i++) - { - CalibFile.open( fFileList[i].c_str() ); - map<string,string>::iterator it ; - - if(!CalibFile) - { - cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; - cout << " WARNING: FILE " << fFileList[i] << " IS MISSING " << endl ; - cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; - } - - else - { - // Append the Calibration File to the RootOuput for Back-up - string comment = "%%% From File " + fFileList[i] + "%%%"; - AcsiiCalibration->AppendLine(comment.c_str()); - AcsiiCalibration->Append(fFileList[i].c_str()); - - - while( !CalibFile.eof() ) - { - // Read the file Line by line - getline(CalibFile, LineBuffer); - - // Create a istringstream to manipulate the line easely - istringstream theLine (LineBuffer,istringstream::in); - theLine >> DataBuffer ; - - // Comment support, comment symbole is % - if(DataBuffer.compare(0, 1, "%") == 0) { - CalibFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} - - // Search word in the token list - it=fToken.find(DataBuffer); - // if the word is find, values are read - if( it!=fToken.end() ) - { - vector<double> Coeff ; - while( !theLine.eof() ){ - theLine >> DataBuffer ; Coeff.push_back( atof(DataBuffer.c_str()) ) ; - } - - // Check this parameter is not already define - if( fCalibrationCoeff.find(it->second) != fCalibrationCoeff.end() ) - cout << "WARNING: Parameter " << it->second << " Already found. It will be rewritted " << endl; - - // Add the list of Coeff to the Coeff map using Parameter Path as index - fCalibrationCoeff[ it->second ] = Coeff ; - } - - } - - } - - - CalibFile.close() ; - } - } + ifstream CalibFile ; + string DataBuffer ; + string LineBuffer ; + + // Get pointer to the TAsciifile CalibrationFile in RootOuput + TAsciiFile* AcsiiCalibration = RootOutput::getInstance()->GetAsciiFileCalibration(); + + + for(unsigned int i = 0 ; i < fFileList.size() ; i++) + { + CalibFile.open( fFileList[i].c_str() ); + map<string,string>::iterator it ; + + if(!CalibFile) + { + cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; + cout << " WARNING: FILE " << fFileList[i] << " IS MISSING " << endl ; + cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; + } + + else + { + // Append the Calibration File to the RootOuput for Back-up + string comment = "%%% From File " + fFileList[i] + "%%%"; + AcsiiCalibration->AppendLine(comment.c_str()); + AcsiiCalibration->Append(fFileList[i].c_str()); + + + while( !CalibFile.eof() ) + { + // Read the file Line by line + getline(CalibFile, LineBuffer); + + // Create a istringstream to manipulate the line easely + istringstream theLine (LineBuffer,istringstream::in); + theLine >> DataBuffer ; + + // Comment support, comment symbole is % + if(DataBuffer.compare(0, 1, "%") == 0) { + CalibFile.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );} + + // Search word in the token list + it=fToken.find(DataBuffer); + // if the word is find, values are read + if( it!=fToken.end() ) + { + vector<double> Coeff ; + while( theLine >> DataBuffer ){ + Coeff.push_back( atof(DataBuffer.c_str()) ) ; + } + + // Check this parameter is not already define + if( fCalibrationCoeff.find(it->second) != fCalibrationCoeff.end() ) + cout << "WARNING: Parameter " << it->second << " Already found. It will be rewritted " << endl; + + // Add the list of Coeff to the Coeff map using Parameter Path as index + fCalibrationCoeff[ it->second ] = Coeff ; + } + + } + + } + + + CalibFile.close() ; + } +} ////////////////////////////////////////////////////////////////// -double CalibrationManager::ApplyCalibration(const string& ParameterPath , const double& RawValue) - { - map< string , vector<double> >::iterator it ; - - // Find the good parameter in the Map - // Using Find method of stl is the fastest way - it = fCalibrationCoeff.find(ParameterPath) ; - - // If the find methods return the end iterator it's mean the parameter was not found - if(it == fCalibrationCoeff.end() ) - { - /* cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; - cout << " ERROR: PARAMETER " << ParameterPath << " IS NOT FOUND IN THE CALIBRATION DATA BASE " << endl ; - cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl; -exit(1); */ - - return RawValue ; - } - - // Else we take the second part of the element (first is index, ie: parameter path) - // Second is the vector of Coeff - vector<double> Coeff = it->second ; - - // The vector size give the degree of calibration - // We just apply the coeff and returned the calibrated value - - double CalibratedValue = 0 ; - for(unsigned int i = 0 ; i < Coeff.size() ; i++) - { - CalibratedValue += Coeff[i]*pow(RawValue, (double)i); - } - - return CalibratedValue ; - - } +double CalibrationManager::ApplyCalibration(const string& ParameterPath , const double& RawValue){ + map< string , vector<double> >::iterator it ; + + // Find the good parameter in the Map + // Using Find method of stl is the fastest way + it = fCalibrationCoeff.find(ParameterPath) ; + + // If the find methods return the end iterator it's mean the parameter was not found + if(it == fCalibrationCoeff.end() ){ + return RawValue ; + } + // Else we take the second part of the element (first is index, ie: parameter path) + // Second is the vector of Coeff + vector<double> Coeff = it->second ; + + // The vector size give the degree of calibration + // We just apply the coeff and returned the calibrated value + + double CalibratedValue = 0 ; + for(unsigned int i = 0 ; i < Coeff.size() ; i++){ + CalibratedValue += Coeff[i]*pow(RawValue, (double)i); + } + + return CalibratedValue ; + +} +////////////////////////////////////////////////////////////////// +double CalibrationManager::ApplyCalibrationDebug(const string& ParameterPath , const double& RawValue){ + map< string , vector<double> >::iterator it ; + + // Find the good parameter in the Map + // Using Find method of stl is the fastest way + it = fCalibrationCoeff.find(ParameterPath) ; + + // If the find methods return the end iterator it's mean the parameter was not found + if(it == fCalibrationCoeff.end() ){ + cout << " PARAMETER " << ParameterPath << " IS NOT FOUND IN THE CALIBRATION DATA BASE " << endl ; + return RawValue ; + } + + // Else we take the second part of the element (first is index, ie: parameter path) + // Second is the vector of Coeff + cout << it->first << " : raw = " << RawValue << " coeff = " ; + vector<double> Coeff = it->second ; + + // The vector size give the degree of calibration + // We just apply the coeff and returned the calibrated value + + double CalibratedValue = 0 ; + for(unsigned int i = 0 ; i < Coeff.size() ; i++){ + cout << Coeff[i] << " " ; + CalibratedValue += Coeff[i]*pow(RawValue, (double)i); + } +cout << "results = " << CalibratedValue << endl ; + return CalibratedValue ; +} ////////////////////////////////////////////////////////////////// double CalibrationManager::ApplyResistivePositionCalibration(const string& ParameterPath , const double& DeltaRawValue){ - map< string , vector<double> >::iterator it ; - - // Find the good parameter in the Map - // Using Find method of stl is the fastest way - it = fCalibrationCoeff.find(ParameterPath) ; - - // If the find methods return the end iterator it's mean the parameter was not found - if(it == fCalibrationCoeff.end() ) - { - /* cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; - cout << " ERROR: PARAMETER " << ParameterPath << " IS NOT FOUND IN THE CALIBRATION DATA BASE " << endl ; - cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl; -exit(1); */ - - return DeltaRawValue ; - } - - // Else we take the second part of the element (first is index, ie: parameter path) - // Second is the vector of Coeff - vector<double> Coeff = it->second ; - - // Check that the number of coeff is ok - if(Coeff.size()!=2) return DeltaRawValue ; - - double CalibratedValue = (DeltaRawValue-Coeff[0])/(Coeff[1]-Coeff[0]) ; - return CalibratedValue ; - - } + map< string , vector<double> >::iterator it ; + + // Find the good parameter in the Map + // Using Find method of stl is the fastest way + it = fCalibrationCoeff.find(ParameterPath) ; + + // If the find methods return the end iterator it's mean the parameter was not found + if(it == fCalibrationCoeff.end() ) + { + /* cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; + cout << " ERROR: PARAMETER " << ParameterPath << " IS NOT FOUND IN THE CALIBRATION DATA BASE " << endl ; + cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl; + exit(1); */ + + return DeltaRawValue ; + } + + // Else we take the second part of the element (first is index, ie: parameter path) + // Second is the vector of Coeff + vector<double> Coeff = it->second ; + + // Check that the number of coeff is ok + if(Coeff.size()!=2) return DeltaRawValue ; + + double CalibratedValue = (DeltaRawValue-Coeff[0])/(Coeff[1]-Coeff[0]) ; + return CalibratedValue ; + +} ////////////////////////////////////////////////////////////////// bool CalibrationManager::ApplyThreshold(const string& ParameterPath, const double& RawValue) { - map< string , vector<double> >::iterator it ; + map< string , vector<double> >::iterator it ; - // Find the good parameter in the Map - // Using Find method of stl is the fastest way - it = fCalibrationCoeff.find(ParameterPath) ; + // Find the good parameter in the Map + // Using Find method of stl is the fastest way + it = fCalibrationCoeff.find(ParameterPath) ; - // If the find methods return the end iterator it's mean the parameter was not found - if(it == fCalibrationCoeff.end() ) - { - // cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; - // cout << " ERROR: PARAMETER " << ParameterPath << " IS NOT FOUND IN THE CALIBRATION DATA BASE " << endl ; - // cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; - return false; - } + // If the find methods return the end iterator it's mean the parameter was not found + if(it == fCalibrationCoeff.end() ) + { + // cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; + // cout << " ERROR: PARAMETER " << ParameterPath << " IS NOT FOUND IN THE CALIBRATION DATA BASE " << endl ; + // cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; + return false; + } - // Else we take the second part of the element (first is index, ie: parameter path) - // Second is the vector of Coeff - vector<double> Coeff = it->second ; + // Else we take the second part of the element (first is index, ie: parameter path) + // Second is the vector of Coeff + vector<double> Coeff = it->second ; - // The vector size give the degree of calibration - // We just apply the coeff and returned the calibrated value + // The vector size give the degree of calibration + // We just apply the coeff and returned the calibrated value - double ThresholdValue = 0 ; + double ThresholdValue = 0 ; - if(Coeff.size()==2){ThresholdValue = Coeff[0] + 3*Coeff[1];} + if(Coeff.size()==2){ThresholdValue = Coeff[0] + 3*Coeff[1];} - if(RawValue > ThresholdValue) - { - return true; - } - else return false; + if(RawValue > ThresholdValue) + { + return true; + } + else return false; } ///////////////////////////////////////////////////////////////////////////////////////////// double CalibrationManager::GetPedestal(const string& ParameterPath) { - map< string , vector<double> >::iterator it ; + map< string , vector<double> >::iterator it ; - // Find the good parameter in the Map - // Using Find method of stl is the fastest way - it = fCalibrationCoeff.find(ParameterPath) ; + // Find the good parameter in the Map + // Using Find method of stl is the fastest way + it = fCalibrationCoeff.find(ParameterPath) ; - // If the find methods return the end iterator it's mean the parameter was not found - if(it == fCalibrationCoeff.end() ) - { - cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; - cout << " ERROR: PARAMETER " << ParameterPath << " IS NOT FOUND IN THE CALIBRATION DATA BASE " << endl ; - cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; - } + // If the find methods return the end iterator it's mean the parameter was not found + if(it == fCalibrationCoeff.end() ) + { + cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; + cout << " ERROR: PARAMETER " << ParameterPath << " IS NOT FOUND IN THE CALIBRATION DATA BASE " << endl ; + cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " << endl ; + } - // Else we take the second part of the element (first is index, ie: parameter path) - // Second is the vector of Coeff - vector<double> Coeff = it->second ; + // Else we take the second part of the element (first is index, ie: parameter path) + // Second is the vector of Coeff + vector<double> Coeff = it->second ; - // The vector size give the degree of calibration - // We just apply the coeff and returned the calibrated value + // The vector size give the degree of calibration + // We just apply the coeff and returned the calibrated value - double PedestalValue = 0 ; + double PedestalValue = 0 ; - if(Coeff.size()==2){PedestalValue = Coeff[0];} + if(Coeff.size()==2){PedestalValue = Coeff[0];} - return PedestalValue; + return PedestalValue; } diff --git a/NPLib/Tools/CalibrationManager.h b/NPLib/Tools/CalibrationManager.h index df2c0a6052da7b68523db215e10a9fcaf8576587..5166ee82a4f19bd95e64c10fff118ea08e305bcd 100644 --- a/NPLib/Tools/CalibrationManager.h +++ b/NPLib/Tools/CalibrationManager.h @@ -59,6 +59,8 @@ class CalibrationManager // call like : myCalibrationManager->ApplyCalibration( "MUST2/Telescope5_Si_X38_E" , RawEnergy ) // return the Calibrated value double ApplyCalibration(const string& ParameterPath , const double& RawValue); + // Same but with debug information outputs + double ApplyCalibrationDebug(const string& ParameterPath , const double& RawValue); double ApplyResistivePositionCalibration(const string& ParameterPath , const double& RawValue); bool ApplyThreshold(const string& ParameterPath, const double& RawValue); double GetPedestal(const string& ParameterPath); diff --git a/NPLib/VDetector/DetectorManager.cxx b/NPLib/VDetector/DetectorManager.cxx index 3bf62a3afb02dd0f4cb47cf23623f96821c9fd27..a6364d63542dc743f8112b4282950c4263a9bc4e 100644 --- a/NPLib/VDetector/DetectorManager.cxx +++ b/NPLib/VDetector/DetectorManager.cxx @@ -50,6 +50,9 @@ #include "TSpegPhysics.h" #include "TExlPhysics.h" #include "TTacPhysics.h" +#include "TSiLiPhysics.h" +#include "TSiResPhysics.h" +#include "TLaBr3Physics.h" #include "TChio_digPhysics.h" #include "TChio_anPhysics.h" #include "NPOptionManager.h" @@ -84,9 +87,12 @@ void DetectorManager::ReadConfigurationFile(string Path) { Bool_t ChateauCristal = false; Bool_t Exogam = false; Bool_t ScintillatorPlastic = false; + Bool_t SiLi = false; + Bool_t SiRes = false; + Bool_t LaBr3 = false; Bool_t IonisationChamber = false; Bool_t Trifoil = false; - Bool_t Charissa = false; + Bool_t Charissa = false; Bool_t GeneralTarget = false; Bool_t GPDTracker = false; Bool_t HYD2Tracker = false; @@ -401,7 +407,61 @@ void DetectorManager::ReadConfigurationFile(string Path) { AddDetector("Plastic", myDetector); #endif } + //////////////////////////////////////////// + ///////////// Search for LaBr3 /////////// + //////////////////////////////////////////// + else if (LineBuffer.compare(0, 5, "LaBr3") == 0 && LaBr3 == false) { +#ifdef INC_LABR3 + LaBr3 = true; + cout << "//////// Plastic ////////" << endl << endl; + // Instantiate the new array as a VDetector Object + VDetector* myDetector = new TLaBr3Physics(); + // Read Position of Telescope + ConfigFile.close(); + myDetector->ReadConfiguration(Path); + ConfigFile.open(Path.c_str()); + + // Add array to the VDetector Vector + AddDetector("LaBr3", myDetector); +#endif + } //////////////////////////////////////////// + ///////////// Search for SiLi /////////// + //////////////////////////////////////////// + else if (LineBuffer.compare(0, 4, "SiLi") == 0 && SiLi == false) { +#ifdef INC_SILI + SiLi = true; + cout << "//////// Plastic ////////" << endl << endl; + + // Instantiate the new array as a VDetector Object + VDetector* myDetector = new TSiLiPhysics(); + // Read Position of Telescope + ConfigFile.close(); + myDetector->ReadConfiguration(Path); + ConfigFile.open(Path.c_str()); + + // Add array to the VDetector Vector + AddDetector("SiLi", myDetector); +#endif + } //////////////////////////////////////////// + ///////////// Search for SiRes /////////// + //////////////////////////////////////////// + else if (LineBuffer.compare(0, 5, "SiRes") == 0 && SiRes == false) { +#ifdef INC_SIRES + SiRes = true; + cout << "//////// Plastic ////////" << endl << endl; + + // Instantiate the new array as a VDetector Object + VDetector* myDetector = new TSiResPhysics(); + // Read Position of Telescope + ConfigFile.close(); + myDetector->ReadConfiguration(Path); + ConfigFile.open(Path.c_str()); + + // Add array to the VDetector Vector + AddDetector("SiRes", myDetector); +#endif + } /////////////////////////////////////////////////////// ///////////// Search for Ionisation Chamber /////////// /////////////////////////////////////////////////////// @@ -780,9 +840,9 @@ void DetectorManager::InitSpectra(){ } ///////////////////////////////////////////////////////////////////////////////////////////////// -vector< map< vector<TString>, TH1* > > DetectorManager::GetSpectra() +vector< map< vector<string>, TH1* > > DetectorManager::GetSpectra() { - vector< map< vector<TString>, TH1* > > myVector; + vector< map< vector<string>, TH1* > > myVector; map<string,VDetector*>::iterator it; // loop on detectors @@ -792,3 +852,15 @@ vector< map< vector<TString>, TH1* > > DetectorManager::GetSpectra() return myVector; } + +///////////////////////////////////////////////////////////////////////////////////////////////// +vector<string> DetectorManager::GetDetectorList(){ + map<string,VDetector*>::iterator it; + vector<string> DetectorList; + for (it = m_Detector.begin(); it != m_Detector.end(); ++it) { + DetectorList.push_back(it->first); + } + + return DetectorList; +} + diff --git a/NPLib/VDetector/DetectorManager.h b/NPLib/VDetector/DetectorManager.h index 137bc7539710284710ad7fca60ad02b21ae922ef..aceafc83a22791d8becd5d23eadce03d014fc9d0 100644 --- a/NPLib/VDetector/DetectorManager.h +++ b/NPLib/VDetector/DetectorManager.h @@ -25,7 +25,6 @@ // ROOT #include "TH1.h" -#include "TString.h" // STL #include <string> @@ -53,8 +52,8 @@ namespace NPA{ void ClearEventPhysics(); void ClearEventData(); void InitSpectra(); - vector< map< vector<TString>, TH1* > > GetSpectra(); - + vector< map< vector<string>, TH1* > > GetSpectra(); + vector<string> GetDetectorList(); private: // The map containning all detectors // Using a Map one can access to any detector using its name diff --git a/NPLib/VDetector/VDetector.h b/NPLib/VDetector/VDetector.h index 6d36b74b11e354f5b1401c5e4f86d5b9bde31681..b0861a70395f5af938c0e63aef588b8fe9c9459c 100644 --- a/NPLib/VDetector/VDetector.h +++ b/NPLib/VDetector/VDetector.h @@ -83,7 +83,7 @@ namespace NPA { // 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< vector<TString> , TH1*> GetSpectra() {map< vector<TString>, TH1* > x; return x;}; + virtual map< vector<string> , TH1*> GetSpectra() {map< vector<string>, TH1* > x; return x;}; private: // The list below is here to help you building your own detector /* diff --git a/NPLib/configure b/NPLib/configure index 1c6572588ac535e04766813b474b4149cb59245b..4303bc168abe3de318f89a21543903bed67da25e 100755 --- a/NPLib/configure +++ b/NPLib/configure @@ -65,42 +65,40 @@ do # remove "Makefile" string from file name name=${file%\/*} # file name in lower case - lname=$(echo "$name" | tr '[A-Z]' '[a-z]') + lname=$(printf "$name\n" | tr '[A-Z]' '[a-z]') # only build core libraries - if echo "$corelibs" | grep -q "$lname" ; then + if printf "$corelibs\n" | grep -q "$lname" ; then core_string="$core_string""$lname " else if [ $# = 0 ] ; then detector_string="$detector_string""$lname " else - if echo "$args" | grep -q "$lname" ; then + if printf "$args\n" | grep -q "$lname" ; then detector_string="$detector_string""$lname " fi ; fi ; fi ; done -echo "$core_string" >> $core_file -echo "$detector_string" >> $detector_file +printf "$core_string\n" >> $core_file +printf "$detector_string\n" >> $detector_file - -########################################################################### -# Create detector entry in Makefile file for detectors given in arguments # -########################################################################### +######################################################################## +# Create cores entry in Makefile file for detectors given in arguments # +######################################################################## # output file outfile="Makefile.detector" -echo " + Creating $outfile file....." - +printf " + Creating $outfile file.....\n" # if output file exists delete it if [ -e $outfile ] ; then rm $outfile fi ; # create output file -echo "# WARNING:" >> $outfile -echo "# This file is automatically generated by the configure script." >> $outfile -echo "# If you modify this file by hand, changes won't persist the next time you run ./configure." >> $outfile -echo "#" >> $outfile +printf "# WARNING:\n" >> $outfile +printf "# This file is automatically generated by the configure script.\n" >> $outfile +printf "# If you modify this file by hand, changes won't persist the next time you run ./configure.\n" >> $outfile +printf "#\n" >> $outfile # loop recursively on sub-directories containing a Makefile file for file in */Makefile @@ -108,20 +106,38 @@ do # remove "Makefile" string from file name name=${file%\/*} # file name in lower case - lname=$(echo "$name" | tr '[A-Z]' '[a-z]') + lname=$(printf "$name\n" | tr '[A-Z]' '[a-z]') + # only build core libraries + if printf "$corelibs\n" | grep -q "$lname" ; then + ./scripts/makefile_detector.sh $name $outfile + fi ; +done + +########################################################################### +# Create detector entry in Makefile file for detectors given in arguments # +########################################################################### +# loop recursively on sub-directories containing a Makefile file +for file in */Makefile +do + # remove "Makefile" string from file name + name=${file%\/*} + # file name in lower case + lname=$(printf "$name\n" | tr '[A-Z]' '[a-z]') # if no arguments are given, add all detectors in Makefile.detector # by default - if [ $# = 0 ] ; then - # build target - echo "$lname": >> $outfile - # build commands + + if [ $# = 0 ] ; then + #ignore the core folder + if printf "$corelibs\n" | grep -q "$lname" ; then + printf "" + else + # build commands ./scripts/makefile_detector.sh $name $outfile + fi else # only add Makefile.detector target if it is in the # arguments list - if echo "$args" | grep -q "$lname" ; then - # build target - echo "$lname": >> $outfile + if printf "$args\n" | grep -q "$lname" ; then # build commands ./scripts/makefile_detector.sh $name $outfile fi ; @@ -129,6 +145,7 @@ do done + ########################################################################## # Create DetectorList.inc file in VDetector directory used for compiling # # only the detectors given in arguments # @@ -136,7 +153,7 @@ done # output file outfile="DetectorList.inc" # outfile="VDetector/DetectorList.inc" -echo " + Creating $outfile file....." +printf " + Creating $outfile file.....\n" # if output file exists delete it if [ -e $outfile ] ; then @@ -144,10 +161,10 @@ if [ -e $outfile ] ; then fi ; # create output file -echo "// WARNING:" >> $outfile -echo "// This file is automatically generated by the configure script." >> $outfile -echo "// If you modify this file by hand, changes won't persist the next time you run ./configure." >> $outfile -echo "//" >> $outfile +printf "// WARNING:\n" >> $outfile +printf "// This file is automatically generated by the configure script.\n" >> $outfile +printf "// If you modify this file by hand, changes won't persist the next time you run ./configure.\n" >> $outfile +printf "//\n" >> $outfile # loop recursively on sub-directories containing a Makefile file for file in */Makefile @@ -155,50 +172,23 @@ do # remove "Makefile" string from file name name=${file%\/*} # file name in lower/upper case - lname=$(echo "$name" | tr '[A-Z]' '[a-z]') - uname=$(echo "$name" | tr '[a-z]' '[A-Z]') + lname=$(printf "$name\n" | tr '[A-Z]' '[a-z]') + uname=$(printf "$name\n" | tr '[a-z]' '[A-Z]') # if no arguments are given, add all detectors in Makefile.detector # by default if [ $# = 0 ] ; then # build target - echo "#define INC_$uname" >> $outfile + printf "#define INC_$uname\n" >> $outfile else # only add Makefile.detector target if it is in the # arguments list - if echo "$args" | grep -q "$lname" ; then + if printf "$args\n" | grep -q "$lname" ; then # build target - echo "#define INC_$uname" >> $outfile + printf "#define INC_$uname\n" >> $outfile fi ; fi ; done -######################## -# Build core libraries # -######################## -# (I) fill include directory with associated headers -#echo " + Copying header files to the include directory....." -./scripts/fillincdir.sh - -# (II) compile core libraries -echo " + Building core libraries....." -# loop recursively on sub-directories containing a Makefile file -for file in */Makefile -do - # remove "Makefile" string from file name - name=${file%\/*} - # file name in lower case - lname=$(echo "$name" | tr '[A-Z]' '[a-z]') - # only build core libraries - if echo "$corelibs" | grep -q "$lname" ; then - # print informations - echo -e "\tEntering $name directory..." - # add "-C ./" pattern at the beginning of the name - cmd="-C ./$name" - # execute make command with target specified on command line - make -j --silent $cmd - fi ; -done - diff --git a/NPLib/scripts/filllibdir.sh b/NPLib/scripts/filllibdir.sh deleted file mode 100755 index 3cdccec020c743158211d5794b3ad6b4e791bde9..0000000000000000000000000000000000000000 --- a/NPLib/scripts/filllibdir.sh +++ /dev/null @@ -1,36 +0,0 @@ -# ***************************************************************************** -# * Copyright (C) 2009 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: N. de Sereville contact address: deserevi@ipno.in2p3.fr * -# * * -# * Creation Date : 16/11/10 * -# * Last update : * -# *---------------------------------------------------------------------------* -# * Decription: This script moves all the libraries (*.so) in all directories * -# * to the lib/ directory. * -# *---------------------------------------------------------------------------* -# * Comment: * -# * * -# * * -# ***************************************************************************** - -#! /bin/bash - -echo " + Copying libraries to the lib directory....." - -# previously, clean lib/ directory -rm -f lib/*.so - -# loop recursively on header files in all directories -for file in */*.so -do - # copy header files to the include directory - cp -f $file lib/ -done - -rm -f lib/NPToolLogon_C.so diff --git a/NPLib/scripts/makefile.sh b/NPLib/scripts/makefile.sh deleted file mode 100755 index 21c6f7b66f2f28cfe3fc23ed5f20fa85fa37597b..0000000000000000000000000000000000000000 --- a/NPLib/scripts/makefile.sh +++ /dev/null @@ -1,58 +0,0 @@ -# ***************************************************************************** -# * Copyright (C) 2009 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: N. de Sereville contact address: deserevi@ipno.in2p3.fr * -# * * -# * Creation Date : 16/11/10 * -# * Last update : * -# *---------------------------------------------------------------------------* -# * Decription: This script loops on all subdirectories containing a Makefile * -# * and call it with the argument passed to the script. * -# * Supported arguments are: * -# * + no arguments: compile everything * -# * + clean: remove temporary files but not shared library * -# * + distclean: remove temporary files and shared library * -# * * -# *---------------------------------------------------------------------------* -# * Comment: * -# * * -# * * -# ***************************************************************************** - -#! /bin/bash - -if [ $# = 0 ] ; then - printf " + Building detector libraries.....\n" -else - printf " + Cleaning $2 libraries.....\n" -fi ; - -# read .detector_libs or .core_libs file created by the configure script -file=".""$2_libs" -if [ $# = 0 ] ; then - file=".detector_libs" -fi ; -read -r detectorlibs < "$file" - -# loop recursively on Makefile files in sub-directories -for file in */Makefile -do - # remove "Makefile" string from file name - name=${file%\/*} - # file name in lower case - lname=$(echo "$name" | tr '[A-Z]' '[a-z]') - # only build defined detector libraries - if printf "$detectorlibs" | grep -q "$lname" ; then - # print informations - printf "\tEntering $name directory...\n" - # add "-C ./" pattern at the beginning of the name - cmd="-C ./$name" - # execute make command with target specified on command line - make -j --silent $1 $cmd - fi ; -done diff --git a/NPLib/scripts/makefile_detector.sh b/NPLib/scripts/makefile_detector.sh index 814a766ca8bfdebbacc775924a66cbdc1b3370ea..de57f486cfbe0757ddc3b545ae33dee77b9b094b 100755 --- a/NPLib/scripts/makefile_detector.sh +++ b/NPLib/scripts/makefile_detector.sh @@ -26,21 +26,15 @@ # * * # ***************************************************************************** - +#Target name +lname=$(printf "$1\n" | tr '[A-Z]' '[a-z]') +printf "$lname: " >> $2 +#Dependancies +printf "FillIncludeDir \n" >> $2 # build message -printf "\t@echo \"Entering $1 directory...\"" >> $2 +printf "\t@echo \"Entering $1 directory...\"\n" >> $2 # execute make command with target specified on command line -printf "\tmake --silent -C ./$1" >> $2 -# copy header files -printf "\tcd $1; cp -f *.h ../include" >> $2 -# remove *Dict header files -printf "\tcd include; rm *Dict.h" >> $2 -# copy library files -printf "\tcd $1; cp -f *.so ../lib" >> $2 -# deal with mac osx dylib files -#echo "ifeq (\$(findstring macosx, \$(ARCH)), macosx)" >> $2 -#echo "\t@echo \"to be done\"" -#echo "endif" >> $2 -# newline -printf "" >> $2 +printf "\t+make --silent -C ./$1\n" >> $2 +printf "\tcp ./$1/*.so lib/\n" >> $2 +printf "\n" >> $2 diff --git a/NPSimulation/GASPARD/GaspardTrackerSquare.cc b/NPSimulation/GASPARD/GaspardTrackerSquare.cc index dac055ae83f690fd12ebb95817829e5ffd83a6fc..9e07060a170b5411741d35551f2cd322e091d347 100644 --- a/NPSimulation/GASPARD/GaspardTrackerSquare.cc +++ b/NPSimulation/GASPARD/GaspardTrackerSquare.cc @@ -234,8 +234,10 @@ void GaspardTrackerSquare::VolumeMaker(G4int TelescopeNumber, new G4PVPlacement(G4Transform3D(*MMrot, MMpos), logicGPDSquare, Name, world, false, 0); - logicGPDSquare->SetVisAttributes(G4VisAttributes::Invisible); - if (m_non_sensitive_part_visiualisation) logicGPDSquare->SetVisAttributes(G4VisAttributes(G4Colour(0.90, 0.90, 0.90))); + + G4VisAttributes* SquareVisAtt = new G4VisAttributes(G4Colour(0.90, 0.90, 0.90)); + SquareVisAtt->SetForceWireframe(true); + logicGPDSquare->SetVisAttributes(SquareVisAtt); //Place two marker to identify the u and v axis on silicon face: //marker are placed a bit before the silicon itself so they don't perturbate simulation @@ -276,7 +278,7 @@ void GaspardTrackerSquare::VolumeMaker(G4int TelescopeNumber, logicFirstStage->SetSensitiveDetector(m_FirstStageScorer); ///Visualisation of FirstStage Strip - G4VisAttributes* FirstStageVisAtt = new G4VisAttributes(G4Colour(0.0, 0.0, 0.9)); // blue + G4VisAttributes* FirstStageVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3)); // blue logicFirstStage->SetVisAttributes(FirstStageVisAtt); } @@ -296,7 +298,7 @@ void GaspardTrackerSquare::VolumeMaker(G4int TelescopeNumber, logicSecondStage->SetSensitiveDetector(m_SecondStageScorer); ///Visualisation of SecondStage Strip - G4VisAttributes* SecondStageVisAtt = new G4VisAttributes(G4Colour(0.5, 0.5, 0.5)) ; + G4VisAttributes* SecondStageVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3)) ; logicSecondStage->SetVisAttributes(SecondStageVisAtt) ; } @@ -316,7 +318,7 @@ void GaspardTrackerSquare::VolumeMaker(G4int TelescopeNumber, logicThirdStage->SetSensitiveDetector(m_ThirdStageScorer); ///Visualisation of Third Stage - G4VisAttributes* ThirdStageVisAtt = new G4VisAttributes(G4Colour(0.0, 0.9, 0.0)); // green + G4VisAttributes* ThirdStageVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3)); // green logicThirdStage->SetVisAttributes(ThirdStageVisAtt); } } diff --git a/NPSimulation/GASPARD/GaspardTrackerTrapezoid.cc b/NPSimulation/GASPARD/GaspardTrackerTrapezoid.cc index 5094093f435ee1b7a1581a452af1d8c1b96778c9..790830ce324c171109f9e2e652c68ce80bc4ea44 100644 --- a/NPSimulation/GASPARD/GaspardTrackerTrapezoid.cc +++ b/NPSimulation/GASPARD/GaspardTrackerTrapezoid.cc @@ -235,8 +235,9 @@ void GaspardTrackerTrapezoid::VolumeMaker(G4int TelescopeNumber , new G4PVPlacement(G4Transform3D(*MMrot, MMpos), logicGPDTrapezoid, Name, world, false, 0); - logicGPDTrapezoid->SetVisAttributes(G4VisAttributes::Invisible); - if (m_non_sensitive_part_visiualisation) logicGPDTrapezoid->SetVisAttributes(G4VisAttributes(G4Colour(0.90, 0.90, 0.90))); + G4VisAttributes* TrapezoideVisAtt = new G4VisAttributes(G4Colour(0.90, 0.90, 0.90)); + TrapezoideVisAtt->SetForceWireframe(true); + logicGPDTrapezoid->SetVisAttributes(TrapezoideVisAtt); //Place two marker to identify the u and v axis on silicon face: //marker are placed a bit before the silicon itself so they don't perturbate simulation @@ -286,7 +287,7 @@ void GaspardTrackerTrapezoid::VolumeMaker(G4int TelescopeNumber , logicFirstStage->SetSensitiveDetector(m_FirstStageScorer); ///Visualisation of FirstStage Strip - G4VisAttributes* FirstStageVisAtt = new G4VisAttributes(G4Colour(0.0, 0.0, 0.9)); // blue + G4VisAttributes* FirstStageVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3)); // blue logicFirstStage->SetVisAttributes(FirstStageVisAtt); } @@ -315,7 +316,7 @@ void GaspardTrackerTrapezoid::VolumeMaker(G4int TelescopeNumber , logicSecondStage->SetSensitiveDetector(m_SecondStageScorer); ///Visualisation of SecondStage Strip - G4VisAttributes* SecondStageVisAtt = new G4VisAttributes(G4Colour(0.5, 0.5, 0.5)); + G4VisAttributes* SecondStageVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3)); logicSecondStage->SetVisAttributes(SecondStageVisAtt); } @@ -344,7 +345,7 @@ void GaspardTrackerTrapezoid::VolumeMaker(G4int TelescopeNumber , logicThirdStage->SetSensitiveDetector(m_ThirdStageScorer); ///Visualisation of Third Stage - G4VisAttributes* ThirdStageVisAtt = new G4VisAttributes(G4Colour(0.0, 0.9, 0.0)); // red + G4VisAttributes* ThirdStageVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3)); // red logicThirdStage->SetVisAttributes(ThirdStageVisAtt); } } diff --git a/NPSimulation/MUST2/MUST2Array.cc b/NPSimulation/MUST2/MUST2Array.cc index d611e88b4c20f145f4eaec73c86d3600d3e93d49..834c272d905ff008ecc9ba14f71eb7c94cf437d7 100644 --- a/NPSimulation/MUST2/MUST2Array.cc +++ b/NPSimulation/MUST2/MUST2Array.cc @@ -59,492 +59,490 @@ using namespace MUST2 ; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // MUST2Array Specific Method -MUST2Array::MUST2Array() -{ - m_Event = new TMust2Data() ; - InitializeMaterial(); +MUST2Array::MUST2Array(){ + m_Event = new TMust2Data() ; + InitializeMaterial(); } -MUST2Array::~MUST2Array() -{ - delete m_MaterialAluminium; - delete m_MaterialIron; - delete m_MaterialCsI; - delete m_MaterialVacuum ; - delete m_MaterialMyl; - delete m_MaterialHarvar; +MUST2Array::~MUST2Array(){ + delete m_MaterialAluminium; + delete m_MaterialIron; + delete m_MaterialCsI; + delete m_MaterialVacuum ; + delete m_MaterialMyl; + delete m_MaterialHarvar; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void MUST2Array::AddTelescope( G4ThreeVector X1_Y1, - G4ThreeVector X128_Y1, - G4ThreeVector X1_Y128, - G4ThreeVector X128_Y128, - bool wSi, - bool wSiLi, - bool wCsI) + G4ThreeVector X128_Y1, + G4ThreeVector X1_Y128, + G4ThreeVector X128_Y128, + bool wSi, + bool wSiLi, + bool wCsI) { - m_DefinitionType.push_back(true); - - m_X1_Y1 .push_back(X1_Y1); - m_X128_Y1 .push_back(X128_Y1); - m_X1_Y128 .push_back(X1_Y128); - m_X128_Y128 .push_back(X128_Y128); - m_wSi.push_back(wSi); - m_wSiLi.push_back(wSiLi); - m_wCsI.push_back(wCsI); - - m_R.push_back(0); - m_Theta.push_back(0); - m_Phi.push_back(0); - m_beta_u.push_back(0); - m_beta_v.push_back(0); - m_beta_w.push_back(0); + m_DefinitionType.push_back(true); + + m_X1_Y1 .push_back(X1_Y1); + m_X128_Y1 .push_back(X128_Y1); + m_X1_Y128 .push_back(X1_Y128); + m_X128_Y128 .push_back(X128_Y128); + m_wSi.push_back(wSi); + m_wSiLi.push_back(wSiLi); + m_wCsI.push_back(wCsI); + + m_R.push_back(0); + m_Theta.push_back(0); + m_Phi.push_back(0); + m_beta_u.push_back(0); + m_beta_v.push_back(0); + m_beta_w.push_back(0); } void MUST2Array::AddTelescope( G4double R, - G4double Theta, - G4double Phi, - G4double beta_u, - G4double beta_v, - G4double beta_w, - bool wSi, - bool wSiLi, - bool wCsI) + G4double Theta, + G4double Phi, + G4double beta_u, + G4double beta_v, + G4double beta_w, + bool wSi, + bool wSiLi, + bool wCsI) { - G4ThreeVector empty = G4ThreeVector(0, 0, 0); + G4ThreeVector empty = G4ThreeVector(0, 0, 0); - m_DefinitionType.push_back(false); + m_DefinitionType.push_back(false); - m_R.push_back(R); - m_Theta.push_back(Theta); - m_Phi.push_back(Phi); - m_beta_u.push_back(beta_u); - m_beta_v.push_back(beta_v); - m_beta_w.push_back(beta_w); - m_wSi.push_back(wSi); - m_wSiLi.push_back(wSiLi); - m_wCsI.push_back(wCsI); + m_R.push_back(R); + m_Theta.push_back(Theta); + m_Phi.push_back(Phi); + m_beta_u.push_back(beta_u); + m_beta_v.push_back(beta_v); + m_beta_w.push_back(beta_w); + m_wSi.push_back(wSi); + m_wSiLi.push_back(wSiLi); + m_wCsI.push_back(wCsI); - m_X1_Y1 .push_back(empty) ; - m_X128_Y1 .push_back(empty) ; - m_X1_Y128 .push_back(empty) ; - m_X128_Y128 .push_back(empty) ; + m_X1_Y1 .push_back(empty) ; + m_X128_Y1 .push_back(empty) ; + m_X1_Y128 .push_back(empty) ; + m_X128_Y128 .push_back(empty) ; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void MUST2Array::VolumeMaker( G4int TelescopeNumber, - G4ThreeVector MMpos, - G4RotationMatrix* MMrot, - bool wSi, - bool wSiLi, - bool wCsI, - G4LogicalVolume* world) + G4ThreeVector MMpos, + G4RotationMatrix* MMrot, + bool wSi, + bool wSiLi, + bool wCsI, + G4LogicalVolume* world) { - G4double NbrTelescopes = TelescopeNumber; - G4String DetectorNumber; - std::ostringstream Number; - Number << NbrTelescopes ; - DetectorNumber = Number.str(); + G4double NbrTelescopes = TelescopeNumber; + G4String DetectorNumber; + std::ostringstream Number; + Number << NbrTelescopes ; + DetectorNumber = Number.str(); + + //////////////////////////////////////////////////////////////// + ////////////// Starting Volume Definition ////////////////////// + //////////////////////////////////////////////////////////////// + G4Trd* solidMM = new G4Trd("MUST2Telescope" + DetectorNumber, 0.5*FaceFront, 0.5*FaceBack, 0.5*FaceFront, 0.5*FaceBack, 0.5*Length); + G4LogicalVolume* logicMM = new G4LogicalVolume(solidMM, m_MaterialIron, "MUST2Telescope" + DetectorNumber, 0, 0, 0); + G4String Name = "MUST2Telescope" + DetectorNumber ; -//////////////////////////////////////////////////////////////// -////////////// Starting Volume Definition ////////////////////// -//////////////////////////////////////////////////////////////// + new G4PVPlacement( G4Transform3D(*MMrot, MMpos), + logicMM , + Name , + world , + false , + 0 ); + if (m_non_sensitive_part_visiualisation){ + G4VisAttributes* FrameVisAtt = new G4VisAttributes(G4Colour(0.80, 0.80, 0.80)); + FrameVisAtt->SetForceWireframe(true); + logicMM->SetVisAttributes(FrameVisAtt) ; + } + else logicMM->SetVisAttributes(G4VisAttributes::Invisible) ; - G4Trd* solidMM = new G4Trd("MUST2Telescope" + DetectorNumber, 0.5*FaceFront, 0.5*FaceBack, 0.5*FaceFront, 0.5*FaceBack, 0.5*Length); - G4LogicalVolume* logicMM = new G4LogicalVolume(solidMM, m_MaterialIron, "MUST2Telescope" + DetectorNumber, 0, 0, 0); + G4ThreeVector positionVacBox = G4ThreeVector(0, 0, VacBox_PosZ); - G4String Name = "MUST2Telescope" + DetectorNumber ; + G4Trd* solidVacBox = new G4Trd("solidVacBox", 0.5*SiliconFace, 0.5*CsIFaceFront, 0.5*SiliconFace, 0.5*CsIFaceFront, 0.5*VacBoxThickness); + G4LogicalVolume* logicVacBox = new G4LogicalVolume(solidVacBox, m_MaterialVacuum, "logicVacBox", 0, 0, 0); - new G4PVPlacement( G4Transform3D(*MMrot, MMpos) , - logicMM , - Name , - world , - false , - 0 ); + 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)) ; + //////////////////////////////////////////////////////////////// + /////////////////Si Strip Construction////////////////////////// + //////////////////////////////////////////////////////////////// - if (m_non_sensitive_part_visiualisation) logicMM->SetVisAttributes(G4VisAttributes(G4Colour(0.90, 0.90, 0.90))) ; - else logicMM->SetVisAttributes(G4VisAttributes::Invisible) ; + if (wSi) { + G4ThreeVector positionAluStripFront = G4ThreeVector(0, 0, AluStripFront_PosZ); + G4ThreeVector positionAluStripBack = G4ThreeVector(0, 0, AluStripBack_PosZ); - G4ThreeVector positionVacBox = G4ThreeVector(0, 0, VacBox_PosZ); + G4Box* solidAluStrip = new G4Box("AluBox", 0.5*SiliconFace, 0.5*SiliconFace, 0.5*AluStripThickness); + G4LogicalVolume* logicAluStrip = new G4LogicalVolume(solidAluStrip, m_MaterialAluminium, "logicAluStrip", 0, 0, 0); - G4Trd* solidVacBox = new G4Trd("solidVacBox", 0.5*SiliconFace, 0.5*CsIFaceFront, 0.5*SiliconFace, 0.5*CsIFaceFront, 0.5*VacBoxThickness); - G4LogicalVolume* logicVacBox = new G4LogicalVolume(solidVacBox, m_MaterialVacuum, "logicVacBox", 0, 0, 0); + new G4PVPlacement(0, positionAluStripFront, logicAluStrip, Name + "_AluStripFront", logicMM, false, 0); + new G4PVPlacement(0, positionAluStripBack, logicAluStrip, Name + "_AluStripBack", logicMM, false, 0); - new G4PVPlacement(0, positionVacBox, logicVacBox, Name + "_VacBox", logicMM, false, 0); + logicAluStrip->SetVisAttributes(G4VisAttributes::Invisible); - logicVacBox->SetVisAttributes(G4VisAttributes::Invisible); + G4ThreeVector positionSilicon = G4ThreeVector(0, 0, Silicon_PosZ); -//////////////////////////////////////////////////////////////// -/////////////////Si Strip Construction////////////////////////// -//////////////////////////////////////////////////////////////// + G4Box* solidSilicon = new G4Box("solidSilicon", 0.5*SiliconFace, 0.5*SiliconFace, 0.5*SiliconThickness); + G4LogicalVolume* logicSilicon = new G4LogicalVolume(solidSilicon, m_MaterialSilicon, "logicSilicon", 0, 0, 0); - if (wSi) { - G4ThreeVector positionAluStripFront = G4ThreeVector(0, 0, AluStripFront_PosZ); - G4ThreeVector positionAluStripBack = G4ThreeVector(0, 0, AluStripBack_PosZ); + new G4PVPlacement(0, positionSilicon, logicSilicon, Name + "_Silicon", logicMM, false, 0); - G4Box* solidAluStrip = new G4Box("AluBox", 0.5*SiliconFace, 0.5*SiliconFace, 0.5*AluStripThickness); - G4LogicalVolume* logicAluStrip = new G4LogicalVolume(solidAluStrip, m_MaterialAluminium, "logicAluStrip", 0, 0, 0); - new G4PVPlacement(0, positionAluStripFront, logicAluStrip, Name + "_AluStripFront", logicMM, false, 0); - new G4PVPlacement(0, positionAluStripBack, logicAluStrip, Name + "_AluStripBack", logicMM, false, 0); + ///Set Silicon strip sensible + logicSilicon->SetSensitiveDetector(m_StripScorer); + + ///Visualisation of Silicon Strip + logicSilicon->SetVisAttributes(SiliconVisAtt) ; + } + + //////////////////////////////////////////////////////////////// + //////////////////// SiLi Construction //////////////////////// + //////////////////////////////////////////////////////////////// - logicAluStrip->SetVisAttributes(G4VisAttributes::Invisible); + if (wSiLi) { + G4double SiLiSpace = 8 * mm; + G4RotationMatrix* rotSiLi = new G4RotationMatrix(0,0,0); + G4Box* solidSiLi = new G4Box("SiLi", 0.5*SiliconFace+0.5*SiLiSpace, 0.5*SiliconFace, 0.5*SiLiThickness); + G4LogicalVolume* logicSiLi = new G4LogicalVolume(solidSiLi, m_MaterialAluminium, Name + "_SiLi" , 0, 0, 0); - G4ThreeVector positionSilicon = G4ThreeVector(0, 0, Silicon_PosZ); + logicSiLi->SetVisAttributes(G4VisAttributes::Invisible); - G4Box* solidSilicon = new G4Box("solidSilicon", 0.5*SiliconFace, 0.5*SiliconFace, 0.5*SiliconThickness); - G4LogicalVolume* logicSilicon = new G4LogicalVolume(solidSilicon, m_MaterialSilicon, "logicSilicon", 0, 0, 0); + new G4PVPlacement( G4Transform3D(*rotSiLi, G4ThreeVector(0,0,0) ) , + logicSiLi , + Name + "_SiLi", + logicVacBox , + false , + 0); - new G4PVPlacement(0, positionSilicon, logicSilicon, Name + "_Silicon", logicMM, false, 0); + // SiLi are placed inside of the VacBox... + // Left/Right define when looking to detector from Si to CsI + G4double SiLi_HighY_Upper = 19.86 * mm; + G4double SiLi_HighY_Center = 25.39 * mm; + G4double SiLi_WidthX_Left = 22.85 * mm; + G4double SiLi_WidthX_Right = 24.9 * mm; + G4double SiLi_ShiftX = 0.775 * mm; + // SiLi are organized by two group of 8 Up(9 to 15) and Down(1 to 8). + G4ThreeVector ShiftSiLiUp = G4ThreeVector(-0.25 * SiliconFace - 0.5 * SiLiSpace, 0, 0) ; + G4ThreeVector ShiftSiLiDown = G4ThreeVector(0.25 * SiliconFace + 0.5 * SiLiSpace, 0, 0) ; - ///Set Silicon strip sensible - logicSilicon->SetSensitiveDetector(m_StripScorer); + // SiLi : left side of SiLi detector + G4Box* solidSiLi_LT = new G4Box("SiLi_LT" , 0.5*SiLi_WidthX_Left , 0.5*SiLi_HighY_Upper , 0.5*SiLiThickness); + G4Box* solidSiLi_RT = new G4Box("SiLi_RT" , 0.5*SiLi_WidthX_Right , 0.5*SiLi_HighY_Upper , 0.5*SiLiThickness); + G4Box* solidSiLi_LC1 = new G4Box("SiLi_LC1" , 0.5*SiLi_WidthX_Left , 0.5*SiLi_HighY_Center , 0.5*SiLiThickness); + G4Box* solidSiLi_RC1 = new G4Box("SiLi_RC1" , 0.5*SiLi_WidthX_Right , 0.5*SiLi_HighY_Center , 0.5*SiLiThickness); + G4Box* solidSiLi_LB = new G4Box("SiLi_LB" , 0.5*SiLi_WidthX_Left , 0.5*SiLi_HighY_Upper , 0.5*SiLiThickness); + G4Box* solidSiLi_RB = new G4Box("SiLi_RB" , 0.5*SiLi_WidthX_Right , 0.5*SiLi_HighY_Upper , 0.5*SiLiThickness); + G4Box* solidSiLi_LC2 = new G4Box("SiLi_LC2" , 0.5*SiLi_WidthX_Left , 0.5*SiLi_HighY_Center , 0.5*SiLiThickness); + G4Box* solidSiLi_RC2 = new G4Box("SiLi_RC2" , 0.5*SiLi_WidthX_Right , 0.5*SiLi_HighY_Center , 0.5*SiLiThickness); - ///Visualisation of Silicon Strip - G4VisAttributes* SiliconVisAtt = new G4VisAttributes(G4Colour(0.5, 0.5, 0.5)) ; - logicSilicon->SetVisAttributes(SiliconVisAtt) ; - } + G4LogicalVolume* logicSiLi_LT = new G4LogicalVolume(solidSiLi_LT , m_MaterialSilicon , "SiLi_LT" , 0 , 0 , 0); + G4LogicalVolume* logicSiLi_RT = new G4LogicalVolume(solidSiLi_RT , m_MaterialSilicon , "SiLi_RT" , 0 , 0 , 0); + G4LogicalVolume* logicSiLi_LC1 = new G4LogicalVolume(solidSiLi_LC1 , m_MaterialSilicon , "SiLi_LC1" , 0 , 0 , 0); + G4LogicalVolume* logicSiLi_RC1 = new G4LogicalVolume(solidSiLi_RC1 , m_MaterialSilicon , "SiLi_RC1" , 0 , 0 , 0); + G4LogicalVolume* logicSiLi_LB = new G4LogicalVolume(solidSiLi_LB , m_MaterialSilicon , "SiLi_LB" , 0 , 0 , 0); + G4LogicalVolume* logicSiLi_RB = new G4LogicalVolume(solidSiLi_RB , m_MaterialSilicon , "SiLi_RB" , 0 , 0 , 0); + G4LogicalVolume* logicSiLi_LC2 = new G4LogicalVolume(solidSiLi_LC2 , m_MaterialSilicon , "SiLi_LC2" , 0 , 0 , 0); + G4LogicalVolume* logicSiLi_RC2 = new G4LogicalVolume(solidSiLi_RC2 , m_MaterialSilicon , "SiLi_RC2" , 0 , 0 , 0); -//////////////////////////////////////////////////////////////// -//////////////////// SiLi Construction //////////////////////// -//////////////////////////////////////////////////////////////// + G4double interSiLi = 0.5 * mm; - if (wSiLi) { - G4double SiLiSpace = 8 * mm; + // Top + G4ThreeVector positionSiLi_LT_up = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX , + 0.5 * SiLi_HighY_Upper + SiLi_HighY_Center + 1.5 * interSiLi, + 0); - G4RotationMatrix* rotSiLi = new G4RotationMatrix(0,0,0); + positionSiLi_LT_up += ShiftSiLiUp ; - // G4Box* solidSiLi = new G4Box("SiLi", 0.5*SiLiFaceX, 0.5*SiLiFaceY, 0.5*SiLiThickness); - - G4Box* solidSiLi = new G4Box("SiLi", 0.5*SiliconFace+0.5*SiLiSpace, 0.5*SiliconFace, 0.5*SiLiThickness); - - G4LogicalVolume* logicSiLi = new G4LogicalVolume(solidSiLi, m_MaterialAluminium, Name + "_SiLi" , 0, 0, 0); - - new G4PVPlacement( G4Transform3D(*rotSiLi, G4ThreeVector(0,0,0) ) , - logicSiLi , - Name + "_SiLi", - logicVacBox , - false , - 0); - - // SiLi are placed inside of the VacBox... - // Left/Right define when looking to detector from Si to CsI - G4double SiLi_HighY_Upper = 19.86 * mm; - G4double SiLi_HighY_Center = 25.39 * mm; - G4double SiLi_WidthX_Left = 22.85 * mm; - G4double SiLi_WidthX_Right = 24.9 * mm; - G4double SiLi_ShiftX = 0.775 * mm; - - // SiLi are organized by two group of 8 Up(9 to 15) and Down(1 to 8). - G4ThreeVector ShiftSiLiUp = G4ThreeVector(-0.25 * SiliconFace - 0.5 * SiLiSpace, 0, 0) ; - G4ThreeVector ShiftSiLiDown = G4ThreeVector(0.25 * SiliconFace + 0.5 * SiLiSpace, 0, 0) ; - - // SiLi : left side of SiLi detector - G4Box* solidSiLi_LT = new G4Box("SiLi_LT" , 0.5*SiLi_WidthX_Left , 0.5*SiLi_HighY_Upper , 0.5*SiLiThickness); - G4Box* solidSiLi_RT = new G4Box("SiLi_RT" , 0.5*SiLi_WidthX_Right , 0.5*SiLi_HighY_Upper , 0.5*SiLiThickness); - G4Box* solidSiLi_LC1 = new G4Box("SiLi_LC1" , 0.5*SiLi_WidthX_Left , 0.5*SiLi_HighY_Center , 0.5*SiLiThickness); - G4Box* solidSiLi_RC1 = new G4Box("SiLi_RC1" , 0.5*SiLi_WidthX_Right , 0.5*SiLi_HighY_Center , 0.5*SiLiThickness); - G4Box* solidSiLi_LB = new G4Box("SiLi_LB" , 0.5*SiLi_WidthX_Left , 0.5*SiLi_HighY_Upper , 0.5*SiLiThickness); - G4Box* solidSiLi_RB = new G4Box("SiLi_RB" , 0.5*SiLi_WidthX_Right , 0.5*SiLi_HighY_Upper , 0.5*SiLiThickness); - G4Box* solidSiLi_LC2 = new G4Box("SiLi_LC2" , 0.5*SiLi_WidthX_Left , 0.5*SiLi_HighY_Center , 0.5*SiLiThickness); - G4Box* solidSiLi_RC2 = new G4Box("SiLi_RC2" , 0.5*SiLi_WidthX_Right , 0.5*SiLi_HighY_Center , 0.5*SiLiThickness); - - G4LogicalVolume* logicSiLi_LT = new G4LogicalVolume(solidSiLi_LT , m_MaterialSilicon , "SiLi_LT" , 0 , 0 , 0); - G4LogicalVolume* logicSiLi_RT = new G4LogicalVolume(solidSiLi_RT , m_MaterialSilicon , "SiLi_RT" , 0 , 0 , 0); - G4LogicalVolume* logicSiLi_LC1 = new G4LogicalVolume(solidSiLi_LC1 , m_MaterialSilicon , "SiLi_LC1" , 0 , 0 , 0); - G4LogicalVolume* logicSiLi_RC1 = new G4LogicalVolume(solidSiLi_RC1 , m_MaterialSilicon , "SiLi_RC1" , 0 , 0 , 0); - G4LogicalVolume* logicSiLi_LB = new G4LogicalVolume(solidSiLi_LB , m_MaterialSilicon , "SiLi_LB" , 0 , 0 , 0); - G4LogicalVolume* logicSiLi_RB = new G4LogicalVolume(solidSiLi_RB , m_MaterialSilicon , "SiLi_RB" , 0 , 0 , 0); - G4LogicalVolume* logicSiLi_LC2 = new G4LogicalVolume(solidSiLi_LC2 , m_MaterialSilicon , "SiLi_LC2" , 0 , 0 , 0); - G4LogicalVolume* logicSiLi_RC2 = new G4LogicalVolume(solidSiLi_RC2 , m_MaterialSilicon , "SiLi_RC2" , 0 , 0 , 0); - - G4double interSiLi = 0.5 * mm; - - // Top - G4ThreeVector positionSiLi_LT_up = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX , - 0.5 * SiLi_HighY_Upper + SiLi_HighY_Center + 1.5 * interSiLi, - 0); - - positionSiLi_LT_up += ShiftSiLiUp ; - - G4ThreeVector positionSiLi_RT_up = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, - 0.5 * SiLi_HighY_Upper + SiLi_HighY_Center + 1.5 * interSiLi, - 0); - - positionSiLi_RT_up += ShiftSiLiUp ; - - G4ThreeVector positionSiLi_LC1_up = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX , - 0.5 * SiLi_HighY_Center + 0.5 * interSiLi, - 0); - - positionSiLi_LC1_up += ShiftSiLiUp ; - - G4ThreeVector positionSiLi_RC1_up = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, - 0.5 * SiLi_HighY_Center + 0.5 * interSiLi, - 0); - - positionSiLi_RC1_up += ShiftSiLiUp ; - - G4ThreeVector positionSiLi_LB_up = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX , - -0.5 * SiLi_HighY_Upper - SiLi_HighY_Center - 1.5 * interSiLi , - 0); - - positionSiLi_LB_up += ShiftSiLiUp ; - - G4ThreeVector positionSiLi_RB_up = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX , - -0.5 * SiLi_HighY_Upper - SiLi_HighY_Center - 1.5 * interSiLi , - 0); - - positionSiLi_RB_up += ShiftSiLiUp ; - - G4ThreeVector positionSiLi_LC2_up = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX , - -0.5 * SiLi_HighY_Center - 0.5 * interSiLi, - 0); - - positionSiLi_LC2_up += ShiftSiLiUp ; - - G4ThreeVector positionSiLi_RC2_up = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX , - -0.5 * SiLi_HighY_Center - 0.5 * interSiLi , - 0); - - positionSiLi_RC2_up += ShiftSiLiUp ; - - - // Down - G4ThreeVector positionSiLi_LT_down = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX, - 0.5 * SiLi_HighY_Upper + SiLi_HighY_Center + 1.5 * interSiLi, - 0); - - positionSiLi_LT_down += ShiftSiLiDown ; - - G4ThreeVector positionSiLi_RT_down = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, - 0.5 * SiLi_HighY_Upper + SiLi_HighY_Center + 1.5 * interSiLi, - 0); - - positionSiLi_RT_down += ShiftSiLiDown ; - - G4ThreeVector positionSiLi_LC1_down = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX, - 0.5 * SiLi_HighY_Center + 0.5 * interSiLi, - 0); - - positionSiLi_LC1_down += ShiftSiLiDown ; - - G4ThreeVector positionSiLi_RC1_down = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, - 0.5 * SiLi_HighY_Center + 0.5 * interSiLi , - 0); + G4ThreeVector positionSiLi_RT_up = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, + 0.5 * SiLi_HighY_Upper + SiLi_HighY_Center + 1.5 * interSiLi, + 0); + + positionSiLi_RT_up += ShiftSiLiUp ; + + G4ThreeVector positionSiLi_LC1_up = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX , + 0.5 * SiLi_HighY_Center + 0.5 * interSiLi, + 0); + + positionSiLi_LC1_up += ShiftSiLiUp ; + + G4ThreeVector positionSiLi_RC1_up = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, + 0.5 * SiLi_HighY_Center + 0.5 * interSiLi, + 0); + + positionSiLi_RC1_up += ShiftSiLiUp ; + + G4ThreeVector positionSiLi_LB_up = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX , + -0.5 * SiLi_HighY_Upper - SiLi_HighY_Center - 1.5 * interSiLi , + 0); + + positionSiLi_LB_up += ShiftSiLiUp ; + + G4ThreeVector positionSiLi_RB_up = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX , + -0.5 * SiLi_HighY_Upper - SiLi_HighY_Center - 1.5 * interSiLi , + 0); + + positionSiLi_RB_up += ShiftSiLiUp ; + + G4ThreeVector positionSiLi_LC2_up = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX , + -0.5 * SiLi_HighY_Center - 0.5 * interSiLi, + 0); + + positionSiLi_LC2_up += ShiftSiLiUp ; + + G4ThreeVector positionSiLi_RC2_up = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX , + -0.5 * SiLi_HighY_Center - 0.5 * interSiLi , + 0); + + positionSiLi_RC2_up += ShiftSiLiUp ; + + + // Down + G4ThreeVector positionSiLi_LT_down = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX, + 0.5 * SiLi_HighY_Upper + SiLi_HighY_Center + 1.5 * interSiLi, + 0); + + positionSiLi_LT_down += ShiftSiLiDown ; - positionSiLi_RC1_down += ShiftSiLiDown ; + G4ThreeVector positionSiLi_RT_down = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, + 0.5 * SiLi_HighY_Upper + SiLi_HighY_Center + 1.5 * interSiLi, + 0); - G4ThreeVector positionSiLi_LB_down = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX, - -0.5 * SiLi_HighY_Upper - SiLi_HighY_Center - 1.5 * interSiLi, - 0); + positionSiLi_RT_down += ShiftSiLiDown ; - positionSiLi_LB_down += ShiftSiLiDown ; + G4ThreeVector positionSiLi_LC1_down = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX, + 0.5 * SiLi_HighY_Center + 0.5 * interSiLi, + 0); - G4ThreeVector positionSiLi_RB_down = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, - -0.5 * SiLi_HighY_Upper - SiLi_HighY_Center - 1.5 * interSiLi, - 0); + positionSiLi_LC1_down += ShiftSiLiDown ; - positionSiLi_RB_down += ShiftSiLiDown ; + G4ThreeVector positionSiLi_RC1_down = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, + 0.5 * SiLi_HighY_Center + 0.5 * interSiLi , + 0); - G4ThreeVector positionSiLi_LC2_down = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX, - -0.5 * SiLi_HighY_Center - 0.5 * interSiLi, - 0); + positionSiLi_RC1_down += ShiftSiLiDown ; - positionSiLi_LC2_down += ShiftSiLiDown ; + G4ThreeVector positionSiLi_LB_down = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX, + -0.5 * SiLi_HighY_Upper - SiLi_HighY_Center - 1.5 * interSiLi, + 0); - G4ThreeVector positionSiLi_RC2_down = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, - -0.5 * SiLi_HighY_Center - 0.5 * interSiLi, - 0); - - positionSiLi_RC2_down += ShiftSiLiDown ; - - - // up - new G4PVPlacement(0 , positionSiLi_LT_up , logicSiLi_LT , Name + "_SiLi_Pad9" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_RT_up , logicSiLi_RT , Name + "_SiLi_Pad10" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_LC1_up , logicSiLi_LC1 , Name + "_SiLi_Pad11" , logicSiLi , false , 0); - new G4PVPlacement(0 , positionSiLi_RC1_up , logicSiLi_RC1 , Name + "_SiLi_Pad12" , logicSiLi , false , 0); + positionSiLi_LB_down += ShiftSiLiDown ; - new G4PVPlacement(0 , positionSiLi_LB_up , logicSiLi_LB , Name + "_SiLi_Pad16" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_RB_up , logicSiLi_RB , Name + "_SiLi_Pad15" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_LC2_up , logicSiLi_LC2 , Name + "_SiLi_Pad14" , logicSiLi , false , 0); - new G4PVPlacement(0 , positionSiLi_RC2_up , logicSiLi_RC2 , Name + "_SiLi_Pad13" , logicSiLi , false , 0); + G4ThreeVector positionSiLi_RB_down = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, + -0.5 * SiLi_HighY_Upper - SiLi_HighY_Center - 1.5 * interSiLi, + 0); - - // down - new G4PVPlacement(0 , positionSiLi_LT_down , logicSiLi_LT , Name + "_SiLi_Pad2" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_RT_down , logicSiLi_RT , Name + "_SiLi_Pad1" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_LC1_down , logicSiLi_LC1 , Name + "_SiLi_Pad4" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_RC1_down , logicSiLi_RC1 , Name + "_SiLi_Pad3" , logicSiLi , false , 0) ; + positionSiLi_RB_down += ShiftSiLiDown ; - new G4PVPlacement(0 , positionSiLi_LB_down , logicSiLi_LB , Name + "_SiLi_Pad7" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_RB_down , logicSiLi_RB , Name + "_SiLi_Pad8" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_LC2_down , logicSiLi_LC2 , Name + "_SiLi_Pad5" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_RC2_down , logicSiLi_RC2 , Name + "_SiLi_Pad6" , logicSiLi , false , 0) ; + G4ThreeVector positionSiLi_LC2_down = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX, + -0.5 * SiLi_HighY_Center - 0.5 * interSiLi, + 0); + positionSiLi_LC2_down += ShiftSiLiDown ; + G4ThreeVector positionSiLi_RC2_down = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, + -0.5 * SiLi_HighY_Center - 0.5 * interSiLi, + 0); - logicSiLi->SetVisAttributes(G4VisAttributes(G4Colour(1, 1., 1.))); + positionSiLi_RC2_down += ShiftSiLiDown ; - // Set SiLi sensible - logicSiLi_LT->SetSensitiveDetector(m_SiLiScorer); - logicSiLi_RT->SetSensitiveDetector(m_SiLiScorer); - logicSiLi_LC1->SetSensitiveDetector(m_SiLiScorer); - logicSiLi_RC1->SetSensitiveDetector(m_SiLiScorer); - logicSiLi_LB->SetSensitiveDetector(m_SiLiScorer); - logicSiLi_RB->SetSensitiveDetector(m_SiLiScorer); - logicSiLi_LC2->SetSensitiveDetector(m_SiLiScorer); - logicSiLi_RC2->SetSensitiveDetector(m_SiLiScorer); + // up + new G4PVPlacement(0 , positionSiLi_LT_up , logicSiLi_LT , Name + "_SiLi_Pad9" , logicSiLi , false , 0) ; + new G4PVPlacement(0 , positionSiLi_RT_up , logicSiLi_RT , Name + "_SiLi_Pad10" , logicSiLi , false , 0) ; + new G4PVPlacement(0 , positionSiLi_LC1_up , logicSiLi_LC1 , Name + "_SiLi_Pad11" , logicSiLi , false , 0); + new G4PVPlacement(0 , positionSiLi_RC1_up , logicSiLi_RC1 , Name + "_SiLi_Pad12" , logicSiLi , false , 0); - // Mark blue a SiLi to see telescope orientation - logicSiLi_LT->SetVisAttributes(G4VisAttributes(G4Colour(0, 1., 0))); - logicSiLi_RT->SetVisAttributes(G4VisAttributes(G4Colour(0, 1., 0))); - logicSiLi_LC1->SetVisAttributes(G4VisAttributes(G4Colour(0, 1., 0))); - logicSiLi_RC1->SetVisAttributes(G4VisAttributes(G4Colour(0, 1., 0))); + new G4PVPlacement(0 , positionSiLi_LB_up , logicSiLi_LB , Name + "_SiLi_Pad16" , logicSiLi , false , 0) ; + new G4PVPlacement(0 , positionSiLi_RB_up , logicSiLi_RB , Name + "_SiLi_Pad15" , logicSiLi , false , 0) ; + new G4PVPlacement(0 , positionSiLi_LC2_up , logicSiLi_LC2 , Name + "_SiLi_Pad14" , logicSiLi , false , 0); + new G4PVPlacement(0 , positionSiLi_RC2_up , logicSiLi_RC2 , Name + "_SiLi_Pad13" , logicSiLi , false , 0); - logicSiLi_LB->SetVisAttributes(G4VisAttributes(G4Colour(0, 0, 1.))); - logicSiLi_RB->SetVisAttributes(G4VisAttributes(G4Colour(0, 1., 0))); - logicSiLi_LC2->SetVisAttributes(G4VisAttributes(G4Colour(0, 1., 0))); - logicSiLi_RC2->SetVisAttributes(G4VisAttributes(G4Colour(0, 1., 0))); - - - delete rotSiLi; - } -//////////////////////////////////////////////////////////////// -//////////////////// CsI Construction////////////////////////// -//////////////////////////////////////////////////////////////// + // down + new G4PVPlacement(0 , positionSiLi_LT_down , logicSiLi_LT , Name + "_SiLi_Pad2" , logicSiLi , false , 0) ; + new G4PVPlacement(0 , positionSiLi_RT_down , logicSiLi_RT , Name + "_SiLi_Pad1" , logicSiLi , false , 0) ; + new G4PVPlacement(0 , positionSiLi_LC1_down , logicSiLi_LC1 , Name + "_SiLi_Pad4" , logicSiLi , false , 0) ; + new G4PVPlacement(0 , positionSiLi_RC1_down , logicSiLi_RC1 , Name + "_SiLi_Pad3" , logicSiLi , false , 0) ; - if (wCsI) { - - G4ThreeVector positionCsI = G4ThreeVector(0, 0, CsI_PosZ); - G4Trd* solidCsI = new G4Trd("csI", 0.5*CsIFaceFront, 0.5*CsIFaceBack, 0.5*CsIFaceFront, 0.5*CsIFaceBack, 0.5*CsIThickness); + new G4PVPlacement(0 , positionSiLi_LB_down , logicSiLi_LB , Name + "_SiLi_Pad7" , logicSiLi , false , 0) ; + new G4PVPlacement(0 , positionSiLi_RB_down , logicSiLi_RB , Name + "_SiLi_Pad8" , logicSiLi , false , 0) ; + new G4PVPlacement(0 , positionSiLi_LC2_down , logicSiLi_LC2 , Name + "_SiLi_Pad5" , logicSiLi , false , 0) ; + new G4PVPlacement(0 , positionSiLi_RC2_down , logicSiLi_RC2 , Name + "_SiLi_Pad6" , logicSiLi , false , 0) ; - G4LogicalVolume* logicCsI = new G4LogicalVolume(solidCsI, m_MaterialAluminium, Name + "_CsI_Mylar", 0, 0, 0); - new G4PVPlacement(0, positionCsI, logicCsI, Name + "_CsI_Mylar", logicMM, false, 0); + // Set SiLi sensible + logicSiLi_LT->SetSensitiveDetector(m_SiLiScorer); + logicSiLi_RT->SetSensitiveDetector(m_SiLiScorer); + logicSiLi_LC1->SetSensitiveDetector(m_SiLiScorer); + logicSiLi_RC1->SetSensitiveDetector(m_SiLiScorer); - G4ThreeVector positionMylarCsI = G4ThreeVector(0, 0, MylarCsIThickness * 0.5 - CsIThickness * 0.5); + logicSiLi_LB->SetSensitiveDetector(m_SiLiScorer); + logicSiLi_RB->SetSensitiveDetector(m_SiLiScorer); + logicSiLi_LC2->SetSensitiveDetector(m_SiLiScorer); + logicSiLi_RC2->SetSensitiveDetector(m_SiLiScorer); - G4Box* solidMylarCsI = new G4Box("MylarCsIBox", 0.5*CsIFaceFront, 0.5*CsIFaceFront, 0.5*MylarCsIThickness); - G4LogicalVolume* logicMylarCsI = new G4LogicalVolume(solidMylarCsI, m_MaterialMyl, Name + "_CsI_Mylar", 0, 0, 0); + // Mark blue a SiLi to see telescope orientation + G4VisAttributes* SiLiVisAtt = new G4VisAttributes(G4Colour(0.3, 1, 0.3)); - new G4PVPlacement(0, positionMylarCsI, logicMylarCsI, Name + "_CsI_Mylar", logicCsI, false, 0); + logicSiLi_LT->SetVisAttributes(SiLiVisAtt); + logicSiLi_RT->SetVisAttributes(SiLiVisAtt); + logicSiLi_LC1->SetVisAttributes(SiLiVisAtt); + logicSiLi_RC1->SetVisAttributes(SiLiVisAtt); + logicSiLi_LB->SetVisAttributes(SiLiVisAtt); + logicSiLi_RB->SetVisAttributes(SiLiVisAtt); + logicSiLi_LC2->SetVisAttributes(SiLiVisAtt); + logicSiLi_RC2->SetVisAttributes(SiLiVisAtt); - logicCsI->SetVisAttributes(G4VisAttributes::Invisible); - logicMylarCsI->SetVisAttributes(G4VisAttributes::Invisible); - // Cristal1 - G4Trap* solidCristal1 = new G4Trap("Cristal1", 40.*mm / 2., 6.693896*deg, 41.97814*deg, 33.1*mm / 2., 37.39*mm / 2., 37.39*mm / 2., 0.*deg, 26.9*mm / 2., 30.41*mm / 2., 30.41*mm / 2., 0.*deg); - G4LogicalVolume* logicCristal1 = new G4LogicalVolume(solidCristal1, m_MaterialCsI, Name + "_CsI_Cristal1", 0, 0, 0); + delete rotSiLi; + } - // Cristal2 - G4Trap* solidCristal2 = new G4Trap("Cristal2", 40.*mm / 2., 17.8836*deg, (74.3122 + 180)*deg, 43.49*mm / 2., 37.39*mm / 2., 37.39*mm / 2., 0.*deg, 31.0377*mm / 2., 30.41*mm / 2., 30.41*mm / 2., 0.*deg); - G4LogicalVolume* logicCristal2 = new G4LogicalVolume(solidCristal2, m_MaterialCsI, Name + "_CsI_Cristal2", 0, 0, 0); + //////////////////////////////////////////////////////////////// + //////////////////// CsI Construction////////////////////////// + //////////////////////////////////////////////////////////////// - // Cristal3 - G4Trap* solidCristal3 = new G4Trap("Cristal3", 40.*mm / 2., 18.243*deg, 13.5988*deg, 33.11*mm / 2., 39.25*mm / 2., 39.25*mm / 2., 0.*deg, 26.91*mm / 2., 27.58*mm / 2., 27.58*mm / 2., 0.*deg); - G4LogicalVolume* logicCristal3 = new G4LogicalVolume(solidCristal3, m_MaterialCsI, Name + "_CsI_Cristal3", 0, 0, 0); + if (wCsI) { - // Cristal4 + G4ThreeVector positionCsI = G4ThreeVector(0, 0, CsI_PosZ); + G4Trd* solidCsI = new G4Trd("csI", 0.5*CsIFaceFront, 0.5*CsIFaceBack, 0.5*CsIFaceFront, 0.5*CsIFaceBack, 0.5*CsIThickness); - G4Trap* solidCristal4 = new G4Trap("Cristal4", 40.*mm / 2., 24.0482*deg, 44.1148*deg, 43.49*mm / 2., 39.19*mm / 2., 39.19*mm / 2., 0.*deg, 31.04*mm / 2., 27.52*mm / 2., 27.52*mm / 2., 0.*deg); - G4LogicalVolume* logicCristal4 = new G4LogicalVolume(solidCristal4, m_MaterialCsI, Name + "_CsI_Cristal4", 0, 0, 0); + G4LogicalVolume* logicCsI = new G4LogicalVolume(solidCsI, m_MaterialAluminium, Name + "_CsI_Mylar", 0, 0, 0); + new G4PVPlacement(0, positionCsI, logicCsI, Name + "_CsI_Mylar", logicMM, false, 0); + G4ThreeVector positionMylarCsI = G4ThreeVector(0, 0, MylarCsIThickness * 0.5 - CsIThickness * 0.5); - // Cristal1s + G4Box* solidMylarCsI = new G4Box("MylarCsIBox", 0.5*CsIFaceFront, 0.5*CsIFaceFront, 0.5*MylarCsIThickness); + G4LogicalVolume* logicMylarCsI = new G4LogicalVolume(solidMylarCsI, m_MaterialMyl, Name + "_CsI_Mylar", 0, 0, 0); - G4Trap* solidCristal1s = new G4Trap("Cristal1s", 40.*mm / 2., 6.693896*deg, -41.97814*deg, 33.1*mm / 2., 37.39*mm / 2., 37.39*mm / 2., 0.*deg, 26.9*mm / 2., 30.41*mm / 2., 30.41*mm / 2., 0.*deg); - G4LogicalVolume* logicCristal1s = new G4LogicalVolume(solidCristal1s, m_MaterialCsI, Name + "_CsI_Cristal1s", 0, 0, 0); + new G4PVPlacement(0, positionMylarCsI, logicMylarCsI, Name + "_CsI_Mylar", logicCsI, false, 0); - // Cristal2s - G4Trap* solidCristal2s = new G4Trap("Cristal2s", 40.*mm / 2., 17.8836*deg, -(74.3122 + 180)*deg, 43.49*mm / 2., 37.39*mm / 2., 37.39*mm / 2., 0.*deg, 31.0377*mm / 2., 30.41*mm / 2., 30.41*mm / 2., 0.*deg); - G4LogicalVolume* logicCristal2s = new G4LogicalVolume(solidCristal2s, m_MaterialCsI, Name + "_CsI_Cristal2s", 0, 0, 0); + logicCsI->SetVisAttributes(G4VisAttributes::Invisible); + logicMylarCsI->SetVisAttributes(G4VisAttributes::Invisible); - // Cristal3s + // Cristal1 + G4Trap* solidCristal1 = new G4Trap("Cristal1", 40.*mm / 2., 6.693896*deg, 41.97814*deg, 33.1*mm / 2., 37.39*mm / 2., 37.39*mm / 2., 0.*deg, 26.9*mm / 2., 30.41*mm / 2., 30.41*mm / 2., 0.*deg); + G4LogicalVolume* logicCristal1 = new G4LogicalVolume(solidCristal1, m_MaterialCsI, Name + "_CsI_Cristal1", 0, 0, 0); - G4Trap* solidCristal3s = new G4Trap("Cristal3s", 40.*mm / 2., 18.243*deg, -13.5988*deg, 33.11*mm / 2., 39.25*mm / 2., 39.25*mm / 2., 0.*deg, 26.91*mm / 2., 27.58*mm / 2., 27.58*mm / 2., 0.*deg); - G4LogicalVolume* logicCristal3s = new G4LogicalVolume(solidCristal3s, m_MaterialCsI, Name + "_CsI_Cristal3s", 0, 0, 0); + // Cristal2 + G4Trap* solidCristal2 = new G4Trap("Cristal2", 40.*mm / 2., 17.8836*deg, (74.3122 + 180)*deg, 43.49*mm / 2., 37.39*mm / 2., 37.39*mm / 2., 0.*deg, 31.0377*mm / 2., 30.41*mm / 2., 30.41*mm / 2., 0.*deg); + G4LogicalVolume* logicCristal2 = new G4LogicalVolume(solidCristal2, m_MaterialCsI, Name + "_CsI_Cristal2", 0, 0, 0); - // Cristal4s + // Cristal3 + G4Trap* solidCristal3 = new G4Trap("Cristal3", 40.*mm / 2., 18.243*deg, 13.5988*deg, 33.11*mm / 2., 39.25*mm / 2., 39.25*mm / 2., 0.*deg, 26.91*mm / 2., 27.58*mm / 2., 27.58*mm / 2., 0.*deg); + G4LogicalVolume* logicCristal3 = new G4LogicalVolume(solidCristal3, m_MaterialCsI, Name + "_CsI_Cristal3", 0, 0, 0); - G4Trap* solidCristal4s = new G4Trap("Cristal4s", 40.*mm / 2., 24.0482*deg, -44.1148*deg, 43.49*mm / 2., 39.19*mm / 2., 39.19*mm / 2., 0.*deg, 31.04*mm / 2., 27.52*mm / 2., 27.52*mm / 2., 0.*deg); - G4LogicalVolume* logicCristal4s = new G4LogicalVolume(solidCristal4s, m_MaterialCsI, Name + "_CsI_Cristal4s", 0, 0, 0); - //to see telescope orientation - G4LogicalVolume* logicCristal4sbis = new G4LogicalVolume(solidCristal4s, m_MaterialCsI, Name + "_CsI_Cristal4s", 0, 0, 0); + // Cristal4 + G4Trap* solidCristal4 = new G4Trap("Cristal4", 40.*mm / 2., 24.0482*deg, 44.1148*deg, 43.49*mm / 2., 39.19*mm / 2., 39.19*mm / 2., 0.*deg, 31.04*mm / 2., 27.52*mm / 2., 27.52*mm / 2., 0.*deg); + G4LogicalVolume* logicCristal4 = new G4LogicalVolume(solidCristal4, m_MaterialCsI, Name + "_CsI_Cristal4", 0, 0, 0); - G4double XEdge1 = 16.96 * mm + DistInterCsI * 0.5; - G4double YEdge1 = 15.01 * mm + DistInterCsI * 0.5; - G4double XEdge2 = 50.63 * mm + DistInterCsI * 1.5; - G4double YEdge2 = 48.67 * mm + DistInterCsI * 1.5; - G4ThreeVector positionCristal1 = G4ThreeVector(-XEdge1, YEdge1, 0 * mm); - G4ThreeVector positionCristal2 = G4ThreeVector(-XEdge1, YEdge2, 0); - G4ThreeVector positionCristal3 = G4ThreeVector(-XEdge2, YEdge1, 0); - G4ThreeVector positionCristal4 = G4ThreeVector(-XEdge2, YEdge2, 0); + // Cristal1s - new G4PVPlacement(Rotation(180., 0., 0.), positionCristal1, logicCristal1, Name + "_CsI_Cristal1", logicCsI, false, 1); - new G4PVPlacement(Rotation(180., 0., 180.), positionCristal2, logicCristal2, Name + "_CsI_Cristal2", logicCsI, false, 2); - new G4PVPlacement(Rotation(180., 0., 0.), positionCristal3, logicCristal3, Name + "_CsI_Cristal3", logicCsI, false, 3); - new G4PVPlacement(Rotation(180., 0., 0.), positionCristal4, logicCristal4, Name + "_CsI_Cristal4", logicCsI, false, 4); + G4Trap* solidCristal1s = new G4Trap("Cristal1s", 40.*mm / 2., 6.693896*deg, -41.97814*deg, 33.1*mm / 2., 37.39*mm / 2., 37.39*mm / 2., 0.*deg, 26.9*mm / 2., 30.41*mm / 2., 30.41*mm / 2., 0.*deg); + G4LogicalVolume* logicCristal1s = new G4LogicalVolume(solidCristal1s, m_MaterialCsI, Name + "_CsI_Cristal1s", 0, 0, 0); + // Cristal2s - G4ThreeVector positionCristal1b = G4ThreeVector(XEdge1, -YEdge1, 0 * mm); - G4ThreeVector positionCristal2b = G4ThreeVector(XEdge1, -YEdge2, 0); - G4ThreeVector positionCristal3b = G4ThreeVector(XEdge2, -YEdge1, 0); - G4ThreeVector positionCristal4b = G4ThreeVector(XEdge2, -YEdge2, 0); + G4Trap* solidCristal2s = new G4Trap("Cristal2s", 40.*mm / 2., 17.8836*deg, -(74.3122 + 180)*deg, 43.49*mm / 2., 37.39*mm / 2., 37.39*mm / 2., 0.*deg, 31.0377*mm / 2., 30.41*mm / 2., 30.41*mm / 2., 0.*deg); + G4LogicalVolume* logicCristal2s = new G4LogicalVolume(solidCristal2s, m_MaterialCsI, Name + "_CsI_Cristal2s", 0, 0, 0); - new G4PVPlacement(Rotation(180., 0., 180.), positionCristal1b, logicCristal1, Name + "_CsI_Cristal5", logicCsI, false, 5); - new G4PVPlacement(Rotation(180., 0., 0.), positionCristal2b, logicCristal2, Name + "_CsI_Cristal6", logicCsI, false, 6); - new G4PVPlacement(Rotation(180., 0., 180.), positionCristal3b, logicCristal3, Name + "_CsI_Cristal7", logicCsI, false, 7); - new G4PVPlacement(Rotation(180., 0., 180.), positionCristal4b, logicCristal4, Name + "_CsI_Cristal8", logicCsI, false, 8); + // Cristal3s - G4ThreeVector positionCristal1s = G4ThreeVector(-XEdge1, -YEdge1, 0 * mm); - G4ThreeVector positionCristal2s = G4ThreeVector(-XEdge1, -YEdge2, 0); - G4ThreeVector positionCristal3s = G4ThreeVector(-XEdge2, -YEdge1, 0); - G4ThreeVector positionCristal4s = G4ThreeVector(-XEdge2, -YEdge2, 0); + G4Trap* solidCristal3s = new G4Trap("Cristal3s", 40.*mm / 2., 18.243*deg, -13.5988*deg, 33.11*mm / 2., 39.25*mm / 2., 39.25*mm / 2., 0.*deg, 26.91*mm / 2., 27.58*mm / 2., 27.58*mm / 2., 0.*deg); + G4LogicalVolume* logicCristal3s = new G4LogicalVolume(solidCristal3s, m_MaterialCsI, Name + "_CsI_Cristal3s", 0, 0, 0); - new G4PVPlacement(Rotation(180., 0., 0.), positionCristal1s, logicCristal1s, Name + "_CsI_Cristal9", logicCsI, false, 9); - new G4PVPlacement(Rotation(180., 0., 180.), positionCristal2s, logicCristal2s, Name + "_CsI_Cristal10", logicCsI, false, 10); - new G4PVPlacement(Rotation(180., 0., 0.), positionCristal3s, logicCristal3s, Name + "_CsI_Cristal11", logicCsI, false, 11); - new G4PVPlacement(Rotation(180., 0., 0.), positionCristal4s, logicCristal4sbis, Name + "_CsI_Cristal12", logicCsI, false, 12); + // Cristal4s - G4ThreeVector positionCristal1sb = G4ThreeVector(XEdge1, YEdge1, 0 * mm); - G4ThreeVector positionCristal2sb = G4ThreeVector(XEdge1, YEdge2, 0); - G4ThreeVector positionCristal3sb = G4ThreeVector(XEdge2, YEdge1, 0); - G4ThreeVector positionCristal4sb = G4ThreeVector(XEdge2, YEdge2, 0); + G4Trap* solidCristal4s = new G4Trap("Cristal4s", 40.*mm / 2., 24.0482*deg, -44.1148*deg, 43.49*mm / 2., 39.19*mm / 2., 39.19*mm / 2., 0.*deg, 31.04*mm / 2., 27.52*mm / 2., 27.52*mm / 2., 0.*deg); + G4LogicalVolume* logicCristal4s = new G4LogicalVolume(solidCristal4s, m_MaterialCsI, Name + "_CsI_Cristal4s", 0, 0, 0); - new G4PVPlacement(Rotation(180., 0., 180.), positionCristal1sb, logicCristal1s, Name + "_CsI_Cristal13", logicCsI, false, 13); - new G4PVPlacement(Rotation(180, 0, 0), positionCristal2sb, logicCristal2s, Name + "_CsI_Cristal14", logicCsI, false, 14); - new G4PVPlacement(Rotation(180., 0., 180.), positionCristal3sb, logicCristal3s, Name + "_CsI_Cristal15", logicCsI, false, 15); - new G4PVPlacement(Rotation(180., 0., 180.), positionCristal4sb, logicCristal4s, Name + "_CsI_Cristal16", logicCsI, false, 16); + G4double XEdge1 = 16.96 * mm + DistInterCsI * 0.5; + G4double YEdge1 = 15.01 * mm + DistInterCsI * 0.5; + G4double XEdge2 = 50.63 * mm + DistInterCsI * 1.5; + G4double YEdge2 = 48.67 * mm + DistInterCsI * 1.5; - ///Set CsI sensible - logicCristal1->SetSensitiveDetector(m_CsIScorer); - logicCristal2->SetSensitiveDetector(m_CsIScorer); - logicCristal3->SetSensitiveDetector(m_CsIScorer); - logicCristal4->SetSensitiveDetector(m_CsIScorer); + G4ThreeVector positionCristal1 = G4ThreeVector(-XEdge1, YEdge1, 0 * mm); + G4ThreeVector positionCristal2 = G4ThreeVector(-XEdge1, YEdge2, 0); + G4ThreeVector positionCristal3 = G4ThreeVector(-XEdge2, YEdge1, 0); + G4ThreeVector positionCristal4 = G4ThreeVector(-XEdge2, YEdge2, 0); - logicCristal1s->SetSensitiveDetector(m_CsIScorer); - logicCristal2s->SetSensitiveDetector(m_CsIScorer); - logicCristal3s->SetSensitiveDetector(m_CsIScorer); - logicCristal4s->SetSensitiveDetector(m_CsIScorer); - logicCristal4sbis->SetSensitiveDetector(m_CsIScorer); + new G4PVPlacement(Rotation(180., 0., 0.), positionCristal1, logicCristal1, Name + "_CsI_Cristal1", logicCsI, false, 1); + new G4PVPlacement(Rotation(180., 0., 180.), positionCristal2, logicCristal2, Name + "_CsI_Cristal2", logicCsI, false, 2); + new G4PVPlacement(Rotation(180., 0., 0.), positionCristal3, logicCristal3, Name + "_CsI_Cristal3", logicCsI, false, 3); + new G4PVPlacement(Rotation(180., 0., 0.), positionCristal4, logicCristal4, Name + "_CsI_Cristal4", logicCsI, false, 4); - //Mark blue a CsI corner crystal to see telescope orientation - logicCristal4sbis->SetVisAttributes(G4VisAttributes(G4Colour(0, 0, 1.))); - } + + G4ThreeVector positionCristal1b = G4ThreeVector(XEdge1, -YEdge1, 0 * mm); + G4ThreeVector positionCristal2b = G4ThreeVector(XEdge1, -YEdge2, 0); + G4ThreeVector positionCristal3b = G4ThreeVector(XEdge2, -YEdge1, 0); + G4ThreeVector positionCristal4b = G4ThreeVector(XEdge2, -YEdge2, 0); + + new G4PVPlacement(Rotation(180., 0., 180.), positionCristal1b, logicCristal1, Name + "_CsI_Cristal5", logicCsI, false, 5); + new G4PVPlacement(Rotation(180., 0., 0.), positionCristal2b, logicCristal2, Name + "_CsI_Cristal6", logicCsI, false, 6); + new G4PVPlacement(Rotation(180., 0., 180.), positionCristal3b, logicCristal3, Name + "_CsI_Cristal7", logicCsI, false, 7); + new G4PVPlacement(Rotation(180., 0., 180.), positionCristal4b, logicCristal4, Name + "_CsI_Cristal8", logicCsI, false, 8); + + G4ThreeVector positionCristal1s = G4ThreeVector(-XEdge1, -YEdge1, 0 * mm); + G4ThreeVector positionCristal2s = G4ThreeVector(-XEdge1, -YEdge2, 0); + G4ThreeVector positionCristal3s = G4ThreeVector(-XEdge2, -YEdge1, 0); + G4ThreeVector positionCristal4s = G4ThreeVector(-XEdge2, -YEdge2, 0); + + new G4PVPlacement(Rotation(180., 0., 0.), positionCristal1s, logicCristal1s, Name + "_CsI_Cristal9", logicCsI, false, 9); + new G4PVPlacement(Rotation(180., 0., 180.), positionCristal2s, logicCristal2s, Name + "_CsI_Cristal10", logicCsI, false, 10); + new G4PVPlacement(Rotation(180., 0., 0.), positionCristal3s, logicCristal3s, Name + "_CsI_Cristal11", logicCsI, false, 11); + new G4PVPlacement(Rotation(180., 0., 0.), positionCristal4s, logicCristal4s, Name + "_CsI_Cristal12", logicCsI, false, 12); + + G4ThreeVector positionCristal1sb = G4ThreeVector(XEdge1, YEdge1, 0 * mm); + G4ThreeVector positionCristal2sb = G4ThreeVector(XEdge1, YEdge2, 0); + G4ThreeVector positionCristal3sb = G4ThreeVector(XEdge2, YEdge1, 0); + G4ThreeVector positionCristal4sb = G4ThreeVector(XEdge2, YEdge2, 0); + + new G4PVPlacement(Rotation(180., 0., 180.), positionCristal1sb, logicCristal1s, Name + "_CsI_Cristal13", logicCsI, false, 13); + new G4PVPlacement(Rotation(180, 0, 0), positionCristal2sb, logicCristal2s, Name + "_CsI_Cristal14", logicCsI, false, 14); + new G4PVPlacement(Rotation(180., 0., 180.), positionCristal3sb, logicCristal3s, Name + "_CsI_Cristal15", logicCsI, false, 15); + new G4PVPlacement(Rotation(180., 0., 180.), positionCristal4sb, logicCristal4s, Name + "_CsI_Cristal16", logicCsI, false, 16); + + ///Set CsI sensible + logicCristal1->SetSensitiveDetector(m_CsIScorer); + logicCristal2->SetSensitiveDetector(m_CsIScorer); + logicCristal3->SetSensitiveDetector(m_CsIScorer); + logicCristal4->SetSensitiveDetector(m_CsIScorer); + + logicCristal1s->SetSensitiveDetector(m_CsIScorer); + logicCristal2s->SetSensitiveDetector(m_CsIScorer); + logicCristal3s->SetSensitiveDetector(m_CsIScorer); + logicCristal4s->SetSensitiveDetector(m_CsIScorer); + + //Mark blue a CsI corner crystal to see telescope orientation + G4VisAttributes* CsIVisAtt = new G4VisAttributes(G4Colour(1, 0.5, 0)); + logicCristal1 ->SetVisAttributes(CsIVisAtt); + logicCristal2 ->SetVisAttributes(CsIVisAtt); + logicCristal3 ->SetVisAttributes(CsIVisAtt); + logicCristal4 ->SetVisAttributes(CsIVisAtt); + logicCristal1s ->SetVisAttributes(CsIVisAtt); + logicCristal2s ->SetVisAttributes(CsIVisAtt); + logicCristal3s ->SetVisAttributes(CsIVisAtt); + logicCristal4s ->SetVisAttributes(CsIVisAtt); + + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -554,872 +552,859 @@ 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 ; - - } - - // 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) { - 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 ; - 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); - cout << "X1 Y1 corner position : " << A << endl; - - } - - - 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); - cout << "X128 Y1 corner position : " << B << endl; - - } - - - 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); - cout << "X1 Y128 corner position : " << C << endl; - - } - - 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); - cout << "X128 Y128 corner position : " << D << 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 * deg; - cout << "Theta: " << Theta / deg << endl; - - } - - //Angle method - 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; - - } - - //Angle method - 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; - - } - - //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 ; - - check_Theta = false ; - check_Phi = false ; - check_R = false ; -// check_beta = false ; - - check_SI = false ; - check_SILI = false ; - check_CSI = false ; - check_VIS = false ; - - } - } - } +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 ; + + } + + // 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) { + 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 ; + 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); + cout << "X1 Y1 corner position : " << A << endl; + + } + + + 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); + cout << "X128 Y1 corner position : " << B << endl; + + } + + + 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); + cout << "X1 Y128 corner position : " << C << endl; + + } + + 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); + cout << "X128 Y128 corner position : " << D << 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 * deg; + cout << "Theta: " << Theta / deg << endl; + + } + + //Angle method + 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; + + } + + //Angle method + 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; + + } + + //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 ; + + check_Theta = false ; + check_Phi = false ; + check_R = false ; + // check_beta = false ; + + check_SI = false ; + check_SILI = false ; + check_CSI = false ; + check_VIS = false ; + + } + } + } } // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method -void MUST2Array::ConstructDetector(G4LogicalVolume* world) -{ - G4RotationMatrix* MMrot = NULL ; - G4ThreeVector MMpos = G4ThreeVector(0, 0, 0) ; - G4ThreeVector MMu = G4ThreeVector(0, 0, 0) ; - G4ThreeVector MMv = G4ThreeVector(0, 0, 0) ; - G4ThreeVector MMw = G4ThreeVector(0, 0, 0) ; - G4ThreeVector MMCenter = G4ThreeVector(0, 0, 0) ; - bool Si = true ; - bool SiLi = true ; - bool CsI = true ; - - G4int NumberOfTelescope = m_DefinitionType.size() ; - - for (G4int i = 0 ; i < NumberOfTelescope ; i++) { - // By Point - if (m_DefinitionType[i]) { - // (u,v,w) unitary vector associated to telescope referencial - // (u,v) // to silicon plan - // w perpendicular to (u,v) plan and pointing CsI - MMu = m_X128_Y1[i] - m_X1_Y1[i] ; - MMu = MMu.unit() ; - - MMv = m_X1_Y128[i] - m_X1_Y1[i] ; - MMv = MMv.unit() ; - - MMw = MMv.cross(MMu) ; - // if (MMw.z() > 0)MMw = MMv.cross(MMu) ; - MMw = MMw.unit() ; - - MMCenter = (m_X1_Y1[i] + m_X1_Y128[i] + m_X128_Y1[i] + m_X128_Y128[i]) / 4 ; - - // Passage Matrix from Lab Referential to Telescope Referential - MMrot = new G4RotationMatrix(MMv, MMu, MMw); - MMpos = MMw * Length * 0.5 + MMCenter ; - } +void MUST2Array::ConstructDetector(G4LogicalVolume* world){ + G4RotationMatrix* MMrot = NULL ; + G4ThreeVector MMpos = G4ThreeVector(0, 0, 0) ; + G4ThreeVector MMu = G4ThreeVector(0, 0, 0) ; + G4ThreeVector MMv = G4ThreeVector(0, 0, 0) ; + G4ThreeVector MMw = G4ThreeVector(0, 0, 0) ; + G4ThreeVector MMCenter = G4ThreeVector(0, 0, 0) ; + bool Si = true ; + bool SiLi = true ; + bool CsI = true ; + + G4int NumberOfTelescope = m_DefinitionType.size() ; + + for (G4int i = 0 ; i < NumberOfTelescope ; i++) { + // By Point + if (m_DefinitionType[i]) { + // (u,v,w) unitary vector associated to telescope referencial + // (u,v) // to silicon plan + // w perpendicular to (u,v) plan and pointing CsI + MMu = m_X128_Y1[i] - m_X1_Y1[i] ; + MMu = MMu.unit() ; + + MMv = m_X1_Y128[i] - m_X1_Y1[i] ; + MMv = MMv.unit() ; + + MMw = MMv.cross(MMu) ; + // if (MMw.z() > 0)MMw = MMv.cross(MMu) ; + MMw = MMw.unit() ; + + MMCenter = (m_X1_Y1[i] + m_X1_Y128[i] + m_X128_Y1[i] + m_X128_Y128[i]) / 4 ; + + // Passage Matrix from Lab Referential to Telescope Referential + MMrot = new G4RotationMatrix(MMv, MMu, MMw); + MMpos = MMw * Length * 0.5 + MMCenter ; + } - // By Angle - else { - G4double Theta = m_Theta[i] ; - G4double Phi = m_Phi[i] ; - - // (u,v,w) unitary vector associated to telescope referencial - // (u,v) // to silicon plan - // w perpendicular to (u,v) plan and pointing ThirdStage - // Phi is angle between X axis and projection in (X,Y) plan - // Theta is angle between position vector and z axis - G4double wX = m_R[i] * sin(Theta / rad) * cos(Phi / rad) ; - G4double wY = m_R[i] * sin(Theta / rad) * sin(Phi / rad) ; - G4double wZ = m_R[i] * cos(Theta / rad); - MMw = G4ThreeVector(wX, wY, wZ) ; - - // vector corresponding to the center of the module - G4ThreeVector CT = MMw; - - // vector parallel to one axis of silicon plane - G4double ii = cos(Theta / rad) * cos(Phi / rad); - G4double jj = cos(Theta / rad) * sin(Phi / rad); - G4double kk = -sin(Theta / rad); - G4ThreeVector Y = G4ThreeVector(ii, jj, kk); - - MMw = MMw.unit(); - MMu = MMw.cross(Y); - MMv = MMw.cross(MMu); - MMv = MMv.unit(); - MMu = MMu.unit(); - - // Passage Matrix from Lab Referential to Telescope Referential - // MUST2 - MMrot = new G4RotationMatrix(MMu, MMv, MMw); - // Telescope is rotate of Beta angle around MMv axis. - MMrot->rotate(m_beta_u[i], MMu); - MMrot->rotate(m_beta_v[i], MMv); - MMrot->rotate(m_beta_w[i], MMw); - // translation to place Telescope - MMpos = MMw * Length * 0.5 + CT ; - } + // By Angle + else { + G4double Theta = m_Theta[i] ; + G4double Phi = m_Phi[i] ; + + // (u,v,w) unitary vector associated to telescope referencial + // (u,v) // to silicon plan + // w perpendicular to (u,v) plan and pointing ThirdStage + // Phi is angle between X axis and projection in (X,Y) plan + // Theta is angle between position vector and z axis + G4double wX = m_R[i] * sin(Theta / rad) * cos(Phi / rad) ; + G4double wY = m_R[i] * sin(Theta / rad) * sin(Phi / rad) ; + G4double wZ = m_R[i] * cos(Theta / rad); + MMw = G4ThreeVector(wX, wY, wZ) ; + + // vector corresponding to the center of the module + G4ThreeVector CT = MMw; + + // vector parallel to one axis of silicon plane + G4double ii = cos(Theta / rad) * cos(Phi / rad); + G4double jj = cos(Theta / rad) * sin(Phi / rad); + G4double kk = -sin(Theta / rad); + G4ThreeVector Y = G4ThreeVector(ii, jj, kk); + + MMw = MMw.unit(); + MMu = MMw.cross(Y); + MMv = MMw.cross(MMu); + MMv = MMv.unit(); + MMu = MMu.unit(); + + // Passage Matrix from Lab Referential to Telescope Referential + // MUST2 + MMrot = new G4RotationMatrix(MMu, MMv, MMw); + // Telescope is rotate of Beta angle around MMv axis. + MMrot->rotate(m_beta_u[i], MMu); + MMrot->rotate(m_beta_v[i], MMv); + MMrot->rotate(m_beta_w[i], MMw); + // translation to place Telescope + MMpos = MMw * Length * 0.5 + CT ; + } - Si = m_wSi[i] ; - SiLi = m_wSiLi[i] ; - CsI = m_wCsI[i] ; + Si = m_wSi[i] ; + SiLi = m_wSiLi[i] ; + CsI = m_wCsI[i] ; - VolumeMaker(i + 1 , MMpos , MMrot , Si , SiLi , CsI , world); - } + VolumeMaker(i + 1 , MMpos , MMrot , Si , SiLi , CsI , world); + } - delete MMrot ; + delete MMrot ; } // Add Detector branch to the EventTree. // Called After DetecorConstruction::AddDetector Method -void MUST2Array::InitializeRootOutput() -{ - RootOutput *pAnalysis = RootOutput::getInstance(); - TTree *pTree = pAnalysis->GetTree(); - pTree->Branch("MUST2", "TMust2Data", &m_Event) ; +void MUST2Array::InitializeRootOutput(){ + RootOutput *pAnalysis = RootOutput::getInstance(); + TTree *pTree = pAnalysis->GetTree(); + pTree->Branch("MUST2", "TMust2Data", &m_Event) ; } // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion -void MUST2Array::ReadSensitive(const G4Event* event) -{ - G4String DetectorNumber ; - m_Event->Clear() ; - -////////////////////////////////////////////////////////////////////////////////////// -//////////////////////// Used to Read Event Map of detector ////////////////////////// -////////////////////////////////////////////////////////////////////////////////////// - -// Si - std::map<G4int, G4int*>::iterator DetectorNumber_itr; - std::map<G4int, G4double*>::iterator Energy_itr; - std::map<G4int, G4double*>::iterator Time_itr; - std::map<G4int, G4int*>::iterator X_itr; - std::map<G4int, G4int*>::iterator Y_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 Ang_Theta_itr; - std::map<G4int, G4double*>::iterator Ang_Phi_itr; - - G4THitsMap<G4int>* DetectorNumberHitMap; - G4THitsMap<G4double>* EnergyHitMap; - G4THitsMap<G4double>* TimeHitMap; - G4THitsMap<G4int>* XHitMap; - G4THitsMap<G4int>* YHitMap; - G4THitsMap<G4double>* PosXHitMap; - G4THitsMap<G4double>* PosYHitMap; - G4THitsMap<G4double>* PosZHitMap; - G4THitsMap<G4double>* AngThetaHitMap; - G4THitsMap<G4double>* AngPhiHitMap; - -// Si(Li) - std::map<G4int, G4double*>::iterator SiLiEnergy_itr; - std::map<G4int, G4int*>::iterator SiLiPadNbr_itr; - G4THitsMap<G4double>* SiLiEnergyHitMap; - G4THitsMap<G4int>* SiLiPadNbrHitMap; - -// CsI - std::map<G4int, G4double*>::iterator CsIEnergy_itr; - std::map<G4int, G4int*>::iterator CsICristalNbr_itr; - G4THitsMap<G4double>* CsIEnergyHitMap; - G4THitsMap<G4int>* CsICristalNbrHitMap; -////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////// - - // Read the Scorer associate to the Silicon Strip - - //Detector Number - G4int StripDetCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/DetectorNumber"); - DetectorNumberHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripDetCollectionID)); - DetectorNumber_itr = DetectorNumberHitMap->GetMap()->begin(); - - //Energy - G4int StripEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripEnergy") ; - EnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripEnergyCollectionID)) ; - Energy_itr = EnergyHitMap->GetMap()->begin(); - - //Time of Flight - G4int StripTimeCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripTime"); - TimeHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripTimeCollectionID)); - Time_itr = TimeHitMap->GetMap()->begin(); - - //Strip Number X - G4int StripXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripNumberX") ; - XHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripXCollectionID)); - X_itr = XHitMap->GetMap()->begin(); - - //Strip Number Y - G4int StripYCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripNumberY"); - YHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripYCollectionID)); - Y_itr = YHitMap->GetMap()->begin(); - - //Interaction Coordinate X - G4int InterCoordXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordX"); - PosXHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordXCollectionID)); - Pos_X_itr = PosXHitMap->GetMap()->begin(); - - //Interaction Coordinate Y - G4int InterCoordYCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordY"); - PosYHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordYCollectionID)); - Pos_Y_itr = PosYHitMap->GetMap()->begin(); - - //Interaction Coordinate Z - G4int InterCoordZCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordZ"); - PosZHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordZCollectionID)); - Pos_Z_itr = PosXHitMap->GetMap()->begin(); - - //Interaction Coordinate Angle Theta - G4int InterCoordAngThetaCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordAngTheta"); - AngThetaHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordAngThetaCollectionID)); - Ang_Theta_itr = AngThetaHitMap->GetMap()->begin(); - - //Interaction Coordinate Angle Phi - G4int InterCoordAngPhiCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordAngPhi"); - AngPhiHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordAngPhiCollectionID)); - Ang_Phi_itr = AngPhiHitMap->GetMap()->begin(); - - // Read the Scorer associate to the SiLi - //Energy - G4int SiLiEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_SiLiScorer/SiLiEnergy"); - SiLiEnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(SiLiEnergyCollectionID)); - SiLiEnergy_itr = SiLiEnergyHitMap->GetMap()->begin(); - - G4int SiLiPadNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_SiLiScorer/SiLiPadNbr"); - SiLiPadNbrHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(SiLiPadNbrCollectionID)); - SiLiPadNbr_itr = SiLiPadNbrHitMap->GetMap()->begin(); - - // Read the Scorer associate to the CsI crystal - //Energy - G4int CsIEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_CsIScorer/CsIEnergy"); - CsIEnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(CsIEnergyCollectionID)); - CsIEnergy_itr = CsIEnergyHitMap->GetMap()->begin(); - - G4int CsICristalNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_CsIScorer/CsICristalNbr"); - CsICristalNbrHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(CsICristalNbrCollectionID)); - CsICristalNbr_itr = CsICristalNbrHitMap->GetMap()->begin(); - - -///////////////////// - - G4int sizeN = DetectorNumberHitMap->entries(); - G4int sizeE = EnergyHitMap->entries(); - G4int sizeT = TimeHitMap->entries(); - G4int sizeX = XHitMap->entries(); - G4int sizeY = YHitMap->entries(); - - // Loop on Telescope Number entry - for (G4int l = 0 ; l < sizeN ; l++) { - G4int N = *(DetectorNumber_itr->second); - G4int NTrackID = DetectorNumber_itr->first - N; - - - if (N > 0) { - - m_Event->SetMMStripXEDetectorNbr(N) ; - m_Event->SetMMStripYEDetectorNbr(N) ; - m_Event->SetMMStripXTDetectorNbr(N) ; - m_Event->SetMMStripYTDetectorNbr(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->SetMMStripXEEnergy(RandGauss::shoot(E, ResoStrip)); - m_Event->SetMMStripYEEnergy(RandGauss::shoot(E, ResoStrip)); - } - - 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->SetMMStripXTTime(RandGauss::shoot(T, ResoTimeMust)) ; - m_Event->SetMMStripYTTime(RandGauss::shoot(T, ResoTimeMust)) ; - } - - Time_itr++; - } - - - // X - X_itr = XHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < sizeX ; h++) { - G4int XTrackID = X_itr->first - N; - G4int X = *(X_itr->second); - if (XTrackID == NTrackID) { - m_Event->SetMMStripXEStripNbr(X); - m_Event->SetMMStripXTStripNbr(X); - } - - X_itr++; - } - - // Y - Y_itr = YHitMap->GetMap()->begin() ; - for (G4int h = 0 ; h < sizeY ; h++) { - G4int YTrackID = Y_itr->first - N ; - G4int Y = *(Y_itr->second); - if (YTrackID == NTrackID) { - m_Event->SetMMStripYEStripNbr(Y); - m_Event->SetMMStripYTStripNbr(Y); - } - - Y_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 - Ang_Theta_itr = AngThetaHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < AngThetaHitMap->entries(); h++) { - G4int AngThetaTrackID = Ang_Theta_itr->first - N ; - G4double AngTheta = *(Ang_Theta_itr->second) ; - if (AngThetaTrackID == NTrackID) { - ms_InterCoord->SetDetectedAngleTheta(AngTheta) ; - } - Ang_Theta_itr++; - } - - // Angle Phi - Ang_Phi_itr = AngPhiHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < AngPhiHitMap->entries() ; h++) { - G4int AngPhiTrackID = Ang_Phi_itr->first - N ; - G4double AngPhi = *(Ang_Phi_itr->second) ; - if (AngPhiTrackID == NTrackID) { - ms_InterCoord->SetDetectedAnglePhi(AngPhi) ; - } - Ang_Phi_itr++; - } - - - // Si(Li) - SiLiEnergy_itr = SiLiEnergyHitMap->GetMap()->begin() ; - SiLiPadNbr_itr = SiLiPadNbrHitMap->GetMap()->begin() ; - - for (G4int h = 0 ; h < SiLiEnergyHitMap->entries() ; h++) { - G4int SiLiEnergyTrackID = SiLiEnergy_itr->first -N ; - G4double SiLiEnergy = *(SiLiEnergy_itr->second) ; - - G4int PadNbr = *(SiLiPadNbr_itr->second) ; - - if (SiLiEnergyTrackID == NTrackID) { - m_Event->SetMMSiLiEEnergy(RandGauss::shoot(SiLiEnergy, ResoSiLi)) ; - m_Event->SetMMSiLiEPadNbr(PadNbr); - m_Event->SetMMSiLiTPadNbr(PadNbr); - m_Event->SetMMSiLiTTime(1); - m_Event->SetMMSiLiTDetectorNbr(N); - m_Event->SetMMSiLiEDetectorNbr(N); - } - - SiLiEnergy_itr++ ; - SiLiPadNbr_itr++ ; - } - - - // CsI - CsIEnergy_itr = CsIEnergyHitMap->GetMap()->begin() ; - CsICristalNbr_itr = CsICristalNbrHitMap->GetMap()->begin() ; - - for (G4int h = 0 ; h < CsIEnergyHitMap->entries() ; h++) { - G4int CsIEnergyTrackID = CsIEnergy_itr->first-N ; - G4double CsIEnergy = *(CsIEnergy_itr->second) ; - - G4int CristalNumber = *(CsICristalNbr_itr->second) ; - if (CsIEnergyTrackID == NTrackID) { - m_Event->SetMMCsIEEnergy(RandGauss::shoot(CsIEnergy, ResoCsI*sqrt(CsIEnergy))); - m_Event->SetMMCsIECristalNbr(CristalNumber); - m_Event->SetMMCsITCristalNbr(CristalNumber); - m_Event->SetMMCsITTime(1); - m_Event->SetMMCsITDetectorNbr(N); - m_Event->SetMMCsIEDetectorNbr(N); - } - - CsIEnergy_itr++ ; - CsICristalNbr_itr++ ; - } +void MUST2Array::ReadSensitive(const G4Event* event){ + G4String DetectorNumber ; + m_Event->Clear() ; + + ////////////////////////////////////////////////////////////////////////////////////// + //////////////////////// Used to Read Event Map of detector ////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + + // Si + std::map<G4int, G4int*>::iterator DetectorNumber_itr; + std::map<G4int, G4double*>::iterator Energy_itr; + std::map<G4int, G4double*>::iterator Time_itr; + std::map<G4int, G4int*>::iterator X_itr; + std::map<G4int, G4int*>::iterator Y_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 Ang_Theta_itr; + std::map<G4int, G4double*>::iterator Ang_Phi_itr; + + G4THitsMap<G4int>* DetectorNumberHitMap; + G4THitsMap<G4double>* EnergyHitMap; + G4THitsMap<G4double>* TimeHitMap; + G4THitsMap<G4int>* XHitMap; + G4THitsMap<G4int>* YHitMap; + G4THitsMap<G4double>* PosXHitMap; + G4THitsMap<G4double>* PosYHitMap; + G4THitsMap<G4double>* PosZHitMap; + G4THitsMap<G4double>* AngThetaHitMap; + G4THitsMap<G4double>* AngPhiHitMap; + + // Si(Li) + std::map<G4int, G4double*>::iterator SiLiEnergy_itr; + std::map<G4int, G4int*>::iterator SiLiPadNbr_itr; + G4THitsMap<G4double>* SiLiEnergyHitMap; + G4THitsMap<G4int>* SiLiPadNbrHitMap; + + // CsI + std::map<G4int, G4double*>::iterator CsIEnergy_itr; + std::map<G4int, G4int*>::iterator CsICristalNbr_itr; + G4THitsMap<G4double>* CsIEnergyHitMap; + G4THitsMap<G4int>* CsICristalNbrHitMap; + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + + // Read the Scorer associate to the Silicon Strip + + //Detector Number + G4int StripDetCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/DetectorNumber"); + DetectorNumberHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripDetCollectionID)); + DetectorNumber_itr = DetectorNumberHitMap->GetMap()->begin(); + + //Energy + G4int StripEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripEnergy") ; + EnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripEnergyCollectionID)) ; + Energy_itr = EnergyHitMap->GetMap()->begin(); + + //Time of Flight + G4int StripTimeCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripTime"); + TimeHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripTimeCollectionID)); + Time_itr = TimeHitMap->GetMap()->begin(); + + //Strip Number X + G4int StripXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripNumberX") ; + XHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripXCollectionID)); + X_itr = XHitMap->GetMap()->begin(); + + //Strip Number Y + G4int StripYCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripNumberY"); + YHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripYCollectionID)); + Y_itr = YHitMap->GetMap()->begin(); + + //Interaction Coordinate X + G4int InterCoordXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordX"); + PosXHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordXCollectionID)); + Pos_X_itr = PosXHitMap->GetMap()->begin(); + + //Interaction Coordinate Y + G4int InterCoordYCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordY"); + PosYHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordYCollectionID)); + Pos_Y_itr = PosYHitMap->GetMap()->begin(); + + //Interaction Coordinate Z + G4int InterCoordZCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordZ"); + PosZHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordZCollectionID)); + Pos_Z_itr = PosXHitMap->GetMap()->begin(); + + //Interaction Coordinate Angle Theta + G4int InterCoordAngThetaCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordAngTheta"); + AngThetaHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordAngThetaCollectionID)); + Ang_Theta_itr = AngThetaHitMap->GetMap()->begin(); + + //Interaction Coordinate Angle Phi + G4int InterCoordAngPhiCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordAngPhi"); + AngPhiHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordAngPhiCollectionID)); + Ang_Phi_itr = AngPhiHitMap->GetMap()->begin(); + + // Read the Scorer associate to the SiLi + //Energy + G4int SiLiEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_SiLiScorer/SiLiEnergy"); + SiLiEnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(SiLiEnergyCollectionID)); + SiLiEnergy_itr = SiLiEnergyHitMap->GetMap()->begin(); + + G4int SiLiPadNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_SiLiScorer/SiLiPadNbr"); + SiLiPadNbrHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(SiLiPadNbrCollectionID)); + SiLiPadNbr_itr = SiLiPadNbrHitMap->GetMap()->begin(); + + // Read the Scorer associate to the CsI crystal + //Energy + G4int CsIEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_CsIScorer/CsIEnergy"); + CsIEnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(CsIEnergyCollectionID)); + CsIEnergy_itr = CsIEnergyHitMap->GetMap()->begin(); + + G4int CsICristalNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_CsIScorer/CsICristalNbr"); + CsICristalNbrHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(CsICristalNbrCollectionID)); + CsICristalNbr_itr = CsICristalNbrHitMap->GetMap()->begin(); + + + ///////////////////// + + G4int sizeN = DetectorNumberHitMap->entries(); + G4int sizeE = EnergyHitMap->entries(); + G4int sizeT = TimeHitMap->entries(); + G4int sizeX = XHitMap->entries(); + G4int sizeY = YHitMap->entries(); + + // Loop on Telescope Number entry + for (G4int l = 0 ; l < sizeN ; l++) { + G4int N = *(DetectorNumber_itr->second); + G4int NTrackID = DetectorNumber_itr->first - N; + + + if (N > 0) { + + m_Event->SetMMStripXEDetectorNbr(N) ; + m_Event->SetMMStripYEDetectorNbr(N) ; + m_Event->SetMMStripXTDetectorNbr(N) ; + m_Event->SetMMStripYTDetectorNbr(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->SetMMStripXEEnergy(RandGauss::shoot(E, ResoStrip)); + m_Event->SetMMStripYEEnergy(RandGauss::shoot(E, ResoStrip)); + } + + 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->SetMMStripXTTime(RandGauss::shoot(T, ResoTimeMust)) ; + m_Event->SetMMStripYTTime(RandGauss::shoot(T, ResoTimeMust)) ; } - DetectorNumber_itr++; + Time_itr++; + } + + + // X + X_itr = XHitMap->GetMap()->begin(); + for (G4int h = 0 ; h < sizeX ; h++) { + G4int XTrackID = X_itr->first - N; + G4int X = *(X_itr->second); + if (XTrackID == NTrackID) { + m_Event->SetMMStripXEStripNbr(X); + m_Event->SetMMStripXTStripNbr(X); + } + + X_itr++; + } + + // Y + Y_itr = YHitMap->GetMap()->begin() ; + for (G4int h = 0 ; h < sizeY ; h++) { + G4int YTrackID = Y_itr->first - N ; + G4int Y = *(Y_itr->second); + if (YTrackID == NTrackID) { + m_Event->SetMMStripYEStripNbr(Y); + m_Event->SetMMStripYTStripNbr(Y); + } + + Y_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 + Ang_Theta_itr = AngThetaHitMap->GetMap()->begin(); + for (G4int h = 0 ; h < AngThetaHitMap->entries(); h++) { + G4int AngThetaTrackID = Ang_Theta_itr->first - N ; + G4double AngTheta = *(Ang_Theta_itr->second) ; + if (AngThetaTrackID == NTrackID) { + ms_InterCoord->SetDetectedAngleTheta(AngTheta) ; + } + Ang_Theta_itr++; + } + + // Angle Phi + Ang_Phi_itr = AngPhiHitMap->GetMap()->begin(); + for (G4int h = 0 ; h < AngPhiHitMap->entries() ; h++) { + G4int AngPhiTrackID = Ang_Phi_itr->first - N ; + G4double AngPhi = *(Ang_Phi_itr->second) ; + if (AngPhiTrackID == NTrackID) { + ms_InterCoord->SetDetectedAnglePhi(AngPhi) ; + } + Ang_Phi_itr++; + } + + // Si(Li) + SiLiEnergy_itr = SiLiEnergyHitMap->GetMap()->begin() ; + SiLiPadNbr_itr = SiLiPadNbrHitMap->GetMap()->begin() ; + + for (G4int h = 0 ; h < SiLiEnergyHitMap->entries() ; h++) { + G4int SiLiEnergyTrackID = SiLiEnergy_itr->first -N ; + G4double SiLiEnergy = *(SiLiEnergy_itr->second) ; + + G4int PadNbr = *(SiLiPadNbr_itr->second) ; + + if (SiLiEnergyTrackID == NTrackID) { + m_Event->SetMMSiLiEEnergy(RandGauss::shoot(SiLiEnergy, ResoSiLi)) ; + m_Event->SetMMSiLiEPadNbr(PadNbr); + m_Event->SetMMSiLiTPadNbr(PadNbr); + m_Event->SetMMSiLiTTime(1); + m_Event->SetMMSiLiTDetectorNbr(N); + m_Event->SetMMSiLiEDetectorNbr(N); + } + + SiLiEnergy_itr++ ; + SiLiPadNbr_itr++ ; + } + + // CsI + CsIEnergy_itr = CsIEnergyHitMap->GetMap()->begin() ; + CsICristalNbr_itr = CsICristalNbrHitMap->GetMap()->begin() ; + + for (G4int h = 0 ; h < CsIEnergyHitMap->entries() ; h++) { + G4int CsIEnergyTrackID = CsIEnergy_itr->first-N ; + G4double CsIEnergy = *(CsIEnergy_itr->second) ; + + G4int CristalNumber = *(CsICristalNbr_itr->second) ; + if (CsIEnergyTrackID == NTrackID) { + m_Event->SetMMCsIEEnergy(RandGauss::shoot(CsIEnergy, ResoCsI*sqrt(CsIEnergy))); + m_Event->SetMMCsIECristalNbr(CristalNumber); + m_Event->SetMMCsITCristalNbr(CristalNumber); + m_Event->SetMMCsITTime(1); + m_Event->SetMMCsITDetectorNbr(N); + m_Event->SetMMCsIEDetectorNbr(N); + } + + CsIEnergy_itr++ ; + CsICristalNbr_itr++ ; + } + } - - // clear map for next event - DetectorNumberHitMap ->clear(); - EnergyHitMap ->clear() ; - TimeHitMap ->clear() ; - XHitMap ->clear() ; - YHitMap ->clear() ; - SiLiEnergyHitMap ->clear() ; - SiLiPadNbrHitMap ->clear() ; - CsIEnergyHitMap ->clear() ; - CsICristalNbrHitMap ->clear() ; - PosXHitMap ->clear() ; - PosYHitMap ->clear() ; - PosZHitMap ->clear() ; - AngThetaHitMap ->clear() ; - AngPhiHitMap ->clear() ; - + + DetectorNumber_itr++; + } + + // clear map for next event + DetectorNumberHitMap ->clear(); + EnergyHitMap ->clear() ; + TimeHitMap ->clear() ; + XHitMap ->clear() ; + YHitMap ->clear() ; + SiLiEnergyHitMap ->clear() ; + SiLiPadNbrHitMap ->clear() ; + CsIEnergyHitMap ->clear() ; + CsICristalNbrHitMap ->clear() ; + PosXHitMap ->clear() ; + PosYHitMap ->clear() ; + PosZHitMap ->clear() ; + AngThetaHitMap ->clear() ; + AngPhiHitMap ->clear() ; + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void MUST2Array::InitializeScorers() - { - // Silicon Associate Scorer - m_StripScorer = new G4MultiFunctionalDetector("MUST2_StripScorer"); - - G4VPrimitiveScorer* DetNbr = new GENERALSCORERS::PSDetectorNumber("DetectorNumber","MUST2Telescope", 0); - G4VPrimitiveScorer* Energy = new GENERALSCORERS::PSEnergy("StripEnergy","MUST2Telescope", 0); - G4VPrimitiveScorer* TOF = new GENERALSCORERS::PSTOF("StripTime","MUST2Telescope", 0); - - G4VPrimitiveScorer* StripPositionX = new PSStripNumberX("StripNumberX", 0, SiliconFace, 128); - G4VPrimitiveScorer* StripPositionY = new PSStripNumberY("StripNumberY", 0, SiliconFace, 128); - - G4VPrimitiveScorer* InteractionCoordinatesX = new GENERALSCORERS::PSInteractionCoordinatesX("InterCoordX","MUST2Telescope", 0); - G4VPrimitiveScorer* InteractionCoordinatesY = new GENERALSCORERS::PSInteractionCoordinatesY("InterCoordY","MUST2Telescope", 0); - G4VPrimitiveScorer* InteractionCoordinatesZ = new GENERALSCORERS::PSInteractionCoordinatesZ("InterCoordZ","MUST2Telescope", 0); - G4VPrimitiveScorer* InteractionCoordinatesAngleTheta = new GENERALSCORERS::PSInteractionCoordinatesAngleTheta("InterCoordAngTheta","MUST2Telescope", 0); - G4VPrimitiveScorer* InteractionCoordinatesAnglePhi = new GENERALSCORERS::PSInteractionCoordinatesAnglePhi("InterCoordAngPhi","MUST2Telescope", 0) ; - - - //and register it to the multifunctionnal detector - m_StripScorer->RegisterPrimitive(DetNbr); - m_StripScorer->RegisterPrimitive(Energy); - m_StripScorer->RegisterPrimitive(TOF); - m_StripScorer->RegisterPrimitive(StripPositionX); - m_StripScorer->RegisterPrimitive(StripPositionY); - m_StripScorer->RegisterPrimitive(InteractionCoordinatesX); - m_StripScorer->RegisterPrimitive(InteractionCoordinatesY); - m_StripScorer->RegisterPrimitive(InteractionCoordinatesZ); - m_StripScorer->RegisterPrimitive(InteractionCoordinatesAngleTheta); - m_StripScorer->RegisterPrimitive(InteractionCoordinatesAnglePhi); - - // SiLi Associate Scorer - m_SiLiScorer = new G4MultiFunctionalDetector("MUST2_SiLiScorer"); - G4VPrimitiveScorer* SiLiEnergy = new GENERALSCORERS::PSEnergy("SiLiEnergy","MUST2Telescope", 0) ; - G4VPrimitiveScorer* SiLiPadNbr = new PSPadOrCristalNumber("SiLiPadNbr",0) ; - m_SiLiScorer->RegisterPrimitive(SiLiEnergy); - m_SiLiScorer->RegisterPrimitive(SiLiPadNbr); - - // CsI Associate Scorer - m_CsIScorer = new G4MultiFunctionalDetector("MUST2_CsIScorer"); - G4VPrimitiveScorer* CsIEnergy = new GENERALSCORERS::PSEnergy("CsIEnergy","MUST2Telescope", 0) ; - G4VPrimitiveScorer* CsICristalNbr = new PSPadOrCristalNumber("CsICristalNbr",0) ; - m_CsIScorer->RegisterPrimitive(CsIEnergy) ; - m_CsIScorer->RegisterPrimitive(CsICristalNbr) ; - - // Add All Scorer to the Global Scorer Manager - G4SDManager::GetSDMpointer()->AddNewDetector(m_StripScorer) ; - G4SDManager::GetSDMpointer()->AddNewDetector(m_SiLiScorer) ; - G4SDManager::GetSDMpointer()->AddNewDetector(m_CsIScorer) ; - } +void MUST2Array::InitializeScorers() { + // Silicon Associate Scorer + m_StripScorer = new G4MultiFunctionalDetector("MUST2_StripScorer"); + + G4VPrimitiveScorer* DetNbr = new GENERALSCORERS::PSDetectorNumber("DetectorNumber","MUST2Telescope", 0); + G4VPrimitiveScorer* Energy = new GENERALSCORERS::PSEnergy("StripEnergy","MUST2Telescope", 0); + G4VPrimitiveScorer* TOF = new GENERALSCORERS::PSTOF("StripTime","MUST2Telescope", 0); + + G4VPrimitiveScorer* StripPositionX = new PSStripNumberX("StripNumberX", 0, SiliconFace, 128); + G4VPrimitiveScorer* StripPositionY = new PSStripNumberY("StripNumberY", 0, SiliconFace, 128); + + G4VPrimitiveScorer* InteractionCoordinatesX = new GENERALSCORERS::PSInteractionCoordinatesX("InterCoordX","MUST2Telescope", 0); + G4VPrimitiveScorer* InteractionCoordinatesY = new GENERALSCORERS::PSInteractionCoordinatesY("InterCoordY","MUST2Telescope", 0); + G4VPrimitiveScorer* InteractionCoordinatesZ = new GENERALSCORERS::PSInteractionCoordinatesZ("InterCoordZ","MUST2Telescope", 0); + G4VPrimitiveScorer* InteractionCoordinatesAngleTheta = new GENERALSCORERS::PSInteractionCoordinatesAngleTheta("InterCoordAngTheta","MUST2Telescope", 0); + G4VPrimitiveScorer* InteractionCoordinatesAnglePhi = new GENERALSCORERS::PSInteractionCoordinatesAnglePhi("InterCoordAngPhi","MUST2Telescope", 0) ; + + + //and register it to the multifunctionnal detector + m_StripScorer->RegisterPrimitive(DetNbr); + m_StripScorer->RegisterPrimitive(Energy); + m_StripScorer->RegisterPrimitive(TOF); + m_StripScorer->RegisterPrimitive(StripPositionX); + m_StripScorer->RegisterPrimitive(StripPositionY); + m_StripScorer->RegisterPrimitive(InteractionCoordinatesX); + m_StripScorer->RegisterPrimitive(InteractionCoordinatesY); + m_StripScorer->RegisterPrimitive(InteractionCoordinatesZ); + m_StripScorer->RegisterPrimitive(InteractionCoordinatesAngleTheta); + m_StripScorer->RegisterPrimitive(InteractionCoordinatesAnglePhi); + + // SiLi Associate Scorer + m_SiLiScorer = new G4MultiFunctionalDetector("MUST2_SiLiScorer"); + G4VPrimitiveScorer* SiLiEnergy = new GENERALSCORERS::PSEnergy("SiLiEnergy","MUST2Telescope", 0) ; + G4VPrimitiveScorer* SiLiPadNbr = new PSPadOrCristalNumber("SiLiPadNbr",0) ; + m_SiLiScorer->RegisterPrimitive(SiLiEnergy); + m_SiLiScorer->RegisterPrimitive(SiLiPadNbr); + + // CsI Associate Scorer + m_CsIScorer = new G4MultiFunctionalDetector("MUST2_CsIScorer"); + G4VPrimitiveScorer* CsIEnergy = new GENERALSCORERS::PSEnergy("CsIEnergy","MUST2Telescope", 0) ; + G4VPrimitiveScorer* CsICristalNbr = new PSPadOrCristalNumber("CsICristalNbr",0) ; + m_CsIScorer->RegisterPrimitive(CsIEnergy) ; + m_CsIScorer->RegisterPrimitive(CsICristalNbr) ; + + // Add All Scorer to the Global Scorer Manager + G4SDManager::GetSDMpointer()->AddNewDetector(m_StripScorer) ; + G4SDManager::GetSDMpointer()->AddNewDetector(m_SiLiScorer) ; + G4SDManager::GetSDMpointer()->AddNewDetector(m_CsIScorer) ; +} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void MUST2Array::InitializeMaterial() - { - - //////////////////////////////////////////////////////////////// -/////////////////Element Definition /////////////////////////// -//////////////////////////////////////////////////////////////// - G4String symbol ; - G4double density = 0. , a = 0, z = 0 ; - G4int ncomponents = 0, natoms = 0 ; - - G4Element* H = new G4Element("Hydrogen" , symbol = "H" , z = 1 , a = 1.01 * g / mole); - G4Element* C = new G4Element("Carbon" , symbol = "C" , z = 6 , a = 12.011 * g / mole); - G4Element* N = new G4Element("Nitrogen" , symbol = "N" , z = 7 , a = 14.01 * g / mole); - G4Element* O = new G4Element("Oxigen" , symbol = "O" , z = 8 , a = 16.00 * g / mole); - G4Element* I = new G4Element("Iode" , symbol = "I" , z = 53 , a = 126.9 * g / mole); - G4Element* Cs = new G4Element("Cesium" , symbol = "Cs" , z = 55 , a = 132.9 * g / mole); - - G4Element* Co = new G4Element("Cobalt" , symbol = "Co" , z = 27 , a = 58.933 * g / mole); - G4Element* Cr = new G4Element("Cromium" , symbol = "Cr" , z = 24 , a = 51.996 * g / mole); - G4Element* Ni = new G4Element("Nickel" , symbol = "Ni" , z = 28 , a = 58.69 * g / mole); - G4Element* Fe = new G4Element("Iron" , symbol = "Fe" , z = 26 , a = 55.847 * g / mole); - G4Element* W = new G4Element("Tungsten" , symbol = "W" , z = 74 , a = 183.5 * g / mole); - -//////////////////////////////////////////////////////////////// -/////////////////Material Definition /////////////////////////// -//////////////////////////////////////////////////////////////// - - // Si - a = 28.0855 * g / mole; - density = 2.321 * g / cm3; - m_MaterialSilicon = new G4Material("Si", z = 14., a, density); - - // Al - density = 2.702 * g / cm3; - a = 26.98 * g / mole; - m_MaterialAluminium = new G4Material("Aluminium", z = 13., a, density); - - // Iron - density = 7.874 * g / cm3; - a = 55.847 * g / mole; - m_MaterialIron = new G4Material("Iron", z = 26., a, density); - - // CsI - density = 4.51 * g / cm3; - m_MaterialCsI = new G4Material("CsI", density, ncomponents = 2); - m_MaterialCsI->AddElement(Cs , natoms = 1); - m_MaterialCsI->AddElement(I , natoms = 1); - - // Vacuum - density = 0.000000001 * mg / cm3; - m_MaterialVacuum = new G4Material("Vacuum", density, ncomponents = 2); - m_MaterialVacuum->AddElement(N, .7); - m_MaterialVacuum->AddElement(O, .3); - - // Mylar - density = 1.397 * g / cm3; - m_MaterialMyl = new G4Material("Mylar", density, ncomponents = 3); - m_MaterialMyl->AddElement(C, natoms = 10); - m_MaterialMyl->AddElement(H, natoms = 8); - m_MaterialMyl->AddElement(O, natoms = 4); - - // Havar - m_MaterialHarvar = new G4Material("Havar", 8.3*g / cm3, 5); - m_MaterialHarvar->AddElement(Co , 42); - m_MaterialHarvar->AddElement(Cr , 20); - m_MaterialHarvar->AddElement(Ni , 13); - m_MaterialHarvar->AddElement(Fe , 19); - m_MaterialHarvar->AddElement(W , 1); - - - } +void MUST2Array::InitializeMaterial(){ + + //////////////////////////////////////////////////////////////// + /////////////////Element Definition /////////////////////////// + //////////////////////////////////////////////////////////////// + G4String symbol ; + G4double density = 0. , a = 0, z = 0 ; + G4int ncomponents = 0, natoms = 0 ; + + G4Element* H = new G4Element("Hydrogen" , symbol = "H" , z = 1 , a = 1.01 * g / mole); + G4Element* C = new G4Element("Carbon" , symbol = "C" , z = 6 , a = 12.011 * g / mole); + G4Element* N = new G4Element("Nitrogen" , symbol = "N" , z = 7 , a = 14.01 * g / mole); + G4Element* O = new G4Element("Oxigen" , symbol = "O" , z = 8 , a = 16.00 * g / mole); + G4Element* I = new G4Element("Iode" , symbol = "I" , z = 53 , a = 126.9 * g / mole); + G4Element* Cs = new G4Element("Cesium" , symbol = "Cs" , z = 55 , a = 132.9 * g / mole); + + G4Element* Co = new G4Element("Cobalt" , symbol = "Co" , z = 27 , a = 58.933 * g / mole); + G4Element* Cr = new G4Element("Cromium" , symbol = "Cr" , z = 24 , a = 51.996 * g / mole); + G4Element* Ni = new G4Element("Nickel" , symbol = "Ni" , z = 28 , a = 58.69 * g / mole); + G4Element* Fe = new G4Element("Iron" , symbol = "Fe" , z = 26 , a = 55.847 * g / mole); + G4Element* W = new G4Element("Tungsten" , symbol = "W" , z = 74 , a = 183.5 * g / mole); + + //////////////////////////////////////////////////////////////// + /////////////////Material Definition /////////////////////////// + //////////////////////////////////////////////////////////////// + + // Si + a = 28.0855 * g / mole; + density = 2.321 * g / cm3; + m_MaterialSilicon = new G4Material("Si", z = 14., a, density); + + // Al + density = 2.702 * g / cm3; + a = 26.98 * g / mole; + m_MaterialAluminium = new G4Material("Aluminium", z = 13., a, density); + + // Iron + density = 7.874 * g / cm3; + a = 55.847 * g / mole; + m_MaterialIron = new G4Material("Iron", z = 26., a, density); + + // CsI + density = 4.51 * g / cm3; + m_MaterialCsI = new G4Material("CsI", density, ncomponents = 2); + m_MaterialCsI->AddElement(Cs , natoms = 1); + m_MaterialCsI->AddElement(I , natoms = 1); + + // Vacuum + density = 0.000000001 * mg / cm3; + m_MaterialVacuum = new G4Material("Vacuum", density, ncomponents = 2); + m_MaterialVacuum->AddElement(N, .7); + m_MaterialVacuum->AddElement(O, .3); + + // Mylar + density = 1.397 * g / cm3; + m_MaterialMyl = new G4Material("Mylar", density, ncomponents = 3); + m_MaterialMyl->AddElement(C, natoms = 10); + m_MaterialMyl->AddElement(H, natoms = 8); + m_MaterialMyl->AddElement(O, natoms = 4); + + // Havar + m_MaterialHarvar = new G4Material("Havar", 8.3*g / cm3, 5); + m_MaterialHarvar->AddElement(Co , 42); + m_MaterialHarvar->AddElement(Cr , 20); + m_MaterialHarvar->AddElement(Ni , 13); + m_MaterialHarvar->AddElement(Fe , 19); + m_MaterialHarvar->AddElement(W , 1); +} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4RotationMatrix* Rotation(double tetaX, double tetaY, double tetaZ) -{ - double PI = 3.141592653589793238; - double radX = tetaX * PI / 180.; - double radY = tetaY * PI / 180.; - double radZ = tetaZ * PI / 180.; - - G4ThreeVector col1 = G4ThreeVector(cos(radZ) * cos(radY), - -sin(radZ) * cos(radY), - -sin(radY)); - G4ThreeVector col2 = G4ThreeVector(sin(radZ) * cos(radX) - cos(radZ) * sin(radY) * sin(radX), - cos(radZ) * cos(radX) + sin(radZ) * sin(radY) * sin(radX), - -cos(radY) * sin(radX)); - G4ThreeVector col3 = G4ThreeVector(sin(radZ) * sin(radX) + cos(radZ) * sin(radY) * sin(radX), - cos(radZ) * sin(radX) - sin(radZ) * sin(radY) * cos(radX), - cos(radY) * cos(radX)); - - return (new G4RotationMatrix(col1, col2, col3)); +G4RotationMatrix* Rotation(double tetaX, double tetaY, double tetaZ){ + double PI = 3.141592653589793238; + double radX = tetaX * PI / 180.; + double radY = tetaY * PI / 180.; + double radZ = tetaZ * PI / 180.; + + G4ThreeVector col1 = G4ThreeVector(cos(radZ) * cos(radY), + -sin(radZ) * cos(radY), + -sin(radY)); + G4ThreeVector col2 = G4ThreeVector(sin(radZ) * cos(radX) - cos(radZ) * sin(radY) * sin(radX), + cos(radZ) * cos(radX) + sin(radZ) * sin(radY) * sin(radX), + -cos(radY) * sin(radX)); + G4ThreeVector col3 = G4ThreeVector(sin(radZ) * sin(radX) + cos(radZ) * sin(radY) * sin(radX), + cos(radZ) * sin(radX) - sin(radZ) * sin(radY) * cos(radX), + cos(radY) * cos(radX)); + + return (new G4RotationMatrix(col1, col2, col3)); } diff --git a/NPSimulation/Makefile b/NPSimulation/Makefile index a2c7acc85650b1ed93aec0a69d81de90d568f5f4..c837a7c229c40c1a5cfd75c05118a3137f48d35c 100644 --- a/NPSimulation/Makefile +++ b/NPSimulation/Makefile @@ -4,15 +4,14 @@ NPSIM = NPSimulation all: $(DELFILES) $(COPYFILES) $(NPSIM) - -CopyIncSrcFiles: - ./scripts/copyfiles.sh - DelIncSrcFiles: ./scripts/deletefiles.sh -NPSimulation: - make -j 10 -f Makefile.geant4 +CopyIncSrcFiles: DelIncSrcFiles + ./scripts/copyfiles.sh + +NPSimulation: DelIncSrcFiles CopyIncSrcFiles + make -f Makefile.geant4 clean: ./scripts/deletefiles.sh diff --git a/NPSimulation/Paris/ParisCluster.cc b/NPSimulation/Paris/ParisCluster.cc index 2ee93847de8b42b7fd209d4af4a5b8a8900de89d..43f26531532a189957b95341521c4cba22bd88a0 100644 --- a/NPSimulation/Paris/ParisCluster.cc +++ b/NPSimulation/Paris/ParisCluster.cc @@ -212,15 +212,16 @@ void ParisCluster::VolumeMaker(G4int DetecNumber, false , 0); - logicParisCluster->SetVisAttributes(G4VisAttributes::Invisible); - if (m_non_sensitive_part_visiualisation) logicParisCluster->SetVisAttributes(G4VisAttributes(G4Colour(0.90, 0.90, 0.90))); - + G4VisAttributes* ClusterVisAtt = new G4VisAttributes(G4Colour(0.90, 0.90, 0.90)); + ClusterVisAtt->SetForceWireframe(true); + logicParisCluster->SetVisAttributes(ClusterVisAtt); // Phoswich volume construction (empty volume) G4ThreeVector positionPhoSwStage = G4ThreeVector(LaBr3Face+InterSpace, LaBr3Face+InterSpace, 0.); G4Box* solidPhoSwStage = new G4Box(Name+"_PhoSwStage", 0.5*LaBr3Face, 0.5*LaBr3Face, 0.5*Length); G4LogicalVolume* logicPhoSwStage = new G4LogicalVolume(solidPhoSwStage, Vacuum, "logicPhoSwStage", 0, 0, 0); - + logicPhoSwStage->SetVisAttributes(G4VisAttributes::Invisible); + new G4PVPlacement(0, positionPhoSwStage, logicPhoSwStage, @@ -230,7 +231,7 @@ void ParisCluster::VolumeMaker(G4int DetecNumber, // 0); positionPhoSwStage = G4ThreeVector(0., LaBr3Face+InterSpace, 0.); - G4PVPlacement(0, + new G4PVPlacement(0, positionPhoSwStage, logicPhoSwStage, Name+"_PhoSwStage", @@ -323,7 +324,7 @@ void ParisCluster::VolumeMaker(G4int DetecNumber, logicLaBr3Stage->SetSensitiveDetector(m_LaBr3StageScorer); // Visualisation of LaBr3Stage Strip - G4VisAttributes* LaBr3VisAtt = new G4VisAttributes(G4Colour(0., 0., 1.)); + G4VisAttributes* LaBr3VisAtt = new G4VisAttributes(G4Colour(0., 0.5, 1.)); logicLaBr3Stage->SetVisAttributes(LaBr3VisAtt); // CsI or NaI @@ -345,7 +346,7 @@ void ParisCluster::VolumeMaker(G4int DetecNumber, logicCsIStage->SetSensitiveDetector(m_CsIStageScorer); // Visualisation of CsIStage Strip - G4VisAttributes* CsIVisAtt = new G4VisAttributes(G4Colour(1., 0., 0.)); + G4VisAttributes* CsIVisAtt = new G4VisAttributes(G4Colour(1., 0.25, 0.)); logicCsIStage->SetVisAttributes(CsIVisAtt); } diff --git a/NPSimulation/Plastic/Plastic.cc b/NPSimulation/Plastic/Plastic.cc index d61ce70c04c3335400dfb4653503b21fb00e3097..1350c3832dc5de5587ccc222e48636979ee3aeac 100644 --- a/NPSimulation/Plastic/Plastic.cc +++ b/NPSimulation/Plastic/Plastic.cc @@ -494,8 +494,8 @@ void Plastic::VolumeMaker(G4ThreeVector Det_pos, int DetNumber, G4LogicalVolume* world , false , 0 ); */ - //G4RotationMatrix Rot3D; - //Rot3D.set(0, 0, 0); + G4RotationMatrix Rot3D; + Rot3D.set(0, 0, 0); //Rot3D.rotateX(70*degree); //Rot3D.rotateY(theta*degree); //Rot3D.rotateZ(phi*degree); diff --git a/NPSimulation/SSSD/ThinSi.cc b/NPSimulation/SSSD/ThinSi.cc index d97c587b9995f291d50e48aaaef27b7b845f1251..2242c699faed12182f9dde92ba83ed3a7c0f80a5 100644 --- a/NPSimulation/SSSD/ThinSi.cc +++ b/NPSimulation/SSSD/ThinSi.cc @@ -60,641 +60,640 @@ using namespace CLHEP; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // ThinSi Specific Method -ThinSi::ThinSi() -{ - InitializeMaterial(); - m_Event = new TSSSDData(); +ThinSi::ThinSi(){ + InitializeMaterial(); + m_Event = new TSSSDData(); } -ThinSi::~ThinSi() -{ - delete m_MaterialSilicon; - delete m_MaterialAl; - delete m_MaterialVacuum; +ThinSi::~ThinSi(){ + delete m_MaterialSilicon; + delete m_MaterialAl; + delete m_MaterialVacuum; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void ThinSi::AddTelescope( G4ThreeVector TL, - G4ThreeVector BL, - G4ThreeVector BR, - G4ThreeVector TR) + G4ThreeVector BL, + G4ThreeVector BR, + G4ThreeVector TR) { - m_DefinitionType.push_back(true); - - m_TL.push_back(TL); - m_BL.push_back(BL); - m_BR.push_back(BR); - m_TR.push_back(TR); - - m_R.push_back(0); - m_Theta.push_back(0); - m_Phi.push_back(0); - m_beta_u.push_back(0); - m_beta_v.push_back(0); - m_beta_w.push_back(0); + m_DefinitionType.push_back(true); + + m_TL.push_back(TL); + m_BL.push_back(BL); + m_BR.push_back(BR); + m_TR.push_back(TR); + + m_R.push_back(0); + m_Theta.push_back(0); + m_Phi.push_back(0); + m_beta_u.push_back(0); + m_beta_v.push_back(0); + m_beta_w.push_back(0); } void ThinSi::AddTelescope( G4double R, - G4double Theta, - G4double Phi, - G4double beta_u, - G4double beta_v, - G4double beta_w) + G4double Theta, + G4double Phi, + G4double beta_u, + G4double beta_v, + G4double beta_w) { - G4ThreeVector empty = G4ThreeVector(0, 0, 0); + G4ThreeVector empty = G4ThreeVector(0, 0, 0); - m_DefinitionType.push_back(false); + m_DefinitionType.push_back(false); - m_R.push_back(R); - m_Theta.push_back(Theta); - m_Phi.push_back(Phi); - m_beta_u.push_back(beta_u); - m_beta_v.push_back(beta_v); - m_beta_w.push_back(beta_w); + m_R.push_back(R); + m_Theta.push_back(Theta); + m_Phi.push_back(Phi); + m_beta_u.push_back(beta_u); + m_beta_v.push_back(beta_v); + m_beta_w.push_back(beta_w); - m_TL.push_back(empty); - m_BL.push_back(empty); - m_BR.push_back(empty); - m_TR.push_back(empty); + m_TL.push_back(empty); + m_BL.push_back(empty); + m_BR.push_back(empty); + m_TR.push_back(empty); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void ThinSi::VolumeMaker( G4int DetNumber , - G4ThreeVector Det_pos , - G4RotationMatrix* Det_rot , - G4LogicalVolume* world ) + G4ThreeVector Det_pos , + G4RotationMatrix* Det_rot , + G4LogicalVolume* world ) { - G4double NbrTelescopes = DetNumber ; - G4String DetectorNumber ; - std::ostringstream Number ; - Number << NbrTelescopes ; - DetectorNumber = Number.str() ; - + G4double NbrTelescopes = DetNumber ; + G4String DetectorNumber ; + std::ostringstream Number ; + Number << NbrTelescopes ; + DetectorNumber = Number.str() ; + + //////////////////////////////////////////////////////////////// + /////////General Geometry Parameter Definition ///////////////// + //////////////////////////////////////////////////////////////// + /////// Starting Volume Definition /////// + G4String Name = "ThinSi" + DetectorNumber; + + G4Box* solidThinSi = new G4Box(Name+"Solid", 0.5*DetectorSize, 0.5*DetectorSize, 0.5*FrameThickness); + + G4LogicalVolume* logicThinSi = + new G4LogicalVolume(solidThinSi, m_MaterialVacuum, Name+"_logic", 0, 0); + + new G4PVPlacement( G4Transform3D(*Det_rot, Det_pos) , + logicThinSi , + Name , + world , + false , + 0); + + logicThinSi->SetVisAttributes(G4VisAttributes::Invisible); + // Frame is made of 4 thick box (2 Horizontal and 2 Vertical) + G4Box* solidFrameHorizontal = new G4Box(Name + "_Frame", 0.5*SiliconSize, 0.5*(DetectorSize - SiliconSize) / 2, 0.5*FrameThickness*mm) ; + G4Box* solidFrameVertical = new G4Box(Name + "_Frame", 0.5*(DetectorSize - SiliconSize) / 2, 0.5*DetectorSize, 0.5*FrameThickness*mm) ; + + G4LogicalVolume* logicFrameHorizontal = new G4LogicalVolume(solidFrameHorizontal, m_MaterialAl, Name, 0, 0); + G4VisAttributes* VisAtt1 = new G4VisAttributes(G4Colour(0.0, 0.5, 1)); + logicFrameHorizontal->SetVisAttributes(VisAtt1); + + + G4LogicalVolume* logicFrameVertical = new G4LogicalVolume(solidFrameVertical, m_MaterialAl, Name, 0, 0); + logicFrameVertical->SetVisAttributes(VisAtt1); + + G4ThreeVector FrameTopPosition = G4ThreeVector(0 , 0.5 * SiliconSize + 0.5 * (DetectorSize - SiliconSize) / 2 , 0) ; + G4ThreeVector FrameBottomPosition = G4ThreeVector(0 , -0.5 * SiliconSize - 0.5 * (DetectorSize - SiliconSize) / 2 , 0) ; + G4ThreeVector FrameLeftPosition = G4ThreeVector(0.5 * SiliconSize + 0.5 * (DetectorSize - SiliconSize) / 2 , 0 , 0) ; + G4ThreeVector FrameRightPosition = G4ThreeVector(-0.5 * SiliconSize - 0.5 * (DetectorSize - SiliconSize) / 2 , 0 , 0) ; + + + new G4PVPlacement( 0, + FrameTopPosition, + logicFrameHorizontal, + Name + "_Frame", + logicThinSi, + false, + 0); + + new G4PVPlacement( 0, + FrameBottomPosition, + logicFrameHorizontal, + Name + "_Frame", + logicThinSi, + false, + 0); + + new G4PVPlacement( 0, + FrameLeftPosition, + logicFrameVertical, + Name + "_Frame", + logicThinSi, + false, + 0); + + new G4PVPlacement( 0, + FrameRightPosition, + logicFrameVertical, + Name + "_Frame", + logicThinSi, + false, + 0); + + + G4ThreeVector posAluFront = G4ThreeVector(0 , 0 , AluStripFront_PosZ) ; + G4ThreeVector posSi = G4ThreeVector(0 , 0 , 0 ) ; + G4ThreeVector posAluBack = G4ThreeVector(0 , 0 , AluStripBack_PosZ ) ; + + G4Box* solidAlu = + new G4Box("ThinSiAlu", 0.5*SiliconSize, 0.5*SiliconSize, 0.5*AluThickness) ; + + G4LogicalVolume* logicAlu = + new G4LogicalVolume(solidAlu, m_MaterialAl, "logicAlu", 0, 0, 0) ; -//////////////////////////////////////////////////////////////// -/////////General Geometry Parameter Definition ///////////////// -//////////////////////////////////////////////////////////////// -/////// Starting Volume Definition /////// - G4String Name = "ThinSi" + DetectorNumber; + + new G4PVPlacement(0 , posAluFront , logicAlu , Name + "_AluFront" , logicThinSi , true, 0) ; - G4Box* solidThinSi = new G4Box(Name, 0.5*DetectorSize, 0.5*DetectorSize, 0.5*FrameThickness*mm); + new G4PVPlacement(0 , posAluBack , logicAlu , Name + "_AluBack" , logicThinSi , true, 0) ; - G4LogicalVolume* logicThinSi = - new G4LogicalVolume(solidThinSi, m_MaterialVacuum, Name, 0, 0); + G4Box* solidSi = + new G4Box("ThinSi", 0.5*SiliconSize, 0.5*SiliconSize, 0.5*SiliconThickness); - G4PVPlacement( G4Transform3D(*Det_rot, Det_pos) , - logicThinSi , - Name , - world , - false , - 0); + G4LogicalVolume* logicSi = + new G4LogicalVolume(solidSi, m_MaterialSilicon, "logicSi", 0, 0, 0); - // Frame is made of 4 thick box (2 Horizontal and 2 Vertical) - G4Box* solidFrameHorizontal = new G4Box(Name + "_Frame", 0.5*SiliconSize, 0.5*(DetectorSize - SiliconSize) / 2, 0.5*FrameThickness*mm) ; - G4Box* solidFrameVertical = new G4Box(Name + "_Frame", 0.5*(DetectorSize - SiliconSize) / 2, 0.5*DetectorSize, 0.5*FrameThickness*mm) ; + G4VisAttributes* VisAtt2 = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3)); + logicAlu->SetVisAttributes(VisAtt2); - G4LogicalVolume* logicFrameHorizontal = new G4LogicalVolume(solidFrameHorizontal, m_MaterialAl, Name, 0, 0); + new G4PVPlacement(0, posSi, logicSi, Name + "_Si", logicThinSi, true, 0); - G4LogicalVolume* logicFrameVertical = new G4LogicalVolume(solidFrameVertical, m_MaterialAl, Name, 0, 0); + //attach it to the Silicon plate + logicSi ->SetSensitiveDetector(m_StripScorer); +} - G4ThreeVector FrameTopPosition = G4ThreeVector(0 , 0.5 * SiliconSize + 0.5 * (DetectorSize - SiliconSize) / 2 , 0) ; - G4ThreeVector FrameBottomPosition = G4ThreeVector(0 , -0.5 * SiliconSize - 0.5 * (DetectorSize - SiliconSize) / 2 , 0) ; - G4ThreeVector FrameLeftPosition = G4ThreeVector(0.5 * SiliconSize + 0.5 * (DetectorSize - SiliconSize) / 2 , 0 , 0) ; - G4ThreeVector FrameRightPosition = G4ThreeVector(-0.5 * SiliconSize - 0.5 * (DetectorSize - SiliconSize) / 2 , 0 , 0) ; +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Virtual Method of VDetector class - new G4PVPlacement( 0, - FrameTopPosition, - logicFrameHorizontal, - Name + "_Frame", - logicThinSi, - false, - 0); +// Read stream at Configfile to pick-up parameters of detector (Position,...) +// Called in DetecorConstruction::ReadDetextorConfiguration Method +void ThinSi::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 ThinSi 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 ; - new G4PVPlacement( 0, - FrameBottomPosition, - logicFrameHorizontal, - Name + "_Frame", - logicThinSi, - false, - 0); + } - new G4PVPlacement( 0, - FrameLeftPosition, - logicFrameVertical, - Name + "_Frame", - logicThinSi, - false, - 0); + // Else don't toggle to Reading Block Status + else ReadingStatus = false ; - new G4PVPlacement( 0, - FrameRightPosition, - logicFrameVertical, - Name + "_Frame", - logicThinSi, - false, - 0); + // 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' );} - G4ThreeVector posAluFront = G4ThreeVector(0 , 0 , AluStripFront_PosZ) ; - G4ThreeVector posSi = G4ThreeVector(0 , 0 , 0 ) ; - G4ThreeVector posAluBack = G4ThreeVector(0 , 0 , AluStripBack_PosZ ) ; + // Finding another telescope (safety), toggle out + else if (DataBuffer=="SSSD") { + cout << "WARNING: Another Telescope is found before standard sequence of Token, Error may occured in detector definition" << endl ; + ReadingStatus = false ; + } - G4Box* solidAlu = - new G4Box("ThinSiAlu", 0.5*SiliconSize, 0.5*SiliconSize, 0.5*AluThickness) ; + //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); + cout << "Top Left position : (" << TLX << ";" << TLY << ";" << TLZ << ")" << endl; + } - G4LogicalVolume* logicAlu = - new G4LogicalVolume(solidAlu, m_MaterialAl, "logicAlu", 0, 0, 0) ; + 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); + cout << "Top Right position : (" << BLX << ";" << BLY << ";" << BLZ << ")" << endl; + } - new G4PVPlacement(0 , posAluFront , logicAlu , Name + "_AluFront" , logicThinSi , true, 0) ; + 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); + cout << "Bottom Right position : (" << BRX << ";" << BRY << ";" << BRZ << ")" << endl; + } - new G4PVPlacement(0 , posAluBack , logicAlu , Name + "_AluBack" , logicThinSi , true, 0) ; + 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; + } - G4Box* solidSi = - new G4Box("ThinSi", 0.5*SiliconSize, 0.5*SiliconSize, 0.5*SiliconThickness); + //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; + } - G4LogicalVolume* logicSi = - new G4LogicalVolume(solidSi, m_MaterialSilicon, "logicSi", 0, 0, 0); + 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; + } - new G4PVPlacement(0, posSi, logicSi, Name + "_Si", logicThinSi, true, 0); + 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; + } - //attach it to the Silicon plate - logicSi ->SetSensitiveDetector(m_StripScorer); -} + 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 ; + } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// Virtual Method of VDetector class + /////////////////////////////////////////////////// + // 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 ; + } -// Read stream at Configfile to pick-up parameters of detector (Position,...) -// Called in DetecorConstruction::ReadDetextorConfiguration Method -void ThinSi::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 ThinSi 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 ; - - } - - // 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 found before standard sequence of Token, Error may occured in detector definition" << endl ; - 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); - cout << "Top Left position : (" << TLX << ";" << TLY << ";" << TLZ << ")" << endl; - } - - 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); - cout << "Top Right position : (" << BLX << ";" << BLY << ";" << BLZ << ")" << endl; - } - - 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); - cout << "Bottom Right position : (" << BRX << ";" << BRY << ";" << BRZ << ")" << endl; - } - - 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; - 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) { - 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 ; - - } - - } - } + } + } } // Construct detector and inialise sensitive part. // Called After DetecorConstruction::AddDetector Method -void ThinSi::ConstructDetector(G4LogicalVolume* world) -{ - G4RotationMatrix* Det_rot = NULL; - G4ThreeVector Det_pos = G4ThreeVector(0, 0, 0); - G4ThreeVector Det_u = G4ThreeVector(0, 0, 0); - G4ThreeVector Det_v = G4ThreeVector(0, 0, 0); - G4ThreeVector Det_w = G4ThreeVector(0, 0, 0); - - G4int NumberOfDetector = m_DefinitionType.size(); - - for (G4int i = 0 ; i < NumberOfDetector ; i++) { - // By Point - if (m_DefinitionType[i]) { - // (u,v,w) unitary vector associated to telescope referencial - // (u,v) // to silicon plan - // w perpendicular to (u,v) plan and pointing outside - Det_u = m_TL[i] - m_BL[i]; - Det_u = Det_u.unit(); - Det_v = m_BR[i] - m_BL[i]; - Det_v = Det_v.unit(); - Det_w = Det_u.cross(Det_v); - Det_w = Det_w.unit(); - // Passage Matrix from Lab Referential to Telescope Referential - // MUST2 - Det_rot = new G4RotationMatrix(Det_u, Det_v, Det_w); - // translation to place Telescope - Det_pos = (m_TR[i]+m_TL[i]+m_BL[i]+m_BR[i])/4 ; +void ThinSi::ConstructDetector(G4LogicalVolume* world){ + + G4RotationMatrix* Det_rot = NULL; + G4ThreeVector Det_pos = G4ThreeVector(0, 0, 0); + G4ThreeVector Det_u = G4ThreeVector(0, 0, 0); + G4ThreeVector Det_v = G4ThreeVector(0, 0, 0); + G4ThreeVector Det_w = G4ThreeVector(0, 0, 0); + + G4int NumberOfDetector = m_DefinitionType.size(); + + for (G4int i = 0 ; i < NumberOfDetector ; i++) { + // By Point + if (m_DefinitionType[i]) { + // (u,v,w) unitary vector associated to telescope referencial + // (u,v) // to silicon plan + // w perpendicular to (u,v) plan and pointing outside + Det_u = m_TL[i] - m_BL[i]; + Det_u = Det_u.unit(); + Det_v = m_BR[i] - m_BL[i]; + Det_v = Det_v.unit(); + Det_w = Det_u.cross(Det_v); + Det_w = Det_w.unit(); + // Passage Matrix from Lab Referential to Telescope Referential + // MUST2 + Det_rot = new G4RotationMatrix(Det_u, Det_v, Det_w); + // translation to place Telescope + Det_pos = (m_TR[i]+m_TL[i]+m_BL[i]+m_BR[i])/4 ; + } + + // By Angle + else { + G4double Theta = m_Theta[i]; + G4double Phi = m_Phi[i]; + //This part because if Phi and Theta = 0 equation are false + if (Theta == 0) Theta = 0.0001; + if (Theta == 2*cos(0)) Theta = 2 * acos(0) - 0.00001; + if (Phi == 0) Phi = 0.0001; + + + // (u,v,w) unitary vector associated to telescope referencial + // (u,v) // to silicon plan + // w perpendicular to (u,v) plan and pointing ThirdStage + // Phi is angle between X axis and projection in (X,Y) plan + // Theta is angle between position vector and z axis + G4double wX = m_R[i] * sin(Theta / rad) * cos(Phi / rad) ; + G4double wY = m_R[i] * sin(Theta / rad) * sin(Phi / rad) ; + G4double wZ = m_R[i] * cos(Theta / rad); + Det_w = G4ThreeVector(wX, wY, wZ); + + // vector corresponding to the center of the module + G4ThreeVector CT = Det_w; + + // vector parallel to one axis of silicon plane + G4double ii = cos(Theta / rad) * cos(Phi / rad); + G4double jj = cos(Theta / rad) * sin(Phi / rad); + G4double kk = -sin(Theta / rad); + G4ThreeVector Y = G4ThreeVector(ii, jj, kk); + + Det_w = Det_w.unit(); + Det_u = Det_w.cross(Y); + Det_v = Det_w.cross(Det_u); + Det_v = Det_v.unit(); + Det_u = Det_u.unit(); + + // Passage Matrix from Lab Referential to Telescope Referential + // MUST2 + Det_rot = new G4RotationMatrix(Det_u, Det_v, Det_w); + // Telescope is rotate of Beta angle around Det_v axis. + Det_rot->rotate(m_beta_u[i], Det_u); + Det_rot->rotate(m_beta_v[i], Det_v); + Det_rot->rotate(m_beta_w[i], Det_w); + // translation to place Telescope + Det_pos = Det_w + CT ; + } + + + + VolumeMaker(i + 1 , Det_pos , Det_rot , world); + } + + delete Det_rot ; +} + +// Add Detector branch to the EventTree. +// Called After DetecorConstruction::AddDetector Method +void ThinSi::InitializeRootOutput(){ + RootOutput *pAnalysis = RootOutput::getInstance(); + TTree *pTree = pAnalysis->GetTree(); + pTree->Branch("SSSD", "TSSSDData", &m_Event) ; +} + +// Read sensitive part and fill the Root tree. +// Called at in the EventAction::EndOfEventAvtion +void ThinSi::ReadSensitive(const G4Event* event){ + m_Event->Clear(); + ////////////////////////////////////////////////////////////////////////////////////// + //////////////////////// Used to Read Event Map of detector ////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + + // Si + G4THitsMap<G4int>* DetNbrHitMap; + G4THitsMap<G4int>* StripNbrHitMap; + G4THitsMap<G4double>* EnergyHitMap; + G4THitsMap<G4double>* TimeHitMap; + + std::map<G4int, G4int*>::iterator DetNbr_itr ; + std::map<G4int, G4int*>::iterator StripNbr_itr ; + std::map<G4int, G4double*>::iterator Energy_itr ; + std::map<G4int, G4double*>::iterator Time_itr ; + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + // Read the Scorer associate to the Silicon Strip + + //DetectorNumber + G4int DetNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("ThinSi_StripScorer/DetectorNumber"); + DetNbrHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(DetNbrCollectionID)); + DetNbr_itr = DetNbrHitMap->GetMap()->begin(); + + //StripNumber + G4int StripNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("ThinSi_StripScorer/StripNumber"); + StripNbrHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripNbrCollectionID)); + + //Energy + G4int StripEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("ThinSi_StripScorer/StripEnergy"); + EnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripEnergyCollectionID)); + + //Time + G4int StripTimeCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("ThinSi_StripScorer/StripTime"); + TimeHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripTimeCollectionID)); + + G4int sizeN = DetNbrHitMap ->entries(); + G4int sizeS = StripNbrHitMap ->entries(); + G4int sizeE = EnergyHitMap ->entries(); + G4int sizeT = TimeHitMap ->entries(); + + // Loop on Det Number + for (G4int l = 0 ; l < sizeN ; l++) + { + G4int N = *(DetNbr_itr->second); + G4int NTrackID = DetNbr_itr->first - N; + + if (N > 0) + { + m_Event->SetEnergyDetectorNbr(N); + m_Event->SetTimeDetectorNbr(N); + + // Strip Number + StripNbr_itr = StripNbrHitMap->GetMap()->begin(); + for (G4int h = 0 ; h < sizeS ; h++) { + G4int STrackID = StripNbr_itr->first - N ; + G4int S = *(StripNbr_itr->second); + + if (STrackID == NTrackID) { + m_Event->SetEnergyStripNbr(S); + m_Event->SetTimeStripNbr(S); + } + + StripNbr_itr++; } - // By Angle - else { - G4double Theta = m_Theta[i]; - G4double Phi = m_Phi[i]; - //This part because if Phi and Theta = 0 equation are false - if (Theta == 0) Theta = 0.0001; - if (Theta == 2*cos(0)) Theta = 2 * acos(0) - 0.00001; - if (Phi == 0) Phi = 0.0001; - - - // (u,v,w) unitary vector associated to telescope referencial - // (u,v) // to silicon plan - // w perpendicular to (u,v) plan and pointing ThirdStage - // Phi is angle between X axis and projection in (X,Y) plan - // Theta is angle between position vector and z axis - G4double wX = m_R[i] * sin(Theta / rad) * cos(Phi / rad) ; - G4double wY = m_R[i] * sin(Theta / rad) * sin(Phi / rad) ; - G4double wZ = m_R[i] * cos(Theta / rad); - Det_w = G4ThreeVector(wX, wY, wZ); - - // vector corresponding to the center of the module - G4ThreeVector CT = Det_w; - - // vector parallel to one axis of silicon plane - G4double ii = cos(Theta / rad) * cos(Phi / rad); - G4double jj = cos(Theta / rad) * sin(Phi / rad); - G4double kk = -sin(Theta / rad); - G4ThreeVector Y = G4ThreeVector(ii, jj, kk); - - Det_w = Det_w.unit(); - Det_u = Det_w.cross(Y); - Det_v = Det_w.cross(Det_u); - Det_v = Det_v.unit(); - Det_u = Det_u.unit(); - - // Passage Matrix from Lab Referential to Telescope Referential - // MUST2 - Det_rot = new G4RotationMatrix(Det_u, Det_v, Det_w); - // Telescope is rotate of Beta angle around Det_v axis. - Det_rot->rotate(m_beta_u[i], Det_u); - Det_rot->rotate(m_beta_v[i], Det_v); - Det_rot->rotate(m_beta_w[i], Det_w); - // translation to place Telescope - Det_pos = Det_w + CT ; + // 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, ResoEnergy ) ); + } + + 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); - VolumeMaker(i + 1 , Det_pos , Det_rot , world); - } + if (TTrackID == NTrackID) { + m_Event->SetTime( RandGauss::shoot(T, ResoTime ) ); + } - delete Det_rot ; -} + Time_itr++; + } -// Add Detector branch to the EventTree. -// Called After DetecorConstruction::AddDetector Method -void ThinSi::InitializeRootOutput() -{ - RootOutput *pAnalysis = RootOutput::getInstance(); - TTree *pTree = pAnalysis->GetTree(); - pTree->Branch("SSSD", "TSSSDData", &m_Event) ; -} + } -// Read sensitive part and fill the Root tree. -// Called at in the EventAction::EndOfEventAvtion -void ThinSi::ReadSensitive(const G4Event* event) -{ - m_Event->Clear(); -////////////////////////////////////////////////////////////////////////////////////// -//////////////////////// Used to Read Event Map of detector ////////////////////////// -////////////////////////////////////////////////////////////////////////////////////// - -// Si - G4THitsMap<G4int>* DetNbrHitMap; - G4THitsMap<G4int>* StripNbrHitMap; - G4THitsMap<G4double>* EnergyHitMap; - G4THitsMap<G4double>* TimeHitMap; - - std::map<G4int, G4int*>::iterator DetNbr_itr ; - std::map<G4int, G4int*>::iterator StripNbr_itr ; - std::map<G4int, G4double*>::iterator Energy_itr ; - std::map<G4int, G4double*>::iterator Time_itr ; -////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////// - // Read the Scorer associate to the Silicon Strip - - //DetectorNumber - G4int DetNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("ThinSi_StripScorer/DetectorNumber"); - DetNbrHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(DetNbrCollectionID)); - DetNbr_itr = DetNbrHitMap->GetMap()->begin(); - - //StripNumber - G4int StripNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("ThinSi_StripScorer/StripNumber"); - StripNbrHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripNbrCollectionID)); - - //Energy - G4int StripEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("ThinSi_StripScorer/StripEnergy"); - EnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripEnergyCollectionID)); - - //Time - G4int StripTimeCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("ThinSi_StripScorer/StripTime"); - TimeHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripTimeCollectionID)); - - G4int sizeN = DetNbrHitMap ->entries(); - G4int sizeS = StripNbrHitMap ->entries(); - G4int sizeE = EnergyHitMap ->entries(); - G4int sizeT = TimeHitMap ->entries(); - - // Loop on Det Number - for (G4int l = 0 ; l < sizeN ; l++) - { - G4int N = *(DetNbr_itr->second); - G4int NTrackID = DetNbr_itr->first - N; - - if (N > 0) - { - m_Event->SetEnergyDetectorNbr(N); - m_Event->SetTimeDetectorNbr(N); - - // Strip Number - StripNbr_itr = StripNbrHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < sizeS ; h++) { - G4int STrackID = StripNbr_itr->first - N ; - G4int S = *(StripNbr_itr->second); - - if (STrackID == NTrackID) { - m_Event->SetEnergyStripNbr(S); - m_Event->SetTimeStripNbr(S); - } - - StripNbr_itr++; - } - - // 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, ResoEnergy ) ); - } - - 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++; - } - - } - - DetNbr_itr++; - } - - // clear map for next event - - DetNbrHitMap ->clear(); - StripNbrHitMap ->clear(); - EnergyHitMap ->clear(); - TimeHitMap ->clear(); + DetNbr_itr++; + } + + // clear map for next event + + DetNbrHitMap ->clear(); + StripNbrHitMap ->clear(); + EnergyHitMap ->clear(); + TimeHitMap ->clear(); } -void ThinSi::InitializeScorers() - { +void ThinSi::InitializeScorers(){ - // Silicon Associate Scorer - m_StripScorer = new G4MultiFunctionalDetector("ThinSi_StripScorer"); - - G4VPrimitiveScorer* DetNbr = new GENERALSCORERS::PSDetectorNumber("DetectorNumber","ThinSi_", 0); - G4VPrimitiveScorer* StripNbr = new PSStripNumber("StripNumber",0,SiliconSize, NumberOfStrip); - G4VPrimitiveScorer* Energy = new GENERALSCORERS::PSEnergy("StripEnergy","ThinSi_", 0); - G4VPrimitiveScorer* TOF = new GENERALSCORERS::PSTOF("StripTime","ThinSi_", 0); - + // Silicon Associate Scorer + m_StripScorer = new G4MultiFunctionalDetector("ThinSi_StripScorer"); - //and register it to the multifunctionnal detector - m_StripScorer->RegisterPrimitive(DetNbr); - m_StripScorer->RegisterPrimitive(StripNbr); - m_StripScorer->RegisterPrimitive(Energy); - m_StripScorer->RegisterPrimitive(TOF); + G4VPrimitiveScorer* DetNbr = new GENERALSCORERS::PSDetectorNumber("DetectorNumber","ThinSi_", 0); + G4VPrimitiveScorer* StripNbr = new PSStripNumber("StripNumber",0,SiliconSize, NumberOfStrip); + G4VPrimitiveScorer* Energy = new GENERALSCORERS::PSEnergy("StripEnergy","ThinSi_", 0); + G4VPrimitiveScorer* TOF = new GENERALSCORERS::PSTOF("StripTime","ThinSi_", 0); - // Add All Scorer to the Global Scorer Manager - G4SDManager::GetSDMpointer()->AddNewDetector(m_StripScorer) ; - } + + //and register it to the multifunctionnal detector + m_StripScorer->RegisterPrimitive(DetNbr); + m_StripScorer->RegisterPrimitive(StripNbr); + m_StripScorer->RegisterPrimitive(Energy); + m_StripScorer->RegisterPrimitive(TOF); + + // Add All Scorer to the Global Scorer Manager + G4SDManager::GetSDMpointer()->AddNewDetector(m_StripScorer) ; +} //////////////////////////////////////////////////////////////// /////////////////Material Definition /////////////////////////// //////////////////////////////////////////////////////////////// -void ThinSi::InitializeMaterial() - { - - G4Element* N = new G4Element("Nitrogen" , "N" , 7 , 14.01 * g / mole); - G4Element* O = new G4Element("Oxigen" , "O" , 8 , 16.00 * g / mole); - - G4double a, z, density; - // Si - a = 28.0855 * g / mole; - density = 2.321 * g / cm3; - m_MaterialSilicon = new G4Material("Si", z = 14., a, density); - - // Al - density = 2.702 * g / cm3; - a = 26.98 * g / mole; - m_MaterialAl = new G4Material("Al", z = 13., a, density); - - // Vacuum - density = 0.000000001 * mg / cm3; - m_MaterialVacuum = new G4Material("Vacuum", density, 2); - m_MaterialVacuum->AddElement(N, .7); - m_MaterialVacuum->AddElement(O, .3); - } - - +void ThinSi::InitializeMaterial(){ + + G4Element* N = new G4Element("Nitrogen" , "N" , 7 , 14.01 * g / mole); + G4Element* O = new G4Element("Oxigen" , "O" , 8 , 16.00 * g / mole); + + G4double a, z, density; + // Si + a = 28.0855 * g / mole; + density = 2.321 * g / cm3; + m_MaterialSilicon = new G4Material("Si", z = 14., a, density); + + // Al + density = 2.702 * g / cm3; + a = 26.98 * g / mole; + m_MaterialAl = new G4Material("Al", z = 13., a, density); + + // Vacuum + density = 0.000000001 * mg / cm3; + m_MaterialVacuum = new G4Material("Vacuum", density, 2); + m_MaterialVacuum->AddElement(N, .7); + m_MaterialVacuum->AddElement(O, .3); +} + + diff --git a/NPSimulation/scripts/copyfiles.sh b/NPSimulation/scripts/copyfiles.sh index 0e22fa6d0ae049ea69fd28134f49ce877196ed01..b963dec729314bc1767a84c99776ca84f71ab02d 100755 --- a/NPSimulation/scripts/copyfiles.sh +++ b/NPSimulation/scripts/copyfiles.sh @@ -42,7 +42,7 @@ do # only copy files associated to defined detector libraries if echo "$detectorlibs" | grep -q "$ldir" ; then # print informations - echo " + Copying files from $ldir directory..." + # echo " + Copying files from $ldir directory..." # enter directory cd $dir # loop on files in directory diff --git a/NPSimulation/src/DetectorConstruction.cc b/NPSimulation/src/DetectorConstruction.cc index dbc6c65a41ed7488386b0a3808df8add5a6a7b94..d181b4534109b2b13751065a289d82771ce827c1 100644 --- a/NPSimulation/src/DetectorConstruction.cc +++ b/NPSimulation/src/DetectorConstruction.cc @@ -139,23 +139,20 @@ DetectorConstruction::~DetectorConstruction(){ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4VPhysicalVolume* DetectorConstruction::Construct(){ //------------------------------------------------------ materials - G4double a; // atomic mass G4double z; // atomic number G4double density; - G4Element* N = new G4Element("Nitrogen", "N", z = 7., a = 14.01 * g / mole); G4Element* O = new G4Element("Oxygen" , "O", z = 8., a = 16.00 * g / mole); // Vacuum density = 0.000000001 * mg / cm3; G4Material* Vacuum = new G4Material("Vacuum", density, 2); - Vacuum->AddElement(N, .7); - Vacuum->AddElement(O, .3); + Vacuum->AddElement(N,.7); + Vacuum->AddElement(O,.3); //------------------------------world volume - G4double world_x = 10.0 * m; G4double world_y = 10.0 * m; G4double world_z = 10.0 * m; @@ -164,10 +161,9 @@ G4VPhysicalVolume* DetectorConstruction::Construct(){ = new G4Box("world_box", world_x, world_y, world_z); world_log = new G4LogicalVolume(world_box, Vacuum, "world_log", 0, 0, 0); - world_phys = new G4PVPlacement(0, G4ThreeVector(), world_log, "world", 0, false, 0); - // G4VisAttributes* VisAtt = new G4VisAttributes(G4Colour(0.2, 0.2, 0.2)); + //G4VisAttributes* VisAtt = new G4VisAttributes(G4Colour(0.2, 0.2, 0.2)); G4VisAttributes* VisAtt = new G4VisAttributes(G4VisAttributes::Invisible); world_log->SetVisAttributes(VisAtt); diff --git a/NPSimulation/src/EventGeneratorTwoBodyReaction.cc b/NPSimulation/src/EventGeneratorTwoBodyReaction.cc index 0a421521c0b029f39cc293e782bbc89572e498e9..7cc5671b00af05f565a41b2776e0577addf819a4 100644 --- a/NPSimulation/src/EventGeneratorTwoBodyReaction.cc +++ b/NPSimulation/src/EventGeneratorTwoBodyReaction.cc @@ -126,6 +126,9 @@ void EventGeneratorTwoBodyReaction::GenerateEvent(G4Event* anEvent){ G4int HeavyZ = m_Reaction->GetNucleus4()->GetZ() ; G4int HeavyA = m_Reaction->GetNucleus4()->GetA() ; + // Generate the excitation energy if a distribution is given + m_Reaction->ShootRandomExcitationEnergy(); + G4ParticleDefinition* HeavyName = G4ParticleTable::GetParticleTable()->GetIon(HeavyZ, HeavyA, m_Reaction->GetExcitation4()*MeV); diff --git a/NPSimulation/vis.mac b/NPSimulation/vis.mac index b85652b8a2f9da8f8f3daf162bcb94b136494303..9150d12e36fbabcfe951c94dd7357592d0517075 100644 --- a/NPSimulation/vis.mac +++ b/NPSimulation/vis.mac @@ -8,7 +8,7 @@ /run/verbose 2 # # Use this open statement to create an OpenGL view: -#/vis/open OGLIQt 600x600-0+0 +/vis/open OGLIQt 600x600-0+0 # # Use this open statement to create a .prim file suitable for # viewing in DAWN: @@ -20,7 +20,7 @@ # # Use this open statement to create a .wrl file suitable for # viewing in a VRML viewer: -/vis/open VRML2FILE +#/vis/open VRML2FILE # # Disable auto refresh and quieten vis messages whilst scene and # trajectories are established: