modified: MakeVertex.C
new file: sx3cal/sx3cal/EXFit.C new file: sx3cal/sx3cal/LRFit.C new file: sx3cal/sx3cal/backgains.dat new file: sx3cal/sx3cal/backgains.dat.unity new file: sx3cal/sx3cal/frontgains.dat new file: sx3cal/sx3cal/frontgains.dat.unity new file: sx3cal/sx3cal/rightgains.dat new file: sx3cal/sx3cal/rightgains.dat.unity
This commit is contained in:
parent
7260d42d8d
commit
00f8460e36
535
MakeVertex.C
535
MakeVertex.C
|
|
@ -3,6 +3,7 @@
|
||||||
#include "MakeVertex.h"
|
#include "MakeVertex.h"
|
||||||
#include "Armory/ClassPW.h"
|
#include "Armory/ClassPW.h"
|
||||||
#include "Armory/HistPlotter.h"
|
#include "Armory/HistPlotter.h"
|
||||||
|
#include "Armory/SX3Geom.h"
|
||||||
|
|
||||||
#include <TH2.h>
|
#include <TH2.h>
|
||||||
#include <TStyle.h>
|
#include <TStyle.h>
|
||||||
|
|
@ -14,6 +15,8 @@
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <vector>
|
||||||
|
#include <array>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
@ -23,29 +26,21 @@ PW pw_contr;
|
||||||
PW pwinstance;
|
PW pwinstance;
|
||||||
TVector3 hitPos;
|
TVector3 hitPos;
|
||||||
double qqqenergy, qqqtimestamp;
|
double qqqenergy, qqqtimestamp;
|
||||||
|
class Event {
|
||||||
class Event
|
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
Event(TVector3 p, double e1, double e2, double t1, double t2) : pos(p), Energy1(e1), Energy2(e2), Time1(t1), Time2(t2) {}
|
Event(TVector3 p, double e1, double e2, double t1, double t2) : pos(p), Energy1(e1), Energy2(e2), Time1(t1), Time2(t2) {}
|
||||||
Event(TVector3 p, double e1, double e2, double t1, double t2, int c1, int c2) : pos(p), Energy1(e1), Energy2(e2), Time1(t1), Time2(t2), ch2(c1), ch1(c1) {}
|
Event(TVector3 p, double e1, double e2, double t1, double t2, int c1, int c2) : pos(p), Energy1(e1), Energy2(e2), Time1(t1), Time2(t2), ch1(c1), ch2(c2) {}
|
||||||
|
|
||||||
|
TVector3 pos;
|
||||||
|
int ch1=-1; //int(ch1/16) gives qqq id, ch1%16 gives ring#
|
||||||
|
int ch2=-1; //int(ch2/16) gives qqq id, ch2%16 gives wedge#
|
||||||
|
double Energy1=-1; //Front for QQQ, Anode for PC
|
||||||
|
double Energy2=-1; //Back for QQQ, Cathode for PC
|
||||||
|
double Time1=-1;
|
||||||
|
double Time2=-1;
|
||||||
|
|
||||||
TVector3 pos;
|
|
||||||
int ch1 = -1; // int(ch1/16) gives qqq id, ch1%16 gives ring#
|
|
||||||
int ch2 = -1; // int(ch2/16) gives qqq id, ch2%16 gives wedge#
|
|
||||||
double Energy1 = -1; // Front for QQQ, Anode for PC
|
|
||||||
double Energy2 = -1; // Back for QQQ, Cathode for PC
|
|
||||||
double Time1 = -1;
|
|
||||||
double Time2 = -1;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*std::vector<Event>
|
|
||||||
Make_QQQClusters(const std::unordered_map<int,Event>& qqqvec) {
|
|
||||||
std::vector<Event> qqqevents; //input events, but combine NN energies
|
|
||||||
|
|
||||||
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// Calibration globals
|
// Calibration globals
|
||||||
const int MAX_QQQ = 4;
|
const int MAX_QQQ = 4;
|
||||||
const int MAX_RING = 16;
|
const int MAX_RING = 16;
|
||||||
|
|
@ -56,6 +51,11 @@ double qqqCalib[MAX_QQQ][MAX_RING][MAX_WEDGE] = {{{0}}};
|
||||||
bool qqqCalibValid[MAX_QQQ][MAX_RING][MAX_WEDGE] = {{{false}}};
|
bool qqqCalibValid[MAX_QQQ][MAX_RING][MAX_WEDGE] = {{{false}}};
|
||||||
// TCutg *cutQQQ;
|
// TCutg *cutQQQ;
|
||||||
|
|
||||||
|
double sx3BackGain[24][4][4] = {{{1.}}};
|
||||||
|
double sx3FrontGain[24][4] = {{1.}};
|
||||||
|
double sx3FrontOffset[24][4] = {{0.}};
|
||||||
|
double sx3RightGain[24][4] = {{1.}};
|
||||||
|
|
||||||
// PC Arrays
|
// PC Arrays
|
||||||
double pcSlope[48];
|
double pcSlope[48];
|
||||||
double pcIntercept[48];
|
double pcIntercept[48];
|
||||||
|
|
@ -69,8 +69,7 @@ bool qqqEcut;
|
||||||
void MakeVertex::Begin(TTree * /*tree*/)
|
void MakeVertex::Begin(TTree * /*tree*/)
|
||||||
{
|
{
|
||||||
TString option = GetOption();
|
TString option = GetOption();
|
||||||
plotter = new HistPlotter("Analyzer_QQQ.root", "TFILE");
|
plotter = new HistPlotter("Analyzer_SX3.root", "TFILE");
|
||||||
|
|
||||||
pw_contr.ConstructGeo();
|
pw_contr.ConstructGeo();
|
||||||
pwinstance.ConstructGeo();
|
pwinstance.ConstructGeo();
|
||||||
|
|
||||||
|
|
@ -107,7 +106,7 @@ void MakeVertex::Begin(TTree * /*tree*/)
|
||||||
Crossover[i][j][0].y = pwinstance.An[i].first.Y() + alpha * a.Y();
|
Crossover[i][j][0].y = pwinstance.An[i].first.Y() + alpha * a.Y();
|
||||||
Crossover[i][j][0].z = pwinstance.An[i].first.Z() + alpha * a.Z();
|
Crossover[i][j][0].z = pwinstance.An[i].first.Z() + alpha * a.Z();
|
||||||
|
|
||||||
if (Crossover[i][j][0].z < -190 || Crossover[i][j][0].z > 190 || (i + j) % 24 == 12)
|
if (Crossover[i][j][0].z < -190 || Crossover[i][j][0].z > 190 || (i+j)%24 == 12)
|
||||||
{
|
{
|
||||||
Crossover[i][j][0].z = 9999999;
|
Crossover[i][j][0].z = 9999999;
|
||||||
}
|
}
|
||||||
|
|
@ -193,13 +192,39 @@ void MakeVertex::Begin(TTree * /*tree*/)
|
||||||
infile.close();
|
infile.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
std::ifstream infile("sx3cal/backgains.dat");
|
||||||
|
std::string temp;
|
||||||
|
int backpos, frontpos, clkpos;
|
||||||
|
std::cout << "foo" << std::endl;
|
||||||
|
if (infile.is_open())
|
||||||
|
while(infile>>clkpos>>temp>>frontpos>>temp>>backpos>>sx3BackGain[clkpos][frontpos][backpos])
|
||||||
|
std::cout << sx3BackGain[clkpos][frontpos][backpos] << std::endl;
|
||||||
|
infile.close();
|
||||||
|
|
||||||
|
infile.open("sx3cal/frontgains.dat");
|
||||||
|
if (infile.is_open())
|
||||||
|
while(infile>>clkpos>>temp>>temp>>frontpos>>sx3FrontOffset[clkpos][frontpos]>>sx3FrontGain[clkpos][frontpos])
|
||||||
|
std::cout << sx3FrontOffset[clkpos][frontpos] << " " << sx3FrontGain[clkpos][frontpos] << std::endl;
|
||||||
|
infile.close();
|
||||||
|
|
||||||
|
infile.open("sx3cal/rightgains.dat");
|
||||||
|
if (infile.is_open())
|
||||||
|
while(infile>>clkpos>>frontpos>>temp>>sx3RightGain[clkpos][frontpos]) {
|
||||||
|
sx3RightGain[clkpos][frontpos]=TMath::Abs(sx3RightGain[clkpos][frontpos]);
|
||||||
|
}
|
||||||
|
infile.close();
|
||||||
|
|
||||||
|
}
|
||||||
|
std::cout << "aaa" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool_t MakeVertex::Process(Long64_t entry)
|
Bool_t MakeVertex::Process(Long64_t entry)
|
||||||
{
|
{
|
||||||
hitPos.Clear();
|
hitPos.Clear();
|
||||||
qqqenergy = -1;
|
qqqenergy = -1;
|
||||||
qqqtimestamp = -1;
|
qqqtimestamp=-1;
|
||||||
HitNonZero = false;
|
HitNonZero = false;
|
||||||
bool qqq1000cut = false;
|
bool qqq1000cut = false;
|
||||||
b_sx3Multi->GetEntry(entry);
|
b_sx3Multi->GetEntry(entry);
|
||||||
|
|
@ -222,89 +247,117 @@ Bool_t MakeVertex::Process(Long64_t entry)
|
||||||
qqq.CalIndex();
|
qqq.CalIndex();
|
||||||
pc.CalIndex();
|
pc.CalIndex();
|
||||||
|
|
||||||
// if(sx3.multi>1) {
|
std::vector<Event> sx3Events;
|
||||||
// std::cout << "-----" << std::endl;
|
if(sx3.multi>1) {
|
||||||
// for(int i=0; i<sx3.multi; i++) {
|
std::array<sx3det,12> Fsx3;
|
||||||
// std::cout << std::setprecision(16) << "sx3"<< sx3.id[i] << " " << sx3.ch[i] << " " << sx3.e[i] << " " << sx3.t[i] - sx3.t[0] << std::endl;
|
//std::cout << "-----" << std::endl;
|
||||||
// }
|
for(int i=0; i<sx3.multi; i++) {
|
||||||
// }
|
if(sx3.id[i]>=12) continue;
|
||||||
// return kTRUE;
|
int id = sx3.id[i];
|
||||||
|
if(sx3.ch[i]>=8) {
|
||||||
|
int sx3ch=sx3.ch[i]-8;
|
||||||
|
sx3ch=(sx3ch+3)%4;
|
||||||
|
if(sx3ch==0 || sx3ch==3) continue;
|
||||||
|
float value=sx3.e[i];
|
||||||
|
int gch = sx3.id[i]*4+(sx3.ch[i]-8);
|
||||||
|
Fsx3.at(id).fillevent("BACK",sx3ch,value);
|
||||||
|
Fsx3.at(id).ts = static_cast<double>(sx3.t[i]);
|
||||||
|
plotter->Fill2D("sx3backs_raw",100,0,100,800,0,4096,gch,sx3.e[i]);
|
||||||
|
} else {
|
||||||
|
int sx3ch=sx3.ch[i]/2;
|
||||||
|
double value=sx3.e[i];
|
||||||
|
if(sx3.ch[i]%2==0) {
|
||||||
|
Fsx3.at(id).fillevent("FRONT_L",sx3ch,value*sx3RightGain[id][sx3ch]);
|
||||||
|
} else {
|
||||||
|
Fsx3.at(id).fillevent("FRONT_R",sx3ch,value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int id=0; id<12; id++) {
|
||||||
|
Fsx3.at(id).validate();
|
||||||
|
auto det = Fsx3.at(id);
|
||||||
|
bool no_charge_sharing_strict = det.valid_front_chans.size()==1 && det.valid_back_chans.size()==1;
|
||||||
|
if(det.valid) {
|
||||||
|
//std::cout << det.frontEL << " " << det.frontEL*sx3RightGain[id][det.stripF] << std::endl;
|
||||||
|
plotter->Fill2D("be_vs_x_sx3_id_"+std::to_string(id)+"_f"+std::to_string(det.stripF)+"_b"+std::to_string(det.stripB),200,-1,1,800,0,8192,
|
||||||
|
det.frontX,det.backE,"evsx");
|
||||||
|
//std::cout << sx3BackGain[id][det.stripF][det.stripB] << " " << sx3FrontGain[id][det.stripF] << std::endl;
|
||||||
|
plotter->Fill2D("matched_be_vs_x_sx3_id_"+std::to_string(id)+"_f"+std::to_string(det.stripF),200,-30,30,800,0,8192,
|
||||||
|
det.frontX*sx3FrontGain[id][det.stripF]+sx3FrontOffset[id][det.stripF],det.backE*sx3BackGain[id][det.stripF][det.stripB],"evsx_matched");
|
||||||
|
//plotter->Fill2D("fe_vs_x_sx3_id_"+std::to_string(id)+"_f"+std::to_string(det.stripF)+"_"+std::to_string(det.stripB),200,-1,1,800,0,4096,det.frontX,det.backE,"evsx");
|
||||||
|
plotter->Fill2D("l_vs_r_sx3_id_"+std::to_string(id)+"_f"+std::to_string(det.stripF),800,0,4096,800,0,4096,det.frontEL,det.frontER,"l_vs_r");
|
||||||
|
}
|
||||||
|
if(det.valid && (id ==9 || id==7 || id == 1 || id==3) && det.stripF!=DEFAULT_NULL && det.stripB!=DEFAULT_NULL) {
|
||||||
|
double z = det.frontX*sx3FrontGain[id][det.stripF]+sx3FrontOffset[id][det.stripF];
|
||||||
|
double backE = det.backE*sx3BackGain[id][det.stripF][det.stripB];
|
||||||
|
Event sx3ev(TVector3(0,0,z),backE,-1,det.ts,-1,det.stripB+4*id,det.stripF+4*id);
|
||||||
|
sx3Events.push_back(sx3ev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//return kTRUE;
|
||||||
// QQQ Processing
|
// QQQ Processing
|
||||||
|
|
||||||
int qqqCount = 0;
|
int qqqCount = 0;
|
||||||
int qqqAdjCh = 0;
|
int qqqAdjCh = 0;
|
||||||
// REMOVE WHEN RERUNNING USING THE NEW CALIBRATION FILE
|
// REMOVE WHEN RERUNNING USING THE NEW CALIBRATION FILE
|
||||||
// for (int i = 0; i < qqq.multi; i++)
|
for (int i = 0; i < qqq.multi; i++)
|
||||||
// {
|
{
|
||||||
// //if ((qqq.id[i] == 3 || qqq.id[i] == 1) && qqq.ch[i] < 16)
|
//if ((qqq.id[i] == 3 || qqq.id[i] == 1) && qqq.ch[i] < 16)
|
||||||
// if (qqq.id[i] == 1 && qqq.ch[i] < 16) //for run 12, 26Al
|
if (qqq.id[i] == 1 && qqq.ch[i] < 16) //for run 12, 26Al
|
||||||
// {
|
{
|
||||||
// qqq.ch[i] = 16 - qqq.ch[i];
|
qqq.ch[i] = 16 - qqq.ch[i];
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// for (int i = 0; i < qqq.multi; i++)
|
for (int i = 0; i < qqq.multi; i++)
|
||||||
// {
|
{
|
||||||
// if (qqq.id[i] == 0 && qqq.ch[i] >= 16)
|
if (qqq.id[i] == 0 && qqq.ch[i] >= 16)
|
||||||
// {
|
{
|
||||||
// qqq.ch[i] = 31 - qqq.ch[i] + 16;
|
qqq.ch[i] = 31 - qqq.ch[i] + 16;
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
std::vector<Event> QQQ_Events, PC_Events;
|
std::vector<Event> QQQ_Events, PC_Events;
|
||||||
std::vector<Event> QQQ_Events_Raw, PC_Events_Raw;
|
std::vector<Event> QQQ_Events_Raw, PC_Events_Raw;
|
||||||
|
std::vector<Event> QQQ_Events2; //clustering done
|
||||||
|
|
||||||
std::unordered_map<int, std::tuple<int, int, double, double>> qvecr[4], qvecw[4];
|
std::unordered_map<int,std::tuple<int,int,double,double>> qvecr[4], qvecw[4];
|
||||||
if (qqq.multi > 1)
|
if(qqq.multi>1) {
|
||||||
{
|
//if(qqq.multi>=3) std::cout << "-----" << std::endl;
|
||||||
// std::cout << "------" << std::endl;
|
for(int i=0; i<qqq.multi; i++) {
|
||||||
for (int i = 0; i < qqq.multi; i++)
|
//if(qqq.multi>=3) std::cout << std::setprecision(16) << "qqq"<< qqq.id[i] << " " << std::string(qqq.ch[i]/16?"ring":"wedge") << qqq.ch[i]%16 << " " << qqq.e[i] << " " << qqq.t[i] - qqq.t[0] << std::endl;
|
||||||
{
|
if(qqq.ch[i]/16) {
|
||||||
// std::cout << std::setprecision(16) << "qqq"<< qqq.id[i] << " " << std::string(qqq.ch[i]/16?"ring":"wedge") << qqq.ch[i]%16 << " " << qqq.e[i] << " " << qqq.t[i] - qqq.t[0] << std::endl;
|
if(qvecr[qqq.id[i]].find(qqq.ch[i])!=qvecr[qqq.id[i]].end()) std::cout << "mayday!" << std::endl;
|
||||||
if (qqq.ch[i] / 16)
|
qvecr[qqq.id[i]][qqq.ch[i]] = std::tuple(qqq.id[i],qqq.ch[i],qqq.e[i],qqq.t[i]);
|
||||||
{
|
} else {
|
||||||
if (qvecr[qqq.id[i]].find(qqq.ch[i]) != qvecr[qqq.id[i]].end())
|
if(qvecw[qqq.id[i]].find(qqq.ch[i])!=qvecw[qqq.id[i]].end()) std::cout << "mayday!" << std::endl;
|
||||||
std::cout << "mayday!" << std::endl;
|
qvecw[qqq.id[i]][qqq.ch[i]] = std::tuple(qqq.id[i],qqq.ch[i],qqq.e[i],qqq.t[i]);
|
||||||
qvecr[qqq.id[i]][qqq.ch[i]] = std::tuple(qqq.id[i], qqq.ch[i], qqq.e[i], qqq.t[i]);
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
if (qvecw[qqq.id[i]].find(qqq.ch[i]) != qvecw[qqq.id[i]].end())
|
|
||||||
std::cout << "mayday!" << std::endl;
|
|
||||||
qvecw[qqq.id[i]][qqq.ch[i]] = std::tuple(qqq.id[i], qqq.ch[i], qqq.e[i], qqq.t[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Now, qvecr[i] has all ring events of qqq#i, qvecw[i] has all wedge events of
|
|
||||||
|
|
||||||
bool PCQQQTimeCut = false;
|
bool PCQQQTimeCut = false;
|
||||||
for (int i = 0; i < qqq.multi; i++)
|
for (int i = 0; i < qqq.multi; i++) {
|
||||||
{
|
|
||||||
plotter->Fill2D("QQQ_Index_Vs_Energy", 16 * 8, 0, 16 * 8, 2000, 0, 16000, qqq.index[i], qqq.e[i], "hRawQQQ");
|
plotter->Fill2D("QQQ_Index_Vs_Energy", 16 * 8, 0, 16 * 8, 2000, 0, 16000, qqq.index[i], qqq.e[i], "hRawQQQ");
|
||||||
|
|
||||||
for (int j = 0; j < qqq.multi; j++)
|
for (int j = 0; j < qqq.multi; j++) {
|
||||||
{
|
|
||||||
if (j == i)
|
if (j == i)
|
||||||
continue;
|
continue;
|
||||||
plotter->Fill2D("QQQ_Coincidence_Matrix", 16 * 8, 0, 16 * 8, 16 * 8, 0, 16 * 8, qqq.index[i], qqq.index[j], "hRawQQQ");
|
plotter->Fill2D("QQQ_Coincidence_Matrix", 16 * 8, 0, 16 * 8, 16 * 8, 0, 16 * 8, qqq.index[i], qqq.index[j], "hRawQQQ");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int k = 0; k < pc.multi; k++)
|
for (int k = 0; k < pc.multi; k++) {
|
||||||
{
|
if (pc.index[k] < 24 && pc.e[k] > 50) {
|
||||||
if (pc.index[k] < 24 && pc.e[k] > 50)
|
|
||||||
{
|
|
||||||
plotter->Fill2D("QQQ_Vs_Anode_Energy", 400, 0, 4000, 1000, 0, 16000, qqq.e[i], pc.e[k], "hRawQQQ");
|
plotter->Fill2D("QQQ_Vs_Anode_Energy", 400, 0, 4000, 1000, 0, 16000, qqq.e[i], pc.e[k], "hRawQQQ");
|
||||||
plotter->Fill2D("QQQ_Vs_PC_Index", 16 * 8, 0, 16 * 8, 24, 0, 24, qqq.index[i], pc.index[k], "hRawQQQ");
|
plotter->Fill2D("QQQ_Vs_PC_Index", 16 * 8, 0, 16 * 8, 24, 0, 24, qqq.index[i], pc.index[k], "hRawQQQ");
|
||||||
}
|
}
|
||||||
else if (pc.index[k] >= 24 && pc.e[k] > 50)
|
else if (pc.index[k] >= 24 && pc.e[k] > 50) {
|
||||||
{
|
|
||||||
plotter->Fill2D("QQQ_Vs_Cathode_Energy", 400, 0, 4000, 1000, 0, 16000, qqq.e[i], pc.e[k], "hRawQQQ");
|
plotter->Fill2D("QQQ_Vs_Cathode_Energy", 400, 0, 4000, 1000, 0, 16000, qqq.e[i], pc.e[k], "hRawQQQ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int j = i + 1; j < qqq.multi; j++)
|
for (int j = i + 1; j < qqq.multi; j++) {
|
||||||
{
|
if (qqq.id[i] == qqq.id[j]) {
|
||||||
if (qqq.id[i] == qqq.id[j])
|
|
||||||
{
|
|
||||||
qqqCount++;
|
qqqCount++;
|
||||||
|
|
||||||
int chWedge = -1;
|
int chWedge = -1;
|
||||||
|
|
@ -316,8 +369,7 @@ Bool_t MakeVertex::Process(Long64_t entry)
|
||||||
double tRing = 0.0;
|
double tRing = 0.0;
|
||||||
double tWedge = 0.0;
|
double tWedge = 0.0;
|
||||||
|
|
||||||
if (qqq.ch[i] < 16 && qqq.ch[j] >= 16 && qqqGainValid[qqq.id[i]][qqq.ch[i]][qqq.ch[j] - 16])
|
if (qqq.ch[i] < 16 && qqq.ch[j] >= 16 && qqqGainValid[qqq.id[i]][qqq.ch[i]][qqq.ch[j] - 16]) {
|
||||||
{
|
|
||||||
chWedge = qqq.ch[i];
|
chWedge = qqq.ch[i];
|
||||||
eWedge = qqq.e[i] * qqqGain[qqq.id[i]][qqq.ch[i]][qqq.ch[j] - 16];
|
eWedge = qqq.e[i] * qqqGain[qqq.id[i]][qqq.ch[i]][qqq.ch[j] - 16];
|
||||||
chRing = qqq.ch[j] - 16;
|
chRing = qqq.ch[j] - 16;
|
||||||
|
|
@ -325,8 +377,7 @@ Bool_t MakeVertex::Process(Long64_t entry)
|
||||||
tRing = static_cast<double>(qqq.t[j]);
|
tRing = static_cast<double>(qqq.t[j]);
|
||||||
tWedge = static_cast<double>(qqq.t[i]);
|
tWedge = static_cast<double>(qqq.t[i]);
|
||||||
}
|
}
|
||||||
else if (qqq.ch[j] < 16 && qqq.ch[i] >= 16 && qqqGainValid[qqq.id[j]][qqq.ch[j]][qqq.ch[i] - 16])
|
else if (qqq.ch[j] < 16 && qqq.ch[i] >= 16 && qqqGainValid[qqq.id[j]][qqq.ch[j]][qqq.ch[i] - 16]) {
|
||||||
{
|
|
||||||
chWedge = qqq.ch[j];
|
chWedge = qqq.ch[j];
|
||||||
eWedge = qqq.e[j] * qqqGain[qqq.id[j]][qqq.ch[j]][qqq.ch[i] - 16];
|
eWedge = qqq.e[j] * qqqGain[qqq.id[j]][qqq.ch[j]][qqq.ch[i] - 16];
|
||||||
chRing = qqq.ch[i] - 16;
|
chRing = qqq.ch[i] - 16;
|
||||||
|
|
@ -341,26 +392,24 @@ Bool_t MakeVertex::Process(Long64_t entry)
|
||||||
plotter->Fill2D("RingE_vs_Index", 16 * 4, 0, 16 * 4, 1000, 0, 16000, chRing + qqq.id[i] * 16, eRing, "hRawQQQ");
|
plotter->Fill2D("RingE_vs_Index", 16 * 4, 0, 16 * 4, 1000, 0, 16000, chRing + qqq.id[i] * 16, eRing, "hRawQQQ");
|
||||||
plotter->Fill2D("WedgeE_vs_Index", 16 * 4, 0, 16 * 4, 1000, 0, 16000, chWedge + qqq.id[i] * 16, eWedge, "hRawQQQ");
|
plotter->Fill2D("WedgeE_vs_Index", 16 * 4, 0, 16 * 4, 1000, 0, 16000, chWedge + qqq.id[i] * 16, eWedge, "hRawQQQ");
|
||||||
|
|
||||||
if (qqqCalibValid[qqq.id[i]][chWedge][chRing])
|
if (qqqCalibValid[qqq.id[i]][chWedge][chRing]) {
|
||||||
{
|
|
||||||
eWedgeMeV = eWedge * qqqCalib[qqq.id[i]][chWedge][chRing] / 1000;
|
eWedgeMeV = eWedge * qqqCalib[qqq.id[i]][chWedge][chRing] / 1000;
|
||||||
eRingMeV = eRing * qqqCalib[qqq.id[i]][chWedge][chRing] / 1000;
|
eRingMeV = eRing * qqqCalib[qqq.id[i]][chWedge][chRing] / 1000;
|
||||||
|
|
||||||
if (eRingMeV / eWedgeMeV > 3.0 || eRingMeV / eWedgeMeV < 1.0 / 3.0)
|
if(eRingMeV/eWedgeMeV > 3.0 || eRingMeV/eWedgeMeV<1.0/3.0) continue;
|
||||||
continue;
|
//if(eRingMeV<4.0 || eWedgeMeV<4.0) continue;
|
||||||
// if(eRingMeV<4.0 || eWedgeMeV<4.0) continue;
|
|
||||||
|
|
||||||
double theta = -TMath::Pi() / 2 + 2 * TMath::Pi() / 16 / 4. * (qqq.id[i] * 16 + chWedge + 0.5);
|
double theta = -TMath::Pi() / 2 + 2 * TMath::Pi() / 16 / 4. * (qqq.id[i] * 16 + chWedge + 0.5);
|
||||||
double rho = 50. + (50. / 16.) * (chRing + 0.5); //"?"
|
double rho = 50. + (50. / 16.) * (chRing + 0.5); //"?"
|
||||||
|
//z used to be 75+30+23=128
|
||||||
Event qqqevent(TVector3(rho * TMath::Cos(theta), rho * TMath::Sin(theta), 100), eRingMeV, eWedgeMeV, tRing, tWedge, chRing + qqq.id[i] * 16, chWedge + qqq.id[i] * 16);
|
//we found a 12mm shift towards the vertex later --> 116
|
||||||
Event qqqeventr(TVector3(rho * TMath::Cos(theta), rho * TMath::Sin(theta),100), eRing, eWedge, tRing, tWedge, chRing + qqq.id[i] * 16, chWedge + qqq.id[i] * 16);
|
Event qqqevent(TVector3(rho*TMath::Cos(theta),rho*TMath::Sin(theta),116), eRingMeV, eWedgeMeV, tRing, tWedge,chRing+qqq.id[i]*16, chWedge+qqq.id[i]*16);
|
||||||
|
Event qqqeventr(TVector3(rho*TMath::Cos(theta),rho*TMath::Sin(theta),116), eRing, eWedge, tRing, tWedge,chRing+qqq.id[i]*16, chWedge+qqq.id[i]*16);
|
||||||
QQQ_Events.push_back(qqqevent);
|
QQQ_Events.push_back(qqqevent);
|
||||||
QQQ_Events_Raw.push_back(qqqeventr);
|
QQQ_Events_Raw.push_back(qqqeventr);
|
||||||
plotter->Fill2D("QQQCartesianPlot", 200, -100, 100, 200, -100, 100, rho * TMath::Cos(theta), rho * TMath::Sin(theta), "hCalQQQ");
|
plotter->Fill2D("QQQCartesianPlot", 200, -100, 100, 200, -100, 100, rho * TMath::Cos(theta), rho * TMath::Sin(theta), "hCalQQQ");
|
||||||
plotter->Fill2D("QQQCartesianPlot" + std::to_string(qqq.id[i]), 200, -100, 100, 200, -100, 100, rho * TMath::Cos(theta), rho * TMath::Sin(theta), "hCalQQQ");
|
plotter->Fill2D("QQQCartesianPlot" + std::to_string(qqq.id[i]), 200, -100, 100, 200, -100, 100, rho * TMath::Cos(theta), rho * TMath::Sin(theta), "hCalQQQ");
|
||||||
if (PCQQQTimeCut)
|
if (PCQQQTimeCut) {
|
||||||
{
|
|
||||||
plotter->Fill2D("PC_XY_Projection_QQQ_TimeCut" + std::to_string(qqq.id[i]), 400, -100, 100, 400, -100, 100, rho * TMath::Cos(theta), rho * TMath::Sin(theta), "hPCQQQ");
|
plotter->Fill2D("PC_XY_Projection_QQQ_TimeCut" + std::to_string(qqq.id[i]), 400, -100, 100, 400, -100, 100, rho * TMath::Cos(theta), rho * TMath::Sin(theta), "hPCQQQ");
|
||||||
}
|
}
|
||||||
plotter->Fill2D("PC_XY_Projection_QQQ" + std::to_string(qqq.id[i]), 400, -100, 100, 400, -100, 100, rho * TMath::Cos(theta), rho * TMath::Sin(theta), "hPCQQQ");
|
plotter->Fill2D("PC_XY_Projection_QQQ" + std::to_string(qqq.id[i]), 400, -100, 100, 400, -100, 100, rho * TMath::Cos(theta), rho * TMath::Sin(theta), "hPCQQQ");
|
||||||
|
|
@ -383,48 +432,47 @@ Bool_t MakeVertex::Process(Long64_t entry)
|
||||||
{
|
{
|
||||||
plotter->Fill2D("Timing_Difference_QQQ_PC", 500, -2000, 2000, 16, 0, 16, tRing - static_cast<double>(pc.t[k]), chRing, "hTiming");
|
plotter->Fill2D("Timing_Difference_QQQ_PC", 500, -2000, 2000, 16, 0, 16, tRing - static_cast<double>(pc.t[k]), chRing, "hTiming");
|
||||||
plotter->Fill2D("DelT_Vs_QQQRingECal", 500, -2000, 2000, 1000, 0, 10, tRing - static_cast<double>(pc.t[k]), eRingMeV, "hTiming");
|
plotter->Fill2D("DelT_Vs_QQQRingECal", 500, -2000, 2000, 1000, 0, 10, tRing - static_cast<double>(pc.t[k]), eRingMeV, "hTiming");
|
||||||
plotter->Fill2D("CalibratedQQQEvsPCE_R", 1000, 0, 10, 2000, 0, 200, eRingMeV, pc.e[k]/ 151.461, "hPCQQQ"); // division by 151.5 for rough conversion of PC energy to keV from the slope on teh Source data
|
plotter->Fill2D("CalibratedQQQEvsPCE_R", 1000, 0, 10, 2000, 0, 30000, eRingMeV, pc.e[k], "hPCQQQ");
|
||||||
plotter->Fill2D("CalibratedQQQEvsPCE_W", 1000, 0, 10, 2000, 0, 200, eWedgeMeV, pc.e[k]/ 151.461, "hPCQQQ");// division by 151.5 for rough conversion of PC energy to keV from the slope on teh Source data
|
plotter->Fill2D("CalibratedQQQEvsPCE_W", 1000, 0, 10, 2000, 0, 30000, eWedgeMeV, pc.e[k], "hPCQQQ");
|
||||||
if (tRing - static_cast<double>(pc.t[k]) < -150) // proton tests, 27Al
|
if (tRing - static_cast<double>(pc.t[k]) < -150) // proton tests, 27Al
|
||||||
// if (tRing - static_cast<double>(pc.t[k]) < -150 && tRing - static_cast<double>(pc.t[k]) > -450) // 27Al
|
//if (tRing - static_cast<double>(pc.t[k]) < -150 && tRing - static_cast<double>(pc.t[k]) > -450) // 27Al
|
||||||
// if (tRing - static_cast<double>(pc.t[k]) < -70 && tRing - static_cast<double>(pc.t[k]) > -150) // 17F
|
//if (tRing - static_cast<double>(pc.t[k]) < -70 && tRing - static_cast<double>(pc.t[k]) > -150) // 17F
|
||||||
{
|
{
|
||||||
PCQQQTimeCut = true;
|
PCQQQTimeCut = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pc.index[k] >= 24 && pc.e[k] > 50)
|
if (pc.index[k] >= 24 && pc.e[k] > 50) {
|
||||||
{
|
|
||||||
plotter->Fill2D("Timing_Difference_QQQ_PC_Cathode", 500, -2000, 2000, 16, 0, 16, tRing - static_cast<double>(pc.t[k]), chRing, "hTiming");
|
plotter->Fill2D("Timing_Difference_QQQ_PC_Cathode", 500, -2000, 2000, 16, 0, 16, tRing - static_cast<double>(pc.t[k]), chRing, "hTiming");
|
||||||
}
|
}
|
||||||
} // end of pc k loop
|
} //end of pc k loop
|
||||||
|
|
||||||
if (!HitNonZero)
|
if (!HitNonZero) {
|
||||||
{
|
|
||||||
double theta = -TMath::Pi() / 2 + 2 * TMath::Pi() / 16 / 4. * (qqq.id[i] * 16 + chWedge + 0.5);
|
double theta = -TMath::Pi() / 2 + 2 * TMath::Pi() / 16 / 4. * (qqq.id[i] * 16 + chWedge + 0.5);
|
||||||
double rho = 50. + (50. / 16.) * (chRing + 0.5); //"?"
|
double rho = 50. + (50. / 16.) * (chRing + 0.5); //"?"
|
||||||
double x = rho * TMath::Cos(theta);
|
double x = rho * TMath::Cos(theta);
|
||||||
double y = rho * TMath::Sin(theta);
|
double y = rho * TMath::Sin(theta);
|
||||||
hitPos.SetXYZ(x, y, 100);
|
hitPos.SetXYZ(x, y, (23 + 75 + 30));
|
||||||
qqqenergy = eRingMeV;
|
qqqenergy = eRingMeV;
|
||||||
qqqtimestamp = tRing;
|
qqqtimestamp = tRing;
|
||||||
HitNonZero = true;
|
HitNonZero = true;
|
||||||
}
|
}
|
||||||
} // if j==i
|
} // if j==i
|
||||||
} // j loop end
|
} //j loop end
|
||||||
} // i loop end
|
} //i loop end
|
||||||
|
|
||||||
plotter->Fill1D("QQQ_Multiplicity", 10, 0, 10, qqqCount, "hRawQQQ");
|
plotter->Fill1D("QQQ_Multiplicity", 10, 0, 10, qqqCount, "hRawQQQ");
|
||||||
|
|
||||||
/*if(QQQ_Events.size()>=1) {
|
/*if(QQQ_Events.size()>=1) {
|
||||||
std::cout<< " ---->" << std::endl;
|
std::cout<< " ---->" << std::endl;
|
||||||
for(auto qe: QQQ_Events) {
|
for(auto qe: QQQ_Events) {
|
||||||
std::cout << qe.ch1/16 << " " <<qe.ch2/16 << " " << qe.ch1%16 << " "<< qe.ch2%16 << " " << qe.Energy1 << " " << qe.Energy2 << " " << std::endl;
|
std::cout << qe.ch1/16 << " " <<qe.ch2/16 << " " << qe.ch1%16 << " "<< qe.ch2%16 << " " << qe.Energy1 << " " << qe.Energy2 << " " << std::endl;
|
||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
typedef std::unordered_map<int, std::tuple<int, double, double>> WireEvent; // this stores nearest neighbour wire events, or a 'cluster'
|
|
||||||
WireEvent aWireEvents, cWireEvents; // naming for book keeping
|
typedef std::unordered_map<int,std::tuple<int,double,double>> WireEvent; //this stores nearest neighbour wire events, or a 'cluster'
|
||||||
|
WireEvent aWireEvents, cWireEvents; //naming for book keeping
|
||||||
aWireEvents.clear();
|
aWireEvents.clear();
|
||||||
aWireEvents.reserve(24);
|
aWireEvents.reserve(24);
|
||||||
|
|
||||||
|
|
@ -438,10 +486,8 @@ Bool_t MakeVertex::Process(Long64_t entry)
|
||||||
if (pc.e[i] > 50)
|
if (pc.e[i] > 50)
|
||||||
{
|
{
|
||||||
plotter->Fill2D("PC_Index_Vs_Energy", 48, 0, 48, 2000, 0, 30000, pc.index[i], static_cast<double>(pc.e[i]), "hRawPC");
|
plotter->Fill2D("PC_Index_Vs_Energy", 48, 0, 48, 2000, 0, 30000, pc.index[i], static_cast<double>(pc.e[i]), "hRawPC");
|
||||||
}
|
} else {
|
||||||
else
|
continue;
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pc.index[i] < 48)
|
if (pc.index[i] < 48)
|
||||||
|
|
@ -454,13 +500,13 @@ Bool_t MakeVertex::Process(Long64_t entry)
|
||||||
{
|
{
|
||||||
anodeT = static_cast<double>(pc.t[i]);
|
anodeT = static_cast<double>(pc.t[i]);
|
||||||
anodeIndex = pc.index[i];
|
anodeIndex = pc.index[i];
|
||||||
aWireEvents[pc.index[i]] = std::tuple(pc.index[i], pc.e[i], static_cast<double>(pc.t[i]));
|
aWireEvents[pc.index[i]] = std::tuple(pc.index[i],pc.e[i],static_cast<double>(pc.t[i]));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cathodeT = static_cast<double>(pc.t[i]);
|
cathodeT = static_cast<double>(pc.t[i]);
|
||||||
cathodeIndex = pc.index[i] - 24;
|
cathodeIndex = pc.index[i] - 24;
|
||||||
cWireEvents[pc.index[i] - 24] = std::tuple(pc.index[i] - 24, pc.e[i], static_cast<double>(pc.t[i]));
|
cWireEvents[pc.index[i]-24] = std::tuple(pc.index[i]-24,pc.e[i],static_cast<double>(pc.t[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (anodeT != -99999 && cathodeT != 99999)
|
if (anodeT != -99999 && cathodeT != 99999)
|
||||||
|
|
@ -503,74 +549,83 @@ Bool_t MakeVertex::Process(Long64_t entry)
|
||||||
double aEMax = 0;
|
double aEMax = 0;
|
||||||
int aIDMax = 0;
|
int aIDMax = 0;
|
||||||
|
|
||||||
for (int i = 0; i < pc.multi; i++)
|
|
||||||
{
|
|
||||||
|
for (int i = 0; i < pc.multi; i++) {
|
||||||
// if (pc.e[i] > 100)
|
// if (pc.e[i] > 100)
|
||||||
{
|
{
|
||||||
if (pc.index[i] < 24)
|
if (pc.index[i] < 24) {
|
||||||
{
|
|
||||||
anodeHits.push_back(std::pair<int, double>(pc.index[i], pc.e[i]));
|
anodeHits.push_back(std::pair<int, double>(pc.index[i], pc.e[i]));
|
||||||
}
|
}
|
||||||
else if (pc.index[i] >= 24)
|
else if (pc.index[i] >= 24) {
|
||||||
{
|
|
||||||
cathodeHits.push_back(std::pair<int, double>(pc.index[i] - 24, pc.e[i]));
|
cathodeHits.push_back(std::pair<int, double>(pc.index[i] - 24, pc.e[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::sort(anodeHits.begin(), anodeHits.end(), [](std::pair<int, double> a, std::pair<int, double> b)
|
std::sort(anodeHits.begin(),anodeHits.end(),[](std::pair<int,double> a, std::pair<int,double> b){ return a.first < b.first;});
|
||||||
{ return a.first < b.first; });
|
std::sort(cathodeHits.begin(),cathodeHits.end(),[](std::pair<int,double> a, std::pair<int,double> b){ return a.first < b.first;});
|
||||||
std::sort(cathodeHits.begin(), cathodeHits.end(), [](std::pair<int, double> a, std::pair<int, double> b)
|
|
||||||
{ return a.first < b.first; });
|
|
||||||
|
|
||||||
std::vector<std::vector<std::tuple<int, double, double>>> aClusters = pwinstance.Make_Clusters(aWireEvents);
|
//clusters = collection of (collection of wires) where each wire is (index, energy, timestamp)
|
||||||
std::vector<std::vector<std::tuple<int, double, double>>> cClusters = pwinstance.Make_Clusters(cWireEvents);
|
std::vector<std::vector<std::tuple<int,double,double>>> aClusters = pwinstance.Make_Clusters(aWireEvents);
|
||||||
|
std::vector<std::vector<std::tuple<int,double,double>>> cClusters = pwinstance.Make_Clusters(cWireEvents);
|
||||||
|
|
||||||
std::vector<std::pair<double, double>> sumE_AC;
|
std::vector<std::pair<double,double>> sumE_AC;
|
||||||
for (auto aCluster : aClusters)
|
for(auto aCluster: aClusters) {
|
||||||
{
|
for(auto cCluster: cClusters) {
|
||||||
for (auto cCluster : cClusters)
|
if(aCluster.size()<=1 && cCluster.size()<=1) continue;
|
||||||
{
|
auto [crossover,alpha,apSumE,cpSumE,apMaxE,cpMaxE,apTSMaxE,cpTSMaxE] = pwinstance.FindCrossoverProperties(aCluster, cCluster);
|
||||||
if(aCluster.size()<=1 && cCluster.size()<=1) continue;
|
if(alpha!=9999999 && apSumE!=-1) {
|
||||||
auto [crossover, alpha, apSumE, cpSumE, apMaxE, cpMaxE, apTSMaxE, cpTSMaxE] = pwinstance.FindCrossoverProperties(aCluster, cCluster);
|
//Event PCEvent(crossover,apMaxE,cpMaxE,apTSMaxE,cpTSMaxE);
|
||||||
if (alpha != 9999999 && apSumE != -1)
|
//Event PCEvent(crossover,apSumE,cpSumE,apTSMaxE,cpTSMaxE);
|
||||||
{
|
Event PCEvent(crossover,apSumE,cpMaxE,apTSMaxE,cpTSMaxE); //run12 shows cathode-max and anode-sum provide best dE signals.
|
||||||
// Event PCEvent(crossover,apMaxE,cpMaxE,apTSMaxE,cpTSMaxE);
|
//std::cout << apSumE << " " << crossover.Perp() << " " << apMaxE << " " << apTSMaxE << std::endl;
|
||||||
// Event PCEvent(crossover,apSumE,cpSumE,apTSMaxE,cpTSMaxE);
|
PC_Events.push_back(PCEvent);
|
||||||
Event PCEvent(crossover, apSumE, cpMaxE, apTSMaxE, cpTSMaxE); // run12 shows cathode-max and anode-sum provide best dE signals.
|
sumE_AC.push_back(std::pair(apSumE,cpSumE));
|
||||||
// std::cout << apSumE << " " << crossover.Perp() << " " << apMaxE << " " << apTSMaxE << std::endl;
|
}
|
||||||
PC_Events.push_back(PCEvent);
|
}
|
||||||
sumE_AC.push_back(std::pair(apSumE, cpSumE));
|
}
|
||||||
}
|
if(QQQ_Events.size() && PC_Events.size())
|
||||||
}
|
plotter->Fill2D("PCEv_vs_QQQEv",20,0,20,20,0,20,QQQ_Events.size(),PC_Events.size());
|
||||||
}
|
|
||||||
if (QQQ_Events.size() && PC_Events.size())
|
|
||||||
plotter->Fill2D("PCEv_vs_QQQEv", 20, 0, 20, 20, 0, 20, QQQ_Events.size(), PC_Events.size());
|
|
||||||
|
|
||||||
for (auto pcevent : PC_Events)
|
for(auto pcevent:PC_Events) {
|
||||||
{
|
for(auto sx3event:sx3Events) {
|
||||||
for (auto qqqevent : QQQ_Events)
|
plotter->Fill1D("dt_pcA_sx3B"+std::to_string(sx3event.ch2),640,-2000,2000,sx3event.Time1 - pcevent.Time1);
|
||||||
{
|
plotter->Fill1D("dt_pcC_sx3B"+std::to_string(sx3event.ch2),640,-2000,2000,sx3event.Time1 - pcevent.Time2);
|
||||||
plotter->Fill1D("dt_pcA_qqqR", 640, -2000, 2000, qqqevent.Time1 - pcevent.Time1);
|
plotter->Fill2D("dE_E_Anodesx3B",400,0,10,800,0,40000,sx3event.Energy1*0.001,pcevent.Energy1);
|
||||||
plotter->Fill1D("dt_pcC_qqqW", 640, -2000, 2000, qqqevent.Time2 - pcevent.Time2);
|
|
||||||
plotter->Fill2D("dE_E_AnodeQQQR", 400, 0, 10, 800, 0, 40000, qqqevent.Energy1, pcevent.Energy1);
|
|
||||||
plotter->Fill2D("dE_E_CathodeQQQR", 400, 0, 10, 800, 0, 10000, qqqevent.Energy2, pcevent.Energy2);
|
|
||||||
double sinTheta = TMath::Sin((qqqevent.pos - TVector3(0, 0, 90)).Theta()); /// TMath::Sin((TVector3(51.5,0,128.) - TVector3(0,0,90)).Theta());
|
|
||||||
plotter->Fill2D("dE2_E_AnodeQQQR", 400, 0, 10, 800, 0, 40000, qqqevent.Energy1, pcevent.Energy1 * sinTheta);
|
|
||||||
plotter->Fill2D("dE2_E_CathodeQQQR", 400, 0, 10, 800, 0, 10000, qqqevent.Energy2, pcevent.Energy2 * sinTheta);
|
|
||||||
|
|
||||||
if (qqqevent.pos.Phi() <= pcevent.pos.Phi() + TMath::Pi() / 4. && qqqevent.pos.Phi() >= pcevent.pos.Phi() - TMath::Pi() / 4. && qqqevent.Time1 - pcevent.Time1 < -150 && qqqevent.Time2 - pcevent.Time2 < -300)
|
plotter->Fill2D("dE_E_Cathodesx3B",400,0,10,800,0,10000,sx3event.Energy1*0.001,pcevent.Energy2);
|
||||||
{
|
double sx3z = sx3event.pos.Z()+(75.0/2.0)-3.0; //w.r.t target origin at 90 for run12
|
||||||
plotter->Fill1D("PCZ", 800, -200, 200, pcevent.pos.Z(), "phicut");
|
double sx3rho = 88.0;//approximate barrel radius
|
||||||
double pcz_guess = 37.0 / TMath::Tan((qqqevent.pos - TVector3(0, 0, 90)).Theta()) + 90; // this is ideally kept to be all QQQ+userinput for calibration of pcz
|
double sx3theta = TMath::ATan2(sx3rho,sx3z-90);
|
||||||
plotter->Fill2D("pczguess_vs_pc", 300, 0, 200, 150, 0, 200, pcz_guess, pcevent.pos.Z(), "phicut");
|
double pczguess = 40.0/TMath::Tan(sx3theta) + 90.0;
|
||||||
plotter->Fill2D("pczguess_vs_pc_phi=" + std::to_string(qqqevent.pos.Phi() * 180. / M_PI), 100, 0, 200, 150, 0, 200, pcz_guess, pcevent.pos.Z(), "phicut");
|
plotter->Fill2D("pcz_vs_sx3pczguess",300,0,200,150,0,200,pczguess,pcevent.pos.Z());
|
||||||
// plotter->Fill1D("PCZ",800,-200,200,pcevent.pos.Z(),"phicut");
|
plotter->Fill2D("pcz_vs_sx3pczguess"+std::to_string(sx3event.ch2),300,0,200,150,0,200,pczguess,pcevent.pos.Z());
|
||||||
}
|
plotter->Fill2D("pcz_vs_sx3z",300,0,200,150,0,200,sx3z,pcevent.pos.Z());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// HALFTIME! Can stop here in future versions
|
|
||||||
// return kTRUE;
|
for(auto pcevent: PC_Events) {
|
||||||
|
for(auto qqqevent: QQQ_Events) {
|
||||||
|
plotter->Fill1D("dt_pcA_qqqR",640,-2000,2000,qqqevent.Time1 - pcevent.Time1);
|
||||||
|
plotter->Fill1D("dt_pcC_qqqW",640,-2000,2000,qqqevent.Time2 - pcevent.Time2);
|
||||||
|
plotter->Fill2D("dE_E_AnodeQQQR",400,0,10,800,0,40000,qqqevent.Energy1,pcevent.Energy1);
|
||||||
|
plotter->Fill2D("dE_E_CathodeQQQR",400,0,10,800,0,10000,qqqevent.Energy2,pcevent.Energy2);
|
||||||
|
double sinTheta = TMath::Sin((qqqevent.pos - TVector3(0,0,90)).Theta())/TMath::Sin((TVector3(51.5,0,128.) - TVector3(0,0,90)).Theta());
|
||||||
|
plotter->Fill2D("dE2_E_AnodeQQQR",400,0,10,800,0,40000,qqqevent.Energy1,pcevent.Energy1*sinTheta);
|
||||||
|
plotter->Fill2D("dE2_E_CathodeQQQR",400,0,10,800,0,10000,qqqevent.Energy2,pcevent.Energy2*sinTheta);
|
||||||
|
|
||||||
|
if(qqqevent.pos.Phi() <= pcevent.pos.Phi()+TMath::Pi()/4. && qqqevent.pos.Phi() >= pcevent.pos.Phi()-TMath::Pi()/4.) {
|
||||||
|
plotter->Fill1D("PCZ",800,-200,200,pcevent.pos.Z(),"phicut");
|
||||||
|
double pcz_guess = 40.0/TMath::Tan((qqqevent.pos-TVector3(0,0,90)).Theta()) + 90; //this is ideally kept to be all QQQ+userinput for calibration of pcz
|
||||||
|
plotter->Fill2D("pczguess_vs_pc",300,0,200,150,0,200,pcz_guess,pcevent.pos.Z(),"phicut");
|
||||||
|
plotter->Fill2D("pczguess_vs_pc_phi="+std::to_string(qqqevent.pos.Phi()*180./M_PI),300,0,200,150,0,200,pcz_guess,pcevent.pos.Z(),"phicut");
|
||||||
|
//plotter->Fill1D("PCZ",800,-200,200,pcevent.pos.Z(),"phicut");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//HALFTIME! Can stop here in future versions
|
||||||
|
//return kTRUE;
|
||||||
|
|
||||||
if (anodeHits.size() >= 1 && cathodeHits.size() >= 1)
|
if (anodeHits.size() >= 1 && cathodeHits.size() >= 1)
|
||||||
{
|
{
|
||||||
|
|
@ -612,7 +667,7 @@ Bool_t MakeVertex::Process(Long64_t entry)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TVector3 anodeIntersection, vector_closest_to_z;
|
TVector3 anodeIntersection,vector_closest_to_z;
|
||||||
anodeIntersection.Clear();
|
anodeIntersection.Clear();
|
||||||
vector_closest_to_z.Clear();
|
vector_closest_to_z.Clear();
|
||||||
if (corrcatMax.size() > 0)
|
if (corrcatMax.size() > 0)
|
||||||
|
|
@ -638,28 +693,26 @@ Bool_t MakeVertex::Process(Long64_t entry)
|
||||||
}
|
}
|
||||||
bool PCQQQPhiCut = false;
|
bool PCQQQPhiCut = false;
|
||||||
// flip the algorithm for cathode 1 multi anode events
|
// flip the algorithm for cathode 1 multi anode events
|
||||||
if ((hitPos.Phi() > (anodeIntersection.Phi() - TMath::PiOver4())) && (hitPos.Phi() < (anodeIntersection.Phi() + TMath::PiOver4())))
|
if ((hitPos.Phi() > (anodeIntersection.Phi() - TMath::PiOver4())) && (hitPos.Phi() < (anodeIntersection.Phi() + TMath::PiOver4()))) {
|
||||||
{
|
|
||||||
PCQQQPhiCut = true;
|
PCQQQPhiCut = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (double Tz = 60; Tz <= 100; Tz += 1.0)
|
for (double Tz = 60; Tz <= 100; Tz += 1.0)
|
||||||
{
|
{
|
||||||
TVector3 TargetPos(0, 0, Tz);
|
TVector3 TargetPos(0, 0, Tz);
|
||||||
if (PCQQQPhiCut && anodeIntersection.Perp() > 0 && anodeIntersection.Z() != 0 && cathodeHits.size() >= 2)
|
if(PCQQQPhiCut && anodeIntersection.Perp()>0 && anodeIntersection.Z()!=0 && cathodeHits.size()>=2) {
|
||||||
{
|
plotter->Fill2D("Inttheta_vs_QQQtheta_TC" + std::to_string(PCQQQTimeCut) + "_TZ" + std::to_string(Tz), 400, 0, 180, 90, 0, 90, (anodeIntersection - TargetPos).Theta() * 180. / TMath::Pi(), (hitPos - TargetPos).Theta() * 180. / TMath::Pi(), "TPosVariation");
|
||||||
plotter->Fill2D("Inttheta_vs_QQQtheta_TC" + std::to_string(PCQQQTimeCut) + "_TZ" + std::to_string(Tz), 400, 0, 180, 90, 0, 90, (anodeIntersection - TargetPos).Theta() * 180. / TMath::Pi(), (hitPos - TargetPos).Theta() * 180. / TMath::Pi(), "TPosVariation");
|
//plotter->Fill2D("R_ratio_to_Z_ratio" + std::to_string(PCQQQTimeCut) + "_TZ" + std::to_string(Tz), 100, -2, 2, 100, -2, 2, (anodeIntersection - TargetPos).Z()/(hitPos-TargetPos).Z(), ((anodeIntersection - TargetPos).Perp()+2.5)/(hitPos-TargetPos).Perp(), "TPosVariation");
|
||||||
// plotter->Fill2D("R_ratio_to_Z_ratio" + std::to_string(PCQQQTimeCut) + "_TZ" + std::to_string(Tz), 100, -2, 2, 100, -2, 2, (anodeIntersection - TargetPos).Z()/(hitPos-TargetPos).Z(), ((anodeIntersection - TargetPos).Perp()+2.5)/(hitPos-TargetPos).Perp(), "TPosVariation");
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (anodeIntersection.Z() != 0 && anodeIntersection.Perp() > 0 && HitNonZero)
|
if (anodeIntersection.Z() != 0 && anodeIntersection.Perp()>0 && HitNonZero)
|
||||||
{
|
{
|
||||||
plotter->Fill1D("PC_Z_Projection", 600, -300, 300, anodeIntersection.Z(), "hPCzQQQ");
|
plotter->Fill1D("PC_Z_Projection", 600, -300, 300, anodeIntersection.Z(), "hPCzQQQ");
|
||||||
plotter->Fill2D("Z_Proj_VsDelTime", 600, -300, 300, 200, -2000, 2000, anodeIntersection.Z(), anodeT - cathodeT, "hPCzQQQ");
|
plotter->Fill2D("Z_Proj_VsDelTime", 600, -300, 300, 200, -2000, 2000, anodeIntersection.Z(), anodeT - cathodeT, "hPCzQQQ");
|
||||||
plotter->Fill2D("IntPhi_vs_QQQphi", 100, -200, 200, 80, -200, 200, anodeIntersection.Phi() * 180. / TMath::Pi(), hitPos.Phi() * 180. / TMath::Pi(), "hPCQQQ");
|
plotter->Fill2D("IntPhi_vs_QQQphi", 100, -200, 200, 80, -200, 200, anodeIntersection.Phi() * 180. / TMath::Pi(), hitPos.Phi() * 180. / TMath::Pi(), "hPCQQQ");
|
||||||
// plotter->Fill2D("Inttheta_vs_QQQtheta", 90, 0, 180, 20, 0, 45, anodeIntersection.Theta() * 180. / TMath::Pi(), hitPos.Theta() * 180. / TMath::Pi(), "hPCQQQ");
|
//plotter->Fill2D("Inttheta_vs_QQQtheta", 90, 0, 180, 20, 0, 45, anodeIntersection.Theta() * 180. / TMath::Pi(), hitPos.Theta() * 180. / TMath::Pi(), "hPCQQQ");
|
||||||
// plotter->Fill2D("Inttheta_vs_QQQtheta_TC" + std::to_string(PCQQQTimeCut)+ "_PC"+std::to_string(PCQQQPhiCut), 90, 0, 180, 20, 0, 45, anodeIntersection.Theta() * 180. / TMath::Pi(), hitPos.Theta() * 180. / TMath::Pi(), "hPCQQQ");
|
//plotter->Fill2D("Inttheta_vs_QQQtheta_TC" + std::to_string(PCQQQTimeCut)+ "_PC"+std::to_string(PCQQQPhiCut), 90, 0, 180, 20, 0, 45, anodeIntersection.Theta() * 180. / TMath::Pi(), hitPos.Theta() * 180. / TMath::Pi(), "hPCQQQ");
|
||||||
plotter->Fill2D("IntPhi_vs_QQQphi_TC" + std::to_string(PCQQQTimeCut) + "PhiC" + std::to_string(PCQQQPhiCut), 100, -200, 200, 80, -200, 200, anodeIntersection.Phi() * 180. / TMath::Pi(), hitPos.Phi() * 180. / TMath::Pi(), "hPCQQQ");
|
plotter->Fill2D("IntPhi_vs_QQQphi_TC" + std::to_string(PCQQQTimeCut) + "PhiC" + std::to_string(PCQQQPhiCut), 100, -200, 200, 80, -200, 200, anodeIntersection.Phi() * 180. / TMath::Pi(), hitPos.Phi() * 180. / TMath::Pi(), "hPCQQQ");
|
||||||
}
|
}
|
||||||
if (anodeIntersection.Z() != 0 && cathodeHits.size() >= 2)
|
if (anodeIntersection.Z() != 0 && cathodeHits.size() >= 2)
|
||||||
|
|
@ -740,46 +793,42 @@ Bool_t MakeVertex::Process(Long64_t entry)
|
||||||
{
|
{
|
||||||
pw_contr.CalTrack2(hitPos, anodeIntersection);
|
pw_contr.CalTrack2(hitPos, anodeIntersection);
|
||||||
plotter->Fill1D("VertexRecon", 600, -1300, 1300, pw_contr.GetZ0());
|
plotter->Fill1D("VertexRecon", 600, -1300, 1300, pw_contr.GetZ0());
|
||||||
plotter->Fill1D("VertexRecon_TC" + std::to_string(PCQQQTimeCut) + "_PhiC" + std::to_string(PCQQQPhiCut), 600, -1300, 1300, pw_contr.GetZ0());
|
plotter->Fill1D("VertexRecon_TC"+std::to_string(PCQQQTimeCut)+"_PhiC"+std::to_string(PCQQQPhiCut), 600, -1300, 1300, pw_contr.GetZ0());
|
||||||
|
|
||||||
if (cathodeHits.size() == 2)
|
if (cathodeHits.size() == 2)
|
||||||
plotter->Fill1D("VertexRecon_2c_TC" + std::to_string(PCQQQTimeCut) + "_PhiC" + std::to_string(PCQQQPhiCut), 600, -1300, 1300, pw_contr.GetZ0());
|
plotter->Fill1D("VertexRecon_2c_TC"+std::to_string(PCQQQTimeCut)+"_PhiC"+std::to_string(PCQQQPhiCut), 600, -1300, 1300, pw_contr.GetZ0());
|
||||||
|
|
||||||
TVector3 x2(anodeIntersection), x1(hitPos);
|
TVector3 x2(anodeIntersection), x1(hitPos);
|
||||||
|
|
||||||
TVector3 v = x2 - x1;
|
TVector3 v = x2-x1;
|
||||||
double t_minimum = -1.0 * (x1.X() * v.X() + x1.Y() * v.Y()) / (v.X() * v.X() + v.Y() * v.Y());
|
double t_minimum = -1.0*(x1.X()*v.X()+x1.Y()*v.Y())/(v.X()*v.X()+v.Y()*v.Y());
|
||||||
vector_closest_to_z = x1 + t_minimum * v;
|
vector_closest_to_z = x1 + t_minimum*v;
|
||||||
|
|
||||||
plotter->Fill1D("VertexRecon_Z_TC" + std::to_string(PCQQQTimeCut) + "_PhiC" + std::to_string(PCQQQPhiCut), 600, -1300, 1300, vector_closest_to_z.Z(), "customVertex");
|
plotter->Fill1D("VertexRecon_Z_TC"+std::to_string(PCQQQTimeCut)+"_PhiC"+std::to_string(PCQQQPhiCut), 600, -1300, 1300, vector_closest_to_z.Z() ,"customVertex");
|
||||||
if (vector_closest_to_z.Perp() < 20)
|
if(vector_closest_to_z.Perp() < 20) {
|
||||||
{
|
plotter->Fill1D("VertexRecon_RadialCut_Z_TC"+std::to_string(PCQQQTimeCut)+"_PhiC"+std::to_string(PCQQQPhiCut), 600, -1300, 1300, vector_closest_to_z.Z() ,"customVertex");
|
||||||
plotter->Fill1D("VertexRecon_RadialCut_Z_TC" + std::to_string(PCQQQTimeCut) + "_PhiC" + std::to_string(PCQQQPhiCut), 600, -1300, 1300, vector_closest_to_z.Z(), "customVertex");
|
}
|
||||||
}
|
|
||||||
|
plotter->Fill2D("VertexRecon_XY_TC"+std::to_string(PCQQQTimeCut)+"_PhiC"+std::to_string(PCQQQPhiCut), 100, -100, 100, 100,-100,100, vector_closest_to_z.X(), vector_closest_to_z.Y() ,"customVertex");
|
||||||
|
if(cathodeHits.size()==2) {
|
||||||
|
plotter->Fill1D("VertexRecon2C_Z_TC"+std::to_string(PCQQQTimeCut)+"_PhiC"+std::to_string(PCQQQPhiCut), 600, -1300, 1300, vector_closest_to_z.Z() ,"customVertex");
|
||||||
|
if(vector_closest_to_z.Perp() < 20) {
|
||||||
|
plotter->Fill1D("VertexRecon2C_RadialCut_Z_TC"+std::to_string(PCQQQTimeCut)+"_PhiC"+std::to_string(PCQQQPhiCut), 600, -1300, 1300, vector_closest_to_z.Z() ,"customVertex");
|
||||||
|
}
|
||||||
|
plotter->Fill2D("VertexRecon2C_XY_TC"+std::to_string(PCQQQTimeCut)+"_PhiC"+std::to_string(PCQQQPhiCut), 100, -100, 100, 100,-100,100, vector_closest_to_z.X(), vector_closest_to_z.Y() ,"customVertex");
|
||||||
|
plotter->Fill2D("VertexRecon2C_RhoZ_TC"+std::to_string(PCQQQTimeCut)+"_PhiC"+std::to_string(PCQQQPhiCut), 100, -100, 100, 600,-1300,1300, vector_closest_to_z.Perp(), vector_closest_to_z.Z() ,"customVertex");
|
||||||
|
plotter->Fill2D("VertexRecon2C_Z_vs_QQQE_TC"+std::to_string(PCQQQTimeCut)+"_PhiC"+std::to_string(PCQQQPhiCut), 600, -1300, 1300, 800,0,20000, vector_closest_to_z.Z(), qqqenergy ,"customVertex");
|
||||||
|
}
|
||||||
|
|
||||||
plotter->Fill2D("VertexRecon_XY_TC" + std::to_string(PCQQQTimeCut) + "_PhiC" + std::to_string(PCQQQPhiCut), 100, -100, 100, 100, -100, 100, vector_closest_to_z.X(), vector_closest_to_z.Y(), "customVertex");
|
|
||||||
if (cathodeHits.size() == 2)
|
|
||||||
{
|
|
||||||
plotter->Fill1D("VertexRecon2C_Z_TC" + std::to_string(PCQQQTimeCut) + "_PhiC" + std::to_string(PCQQQPhiCut), 600, -1300, 1300, vector_closest_to_z.Z(), "customVertex");
|
|
||||||
if (vector_closest_to_z.Perp() < 20)
|
|
||||||
{
|
|
||||||
plotter->Fill1D("VertexRecon2C_RadialCut_Z_TC" + std::to_string(PCQQQTimeCut) + "_PhiC" + std::to_string(PCQQQPhiCut), 600, -1300, 1300, vector_closest_to_z.Z(), "customVertex");
|
|
||||||
}
|
|
||||||
plotter->Fill2D("VertexRecon2C_XY_TC" + std::to_string(PCQQQTimeCut) + "_PhiC" + std::to_string(PCQQQPhiCut), 100, -100, 100, 100, -100, 100, vector_closest_to_z.X(), vector_closest_to_z.Y(), "customVertex");
|
|
||||||
plotter->Fill2D("VertexRecon2C_RhoZ_TC" + std::to_string(PCQQQTimeCut) + "_PhiC" + std::to_string(PCQQQPhiCut), 100, -100, 100, 600, -1300, 1300, vector_closest_to_z.Perp(), vector_closest_to_z.Z(), "customVertex");
|
|
||||||
plotter->Fill2D("VertexRecon2C_Z_vs_QQQE_TC" + std::to_string(PCQQQTimeCut) + "_PhiC" + std::to_string(PCQQQPhiCut), 600, -1300, 1300, 800, 0, 20000, vector_closest_to_z.Z(), qqqenergy, "customVertex");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < qqq.multi; i++)
|
for (int i = 0; i < qqq.multi; i++)
|
||||||
{
|
{
|
||||||
if (anodeIntersection.Perp() > 0)
|
if(anodeIntersection.Perp() > 0) { //suppress x,y=0,0 events
|
||||||
{ // suppress x,y=0,0 events
|
if (PCQQQTimeCut) {
|
||||||
if (PCQQQTimeCut)
|
plotter->Fill2D("PC_XY_Projection_QQQ_TimeCut" + std::to_string(qqq.id[i]), 400, -100, 100, 400, -100, 100, anodeIntersection.X(), anodeIntersection.Y(), "hPCQQQ");
|
||||||
{
|
}
|
||||||
plotter->Fill2D("PC_XY_Projection_QQQ_TimeCut" + std::to_string(qqq.id[i]), 400, -100, 100, 400, -100, 100, anodeIntersection.X(), anodeIntersection.Y(), "hPCQQQ");
|
plotter->Fill2D("PC_XY_Projection_QQQ" + std::to_string(qqq.id[i]), 400, -100, 100, 400, -100, 100, anodeIntersection.X(), anodeIntersection.Y(), "hPCQQQ");
|
||||||
}
|
|
||||||
plotter->Fill2D("PC_XY_Projection_QQQ" + std::to_string(qqq.id[i]), 400, -100, 100, 400, -100, 100, anodeIntersection.X(), anodeIntersection.Y(), "hPCQQQ");
|
|
||||||
}
|
}
|
||||||
for (int j = i + 1; j < qqq.multi; j++)
|
for (int j = i + 1; j < qqq.multi; j++)
|
||||||
{
|
{
|
||||||
|
|
@ -839,52 +888,48 @@ Bool_t MakeVertex::Process(Long64_t entry)
|
||||||
// plotter->Fill2D("EdE_PC_vs_QQQ_timegate_ls1000"+std::to_string())
|
// plotter->Fill2D("EdE_PC_vs_QQQ_timegate_ls1000"+std::to_string())
|
||||||
|
|
||||||
plotter->Fill2D("PC_Z_vs_QQQRing_Det" + std::to_string(qqqID), 600, -300, 300, 16, 0, 16, anodeIntersection.Z(), chRing, "hPCQQQ");
|
plotter->Fill2D("PC_Z_vs_QQQRing_Det" + std::to_string(qqqID), 600, -300, 300, 16, 0, 16, anodeIntersection.Z(), chRing, "hPCQQQ");
|
||||||
// double theta = -TMath::Pi() / 2 + 2 * TMath::Pi() / 16 / 4. * (qqq.id[i] * 16 + chWedge + 0.5);
|
//double theta = -TMath::Pi() / 2 + 2 * TMath::Pi() / 16 / 4. * (qqq.id[i] * 16 + chWedge + 0.5);
|
||||||
// double rho = 50. + 40. / 16. * (chRing + 0.5);
|
//double rho = 50. + 40. / 16. * (chRing + 0.5);
|
||||||
|
|
||||||
for (int k = 0; k < pc.multi; k++)
|
for (int k = 0; k < pc.multi; k++)
|
||||||
{
|
{
|
||||||
if (pc.index[k] >= 24)
|
if(pc.index[k] >= 24)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
// double sinTheta = TMath::Sin((hitPos-vector_closest_to_z).Theta());
|
||||||
|
double sinTheta = TMath::Sin((anodeIntersection-TVector3(0,0,90.0)).Theta());
|
||||||
|
// double sinTheta = TMath::Sin((anodeIntersection-vector_closest_to_z).Theta());
|
||||||
|
// double sinTheta = TMath::Sin((hitPos-TVector3(0,0,30.0)).Theta());
|
||||||
|
// double sinTheta = TMath::Sin(hitPos.Theta());
|
||||||
|
|
||||||
// double sinTheta = TMath::Sin((hitPos-vector_closest_to_z).Theta());
|
if(cathodeHits.size()==2 && PCQQQPhiCut) {
|
||||||
// double sinTheta = TMath::Sin((anodeIntersection-TVector3(0,0,90.0)).Theta());
|
plotter->Fill2D("CalibratedQQQE_RvsCPCE_TC" + std::to_string(PCQQQTimeCut) , 400, 0, 10, 400, 0, 30000, eRingMeV, pc.e[k]*sinTheta, "hPCQQQ");
|
||||||
double sinTheta = TMath::Sin((anodeIntersection - vector_closest_to_z).Theta());
|
plotter->Fill2D("CalibratedQQQE_WvsCPCE_TC" + std::to_string(PCQQQTimeCut) , 400, 0, 10, 400, 0, 30000, eWedgeMeV, pc.e[k]*sinTheta, "hPCQQQ");
|
||||||
// double sinTheta = TMath::Sin((hitPos-TVector3(0,0,30.0)).Theta());
|
plotter->Fill2D("CalibratedQQQE_RvsPCE_TC" + std::to_string(PCQQQTimeCut) , 400, 0, 10, 400, 0, 30000, eRingMeV, pc.e[k], "hPCQQQ");
|
||||||
// double sinTheta = TMath::Sin(hitPos.Theta());
|
plotter->Fill2D("CalibratedQQQE_WvsPCE_TC" + std::to_string(PCQQQTimeCut) , 400, 0, 10, 400, 0, 30000, eWedgeMeV, pc.e[k], "hPCQQQ");
|
||||||
|
plotter->Fill2D("PCQQQ_dTimevsdPhi", 200, -2000, 2000, 80, -200, 200, tRing - static_cast<double>(pc.t[k]), (hitPos.Phi()-anodeIntersection.Phi()) * 180. / TMath::Pi(), "hTiming");
|
||||||
// if(cathodeHits.size()==2 && PCQQQPhiCut) {
|
|
||||||
{
|
|
||||||
plotter->Fill2D("CalibratedQQQE_RvsCPCE_TC" + std::to_string(PCQQQTimeCut) + std::to_string(pw_contr.GetZ0() < -150), 400, 0, 10, 400, 0, 30000, eRingMeV, pc.e[k] * sinTheta, "hPCQQQ");
|
|
||||||
plotter->Fill2D("CalibratedQQQE_RvsCPCE_Cal_TC" + std::to_string(PCQQQTimeCut) + std::to_string(pw_contr.GetZ0() < -150), 400, 0, 10, 400, 0, 200, eRingMeV, pc.e[k] * sinTheta / 151.461, "hPCQQQ"); // division by 151.5 for rough conversion of PC energy to keV from the slope on teh Source data
|
|
||||||
plotter->Fill2D("CalibratedQQQE_WvsCPCE_TC" + std::to_string(PCQQQTimeCut), 400, 0, 10, 400, 0, 30000, eWedgeMeV, pc.e[k] * sinTheta, "hPCQQQ");
|
|
||||||
plotter->Fill2D("CalibratedQQQE_RvsPCE_TC" + std::to_string(PCQQQTimeCut) + std::to_string(pw_contr.GetZ0() < -150), 400, 0, 10, 400, 0, 30000, eRingMeV, pc.e[k], "hPCQQQ");
|
|
||||||
plotter->Fill2D("CalibratedQQQE_RvsPCE_Cal_TC" + std::to_string(PCQQQTimeCut) + std::to_string(pw_contr.GetZ0() < -150), 400, 0, 10, 400, 0, 200, eRingMeV, pc.e[k] / 151.461, "hPCQQQ"); // division by 151.5 for rough conversion of PC energy to keV from the slope on teh Source data
|
|
||||||
plotter->Fill2D("CalibratedQQQE_WvsPCE_TC" + std::to_string(PCQQQTimeCut), 400, 0, 10, 400, 0, 30000, eWedgeMeV, pc.e[k], "hPCQQQ");
|
|
||||||
plotter->Fill2D("PCQQQ_dTimevsdPhi", 200, -2000, 2000, 80, -200, 200, tRing - static_cast<double>(pc.t[k]), (hitPos.Phi() - anodeIntersection.Phi()) * 180. / TMath::Pi(), "hTiming");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
} /// qqq i==j case end
|
}///qqq i==j case end
|
||||||
} // j loop end
|
} //j loop end
|
||||||
} // qqq i loop end
|
} // qqq i loop end
|
||||||
|
|
||||||
TVector3 guessVertex(0, 0, 90.); // for run12, subtract anodeIntersection.Z() by ~74.0 seems to work
|
TVector3 guessVertex(0,0,90.); //for run12, subtract anodeIntersection.Z() by ~74.0 seems to work
|
||||||
// rho=40.0 mm is halfway between the cathodes(rho=42) and anodes(rho=37)
|
//rho=40.0 mm is halfway between the cathodes(rho=42) and anodes(rho=37)
|
||||||
double pcz_guess = 42.0 / TMath::Tan((hitPos - guessVertex).Theta()) + guessVertex.Z(); // this is ideally kept to be all QQQ+userinput for calibration of pcz
|
double pcz_guess = 42.0/TMath::Tan((hitPos-guessVertex).Theta()) + guessVertex.Z(); //this is ideally kept to be all QQQ+userinput for calibration of pcz
|
||||||
if (PCQQQTimeCut && PCQQQPhiCut && hitPos.Perp() > 0 && anodeIntersection.Perp() > 0 && cathodeHits.size() >= 2)
|
if(PCQQQTimeCut && PCQQQPhiCut && hitPos.Perp()>0 && anodeIntersection.Perp()>0 && cathodeHits.size()>=2) {
|
||||||
{
|
plotter->Fill2D("pczguess_vs_qqqE",100,0,200,800,0,20,pcz_guess,qqqenergy,"pczguess");
|
||||||
plotter->Fill2D("pczguess_vs_qqqE", 100, 0, 200, 800, 0, 20, pcz_guess, qqqenergy, "pczguess");
|
double pczoffset=30.0;
|
||||||
// double pczoffset = 30.0;
|
//plotter->Fill2D("pczguess_vs_pcz_rad="+std::to_string(hitPos.Perp()),100,0,200,150,0,200,pcz_guess,anodeIntersection.Z(),"pczguess"); //entirely qqq-derived position vs entirely PC derived position
|
||||||
// plotter->Fill2D("pczguess_vs_pcz_rad="+std::to_string(hitPos.Perp()),100,0,200,150,0,200,pcz_guess,anodeIntersection.Z(),"pczguess"); //entirely qqq-derived position vs entirely PC derived position
|
plotter->Fill2D("pczguess_vs_pcz_phi="+std::to_string(hitPos.Phi()*180./M_PI),100,0,200,150,0,200,pcz_guess,anodeIntersection.Z()+pczoffset,"pczguess"); //entirely qqq-derived position vs entirely PC derived position
|
||||||
plotter->Fill2D("pczguess_vs_pcz_phi=" + std::to_string(hitPos.Phi() * 180. / M_PI), 100, 0, 200, 150, 0, 200, pcz_guess, anodeIntersection.Z() , "pczguess"); // entirely qqq-derived position vs entirely PC derived position
|
plotter->Fill2D("pczguess_vs_pcz",100,0,200,150,0,200,pcz_guess,anodeIntersection.Z()+pczoffset);
|
||||||
plotter->Fill2D("pczguess_vs_pcz", 300, 0, 200, 150, 0, 200, pcz_guess, anodeIntersection.Z() ,"pczguess"); //entirely qqq-derived position vs entirely PC derived position
|
plotter->Fill2D("pcz_vs_pcPhi_rad="+std::to_string(hitPos.Perp()),360,0,360,150,0,200,anodeIntersection.Phi()*180./M_PI,anodeIntersection.Z()+pczoffset,"pczguess");
|
||||||
plotter->Fill2D("pcz_vs_pcPhi_rad=" + std::to_string(hitPos.Perp()), 360, 0, 360, 150, 0, 200, anodeIntersection.Phi() * 180. / M_PI, anodeIntersection.Z() , "pczguess");
|
|
||||||
}
|
}
|
||||||
for (int i = 0; i < sx3.multi; i++)
|
for (int i = 0; i < sx3.multi; i++)
|
||||||
{
|
{
|
||||||
// plotting sx3 strip hits vs anode phi
|
// plotting sx3 strip hits vs anode phi
|
||||||
if (sx3.ch[i] < 8 && anodeIntersection.Perp() > 0)
|
if (sx3.ch[i] < 8 && anodeIntersection.Perp()>0)
|
||||||
plotter->Fill2D("PCPhi_vs_SX3Strip", 100, -200, 200, 8 * 24, 0, 8 * 24, anodeIntersection.Phi() * 180. / TMath::Pi(), sx3.id[i] * 8 + sx3.ch[i]);
|
plotter->Fill2D("PCPhi_vs_SX3Strip", 100, -200, 200, 8 * 24, 0, 8 * 24, anodeIntersection.Phi() * 180. / TMath::Pi(), sx3.id[i] * 8 + sx3.ch[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
67
sx3cal/sx3cal/EXFit.C
Executable file
67
sx3cal/sx3cal/EXFit.C
Executable file
|
|
@ -0,0 +1,67 @@
|
||||||
|
{
|
||||||
|
int index = 3;
|
||||||
|
TFile *f = new TFile("../results_SX3_run12.root");
|
||||||
|
TH2F *h2=NULL;
|
||||||
|
TH1F *h1x=NULL, *h1y=NULL;
|
||||||
|
//f->cd("evsx");
|
||||||
|
//f->ls();
|
||||||
|
|
||||||
|
double known_xpos[2][2] = {{0,18.75},{-18.75,0}};
|
||||||
|
std::vector<double> xpos, xposkn; //first = x = known position, second = y = unknown position
|
||||||
|
|
||||||
|
std::ofstream ofb(Form("backgains%d.dat",index));
|
||||||
|
std::ofstream off(Form("frontgains%d.dat",index));
|
||||||
|
for(int i=1; i<4; i++) {
|
||||||
|
//do it for pad#2
|
||||||
|
int backnum=2;
|
||||||
|
h2 = (TH2F*)(f->Get(Form("evsx/be_vs_x_sx3_id_%d_f%d_b%d",index,i,backnum)));
|
||||||
|
auto macro = [&]() {
|
||||||
|
h1x = (TH1F*)(h2->ProjectionX("_px"));
|
||||||
|
double xleft = h1x->GetBinCenter(h1x->FindFirstBinAbove(h1x->GetMaximum()*0.25));
|
||||||
|
double xright = h1x->GetBinCenter(h1x->FindLastBinAbove(h1x->GetMaximum()*0.25));
|
||||||
|
//h1x->GetXaxis()->SetRangeUser(4*xleft, xright*4);
|
||||||
|
h1x->Draw();
|
||||||
|
TLine L1(xleft,0,xleft,h1x->GetMaximum()); L1.SetLineColor(kRed); L1.Draw("SAME");
|
||||||
|
TLine L2(xright,0,xright,h1x->GetMaximum()); L2.SetLineColor(kRed); L2.Draw("SAME");
|
||||||
|
gPad->Modified();
|
||||||
|
gPad->Update();
|
||||||
|
xpos.push_back(xleft); xposkn.push_back(known_xpos[backnum-1][0]);
|
||||||
|
xpos.push_back(xright); xposkn.push_back(known_xpos[backnum-1][1]);
|
||||||
|
while(gPad->WaitPrimitive());
|
||||||
|
|
||||||
|
h1y = (TH1F*)(h2->ProjectionY("_py"));
|
||||||
|
double ycenter = h1y->GetBinCenter(h1y->GetMaximumBin());
|
||||||
|
// std::cout << "front " << i << " back " << backnum << " " << xleft << " " << xright << " " << ycenter << " " << 5486/ycenter << std::endl;
|
||||||
|
ofb << index <<" front " << i << " back " << backnum << " " << 5486/ycenter << std::endl;
|
||||||
|
h1y->GetXaxis()->SetRangeUser(ycenter-200,ycenter+200);
|
||||||
|
h1y->Draw();
|
||||||
|
TLine L3(ycenter,0,ycenter,h1y->GetMaximum()*1.1); L3.SetLineColor(kRed); L3.Draw("SAME");
|
||||||
|
|
||||||
|
gPad->Modified();
|
||||||
|
gPad->Update();
|
||||||
|
while(gPad->WaitPrimitive());
|
||||||
|
};
|
||||||
|
if(h2)
|
||||||
|
macro();
|
||||||
|
|
||||||
|
//repeat for pad#1
|
||||||
|
backnum=1;
|
||||||
|
h2 = (TH2F*)(f->Get(Form("evsx/be_vs_x_sx3_id_%d_f%d_b%d",index,i,backnum)));
|
||||||
|
if(h2)
|
||||||
|
macro();
|
||||||
|
|
||||||
|
double xtofit[] = {xpos[0],xpos[3]};
|
||||||
|
double xktofit[] = {xposkn[0],xposkn[3]};
|
||||||
|
TGraph G1(xpos.size(),xpos.data(),xposkn.data());
|
||||||
|
G1.Draw("APL*");
|
||||||
|
G1.Fit("pol1","Q");
|
||||||
|
off << index<<" lengthcal front " << i << " " << G1.GetFunction("pol1")->GetParameter(0) << " " << G1.GetFunction("pol1")->GetParameter(1) << std::endl;
|
||||||
|
gPad->Modified(); gPad->Update();
|
||||||
|
while(gPad->WaitPrimitive());
|
||||||
|
xpos.clear();
|
||||||
|
xposkn.clear();
|
||||||
|
}
|
||||||
|
ofb.close();
|
||||||
|
off.close();
|
||||||
|
f->Close();
|
||||||
|
}
|
||||||
37
sx3cal/sx3cal/LRFit.C
Executable file
37
sx3cal/sx3cal/LRFit.C
Executable file
|
|
@ -0,0 +1,37 @@
|
||||||
|
{
|
||||||
|
TFile *f = new TFile("../results_SX3_run12.root");
|
||||||
|
f->cd("l_vs_r");
|
||||||
|
f->ls();
|
||||||
|
int clkpos = 3;
|
||||||
|
std::ofstream ofile(Form("rightgains%d.dat",clkpos));
|
||||||
|
for(int i=1; i<4; i++) {
|
||||||
|
TH2F h2(*(TH2F*)(f->Get(Form("l_vs_r/l_vs_r_sx3_id_%d_f%d",clkpos,i))));
|
||||||
|
h2.Draw();
|
||||||
|
|
||||||
|
TH1F hproj(*(TH1F*)(h2.ProjectionX("_px")));
|
||||||
|
/*hproj.Draw("SAME");
|
||||||
|
gPad->Modified();
|
||||||
|
gPad->Update();
|
||||||
|
while(gPad->WaitPrimitive());*/
|
||||||
|
|
||||||
|
int leftbin = hproj.FindFirstBinAbove(hproj.GetMaximum()*0.1);
|
||||||
|
int rightbin = hproj.FindLastBinAbove(hproj.GetMaximum()*0.1);
|
||||||
|
|
||||||
|
TH1F h1(*(TH1F*)(h2.ProfileX("_pfx",leftbin,rightbin)));
|
||||||
|
h1.Draw("histo same");
|
||||||
|
TLine L1(h1.GetBinCenter(leftbin),0,h1.GetBinCenter(leftbin),1000); L1.SetLineColor(kRed); L1.Draw("SAME");
|
||||||
|
TLine L2(h1.GetBinCenter(rightbin),0,h1.GetBinCenter(rightbin),1000); L2.SetLineColor(kRed); L2.Draw("SAME");
|
||||||
|
//h2.GetYaxis()->SetRangeUser(0,2000);
|
||||||
|
//h2.GetXaxis()->SetRangeUser(hproj.GetBinCenter(leftbin),hproj.GetBinCenter(rightbin));
|
||||||
|
h2.Fit("pol1","","SAME",h1.GetBinCenter(leftbin),h1.GetBinCenter(rightbin));
|
||||||
|
|
||||||
|
TF1 *f1 = (TF1*)h2.GetFunction("pol1");
|
||||||
|
f1->Draw("SAME");
|
||||||
|
ofile << clkpos << " " << i << " " << f1->GetParameter(0) << " " << TMath::Abs(f1->GetParameter(1)) << std::endl;
|
||||||
|
gPad->Modified();
|
||||||
|
gPad->Update();
|
||||||
|
while(gPad->WaitPrimitive());
|
||||||
|
}
|
||||||
|
ofile.close();
|
||||||
|
f->Close();
|
||||||
|
}
|
||||||
28
sx3cal/sx3cal/backgains.dat
Executable file
28
sx3cal/sx3cal/backgains.dat
Executable file
|
|
@ -0,0 +1,28 @@
|
||||||
|
1 front 0 back 2 4.03168
|
||||||
|
1 front 1 back 2 4.03168
|
||||||
|
1 front 2 back 2 4.11533
|
||||||
|
1 front 3 back 2 4.17315
|
||||||
|
7 front 0 back 2 4.26886
|
||||||
|
7 front 0 back 1 3.44529
|
||||||
|
7 front 1 back 2 4.26886
|
||||||
|
7 front 1 back 1 3.44529
|
||||||
|
7 front 2 back 2 4.26886
|
||||||
|
7 front 2 back 1 3.46759
|
||||||
|
7 front 3 back 2 4.26886
|
||||||
|
7 front 3 back 1 3.44529
|
||||||
|
9 front 0 back 2 3.63215
|
||||||
|
9 front 0 back 1 3.42327
|
||||||
|
9 front 1 back 2 3.63215
|
||||||
|
9 front 1 back 1 3.42327
|
||||||
|
9 front 2 back 2 3.65694
|
||||||
|
9 front 2 back 1 3.46759
|
||||||
|
9 front 3 back 2 3.68208
|
||||||
|
9 front 3 back 1 3.42327
|
||||||
|
3 front 0 back 2 3.
|
||||||
|
3 front 0 back 1 3.
|
||||||
|
3 front 1 back 2 3.65694
|
||||||
|
3 front 1 back 1 3.68208
|
||||||
|
3 front 2 back 2 3.70756
|
||||||
|
3 front 2 back 1 3.78616
|
||||||
|
3 front 3 back 2 3.7334
|
||||||
|
3 front 3 back 1 3.68208
|
||||||
80
sx3cal/sx3cal/backgains.dat.unity
Executable file
80
sx3cal/sx3cal/backgains.dat.unity
Executable file
|
|
@ -0,0 +1,80 @@
|
||||||
|
1 0 0 1.
|
||||||
|
1 1 0 1.
|
||||||
|
1 2 0 1.
|
||||||
|
1 3 0 1.
|
||||||
|
1 0 1 1.
|
||||||
|
1 1 1 1.
|
||||||
|
1 2 1 1.
|
||||||
|
1 3 1 1.
|
||||||
|
1 0 2 1.
|
||||||
|
1 1 2 1.
|
||||||
|
1 2 2 1.
|
||||||
|
1 3 2 1.
|
||||||
|
1 0 3 1.
|
||||||
|
1 1 3 1.
|
||||||
|
1 2 3 1.
|
||||||
|
1 3 3 1.
|
||||||
|
7 0 0 1.
|
||||||
|
7 1 0 1.
|
||||||
|
7 2 0 1.
|
||||||
|
7 3 0 1.
|
||||||
|
7 0 1 1.
|
||||||
|
7 1 1 1.
|
||||||
|
7 2 1 1.
|
||||||
|
7 3 1 1.
|
||||||
|
7 0 2 1.
|
||||||
|
7 1 2 1.
|
||||||
|
7 2 2 1.
|
||||||
|
7 3 2 1.
|
||||||
|
7 0 3 1.
|
||||||
|
7 1 3 1.
|
||||||
|
7 2 3 1.
|
||||||
|
7 3 3 1.
|
||||||
|
0 0 0 1.
|
||||||
|
0 1 0 1.
|
||||||
|
0 2 0 1.
|
||||||
|
0 3 0 1.
|
||||||
|
0 0 1 1.
|
||||||
|
0 1 1 1.
|
||||||
|
0 2 1 1.
|
||||||
|
0 3 1 1.
|
||||||
|
0 0 2 1.
|
||||||
|
0 1 2 1.
|
||||||
|
0 2 2 1.
|
||||||
|
0 3 2 1.
|
||||||
|
0 0 3 1.
|
||||||
|
0 1 3 1.
|
||||||
|
0 2 3 1.
|
||||||
|
0 3 3 1.
|
||||||
|
2 0 0 1.
|
||||||
|
2 1 0 1.
|
||||||
|
2 2 0 1.
|
||||||
|
2 3 0 1.
|
||||||
|
2 0 1 1.
|
||||||
|
2 1 1 1.
|
||||||
|
2 2 1 1.
|
||||||
|
2 3 1 1.
|
||||||
|
2 0 2 1.
|
||||||
|
2 1 2 1.
|
||||||
|
2 2 2 1.
|
||||||
|
2 3 2 1.
|
||||||
|
2 0 3 1.
|
||||||
|
2 1 3 1.
|
||||||
|
2 2 3 1.
|
||||||
|
2 3 3 1.
|
||||||
|
9 0 0 1.
|
||||||
|
9 1 0 1.
|
||||||
|
9 2 0 1.
|
||||||
|
9 3 0 1.
|
||||||
|
9 0 1 1.
|
||||||
|
9 1 1 1.
|
||||||
|
9 2 1 1.
|
||||||
|
9 3 1 1.
|
||||||
|
9 0 2 1.
|
||||||
|
9 1 2 1.
|
||||||
|
9 2 2 1.
|
||||||
|
9 3 2 1.
|
||||||
|
9 0 3 1.
|
||||||
|
9 1 3 1.
|
||||||
|
9 2 3 1.
|
||||||
|
9 3 3 1.
|
||||||
16
sx3cal/sx3cal/frontgains.dat
Executable file
16
sx3cal/sx3cal/frontgains.dat
Executable file
|
|
@ -0,0 +1,16 @@
|
||||||
|
1 lengthcal front 0 0.878906 58.5938
|
||||||
|
1 lengthcal front 1 1.42045 56.8182
|
||||||
|
1 lengthcal front 2 -2.55682 56.8182
|
||||||
|
1 lengthcal front 3 2.55682 56.8182
|
||||||
|
7 lengthcal front 0 0.425806 42.5806
|
||||||
|
7 lengthcal front 1 1.92004 45.1774
|
||||||
|
7 lengthcal front 2 1.11607 44.6429
|
||||||
|
7 lengthcal front 3 3.45909 44.6334
|
||||||
|
9 lengthcal front 0 1.82872 45.7181
|
||||||
|
9 lengthcal front 1 1.01649 45.1774
|
||||||
|
9 lengthcal front 2 1.46827 45.1774
|
||||||
|
9 lengthcal front 3 2.54513 46.2751
|
||||||
|
3 lengthcal front 0 0. 50.
|
||||||
|
3 lengthcal front 1 1.1713 58.5652
|
||||||
|
3 lengthcal front 2 -3.07505 58.5723
|
||||||
|
3 lengthcal front 3 4.0726 60.3348
|
||||||
20
sx3cal/sx3cal/frontgains.dat.unity
Executable file
20
sx3cal/sx3cal/frontgains.dat.unity
Executable file
|
|
@ -0,0 +1,20 @@
|
||||||
|
9 temp temp 0 0. 1.
|
||||||
|
9 temp temp 1 0. 1.
|
||||||
|
9 temp temp 2 0. 1.
|
||||||
|
9 temp temp 3 0. 1.
|
||||||
|
7 temp temp 0 0. 1.
|
||||||
|
7 temp temp 1 0. 1.
|
||||||
|
7 temp temp 2 0. 1.
|
||||||
|
7 temp temp 3 0. 1.
|
||||||
|
1 temp temp 0 0. 1.
|
||||||
|
1 temp temp 1 0. 1.
|
||||||
|
1 temp temp 2 0. 1.
|
||||||
|
1 temp temp 3 0. 1.
|
||||||
|
2 temp temp 0 0. 1.
|
||||||
|
2 temp temp 1 0. 1.
|
||||||
|
2 temp temp 2 0. 1.
|
||||||
|
2 temp temp 3 0. 1.
|
||||||
|
0 temp temp 0 0. 1.
|
||||||
|
0 temp temp 1 0. 1.
|
||||||
|
0 temp temp 2 0. 1.
|
||||||
|
0 temp temp 3 0. 1.
|
||||||
16
sx3cal/sx3cal/rightgains.dat
Executable file
16
sx3cal/sx3cal/rightgains.dat
Executable file
|
|
@ -0,0 +1,16 @@
|
||||||
|
1 0 1221.23 0.648782
|
||||||
|
1 1 1819.66 1.06196
|
||||||
|
1 2 1860.02 1.11979
|
||||||
|
1 3 1825.44 0.964989
|
||||||
|
7 0 1609.63 1.04668
|
||||||
|
7 1 1734.45 1.12285
|
||||||
|
7 2 1538.97 1.0486
|
||||||
|
7 3 1524.57 0.951587
|
||||||
|
9 0 1672.38 1.11321
|
||||||
|
9 1 1542.13 1.01442
|
||||||
|
9 2 1540.38 0.967847
|
||||||
|
9 3 1560.42 0.969022
|
||||||
|
3 0 1000.0 1.
|
||||||
|
3 1 1539.42 1.0422
|
||||||
|
3 2 1720.12 1.31534
|
||||||
|
3 3 1562.16 1.00415
|
||||||
20
sx3cal/sx3cal/rightgains.dat.unity
Executable file
20
sx3cal/sx3cal/rightgains.dat.unity
Executable file
|
|
@ -0,0 +1,20 @@
|
||||||
|
9 0 1000 1.0
|
||||||
|
9 1 1000 1.0
|
||||||
|
9 2 1000 1.0
|
||||||
|
9 3 1000 1.0
|
||||||
|
7 0 1000 1.0
|
||||||
|
7 1 1000 1.0
|
||||||
|
7 2 1000 1.0
|
||||||
|
7 3 1000 1.0
|
||||||
|
2 0 1000 1.0
|
||||||
|
2 1 1000 1.0
|
||||||
|
2 2 1000 1.0
|
||||||
|
2 3 1000 1.0
|
||||||
|
0 0 1000 1.0
|
||||||
|
0 1 1000 1.0
|
||||||
|
0 2 1000 1.0
|
||||||
|
0 3 1000 1.0
|
||||||
|
1 0 1000 1.0
|
||||||
|
1 1 1000 1.0
|
||||||
|
1 2 1000 1.0
|
||||||
|
1 3 1000 1.0
|
||||||
Loading…
Reference in New Issue
Block a user