added uncertainties in calculating th etrack
This commit is contained in:
parent
d710df842d
commit
a668f64ab7
|
@ -21,6 +21,13 @@ public:
|
||||||
ANASEN();
|
ANASEN();
|
||||||
~ANASEN();
|
~ANASEN();
|
||||||
|
|
||||||
|
void SetUncertainties(double sx3W, double sx3L, double anode, double cathode){
|
||||||
|
sigmaA = anode;
|
||||||
|
sigmaC = cathode;
|
||||||
|
sigmaW = sx3W;
|
||||||
|
sigmaL = sx3L;
|
||||||
|
}
|
||||||
|
|
||||||
void DrawTrack(TVector3 pos, TVector3 direction, bool drawEstimatedTrack = false);
|
void DrawTrack(TVector3 pos, TVector3 direction, bool drawEstimatedTrack = false);
|
||||||
void DrawDeducedTrack(TVector3 sx3Pos, int anodeID, int cathodeID);
|
void DrawDeducedTrack(TVector3 sx3Pos, int anodeID, int cathodeID);
|
||||||
void DrawAnasen(int anodeID1 = -1,
|
void DrawAnasen(int anodeID1 = -1,
|
||||||
|
@ -40,6 +47,9 @@ private:
|
||||||
PW * pw;
|
PW * pw;
|
||||||
SX3 * sx3;
|
SX3 * sx3;
|
||||||
|
|
||||||
|
double sigmaA, sigmaC; // pw
|
||||||
|
double sigmaW, sigmaL; // sx3
|
||||||
|
|
||||||
const float qqqR1 = 50;
|
const float qqqR1 = 50;
|
||||||
const float qqqR2 = 100;
|
const float qqqR2 = 100;
|
||||||
const float qqqZPos = 23 + 75 + 30;
|
const float qqqZPos = 23 + 75 + 30;
|
||||||
|
@ -113,11 +123,9 @@ inline void ANASEN::Construct3DModel(int anodeID1, int anodeID2, int cathodeID1,
|
||||||
TGeoVolume *axisX = geom->MakeTube("axisX", Al, 0, 0.1, 5.);
|
TGeoVolume *axisX = geom->MakeTube("axisX", Al, 0, 0.1, 5.);
|
||||||
axisX->SetLineColor(1);
|
axisX->SetLineColor(1);
|
||||||
worldBox->AddNode(axisX, 1, new TGeoCombiTrans(5, 0, 0., new TGeoRotation("rotA", 90., 90., 0.)));
|
worldBox->AddNode(axisX, 1, new TGeoCombiTrans(5, 0, 0., new TGeoRotation("rotA", 90., 90., 0.)));
|
||||||
|
|
||||||
TGeoVolume *axisY = geom->MakeTube("axisY", Al, 0, 0.1, 5.);
|
TGeoVolume *axisY = geom->MakeTube("axisY", Al, 0, 0.1, 5.);
|
||||||
axisY->SetLineColor(1);
|
axisY->SetLineColor(1);
|
||||||
worldBox->AddNode(axisY, 1, new TGeoCombiTrans(0, 5, 0., new TGeoRotation("rotB", 0., 90., 0.)));
|
worldBox->AddNode(axisY, 1, new TGeoCombiTrans(0, 5, 0., new TGeoRotation("rotB", 0., 90., 0.)));
|
||||||
|
|
||||||
TGeoVolume *axisZ = geom->MakeTube("axisZ", Al, 0, 0.1, 5.);
|
TGeoVolume *axisZ = geom->MakeTube("axisZ", Al, 0, 0.1, 5.);
|
||||||
axisZ->SetLineColor(1);
|
axisZ->SetLineColor(1);
|
||||||
worldBox->AddNode(axisZ, 1, new TGeoTranslation(0, 0, 5));
|
worldBox->AddNode(axisZ, 1, new TGeoTranslation(0, 0, 5));
|
||||||
|
@ -238,7 +246,8 @@ inline void ANASEN::DrawTrack(TVector3 pos, TVector3 direction, bool drawEstima
|
||||||
worldBox->AddNode(startPos, 3, new TGeoCombiTrans( pos.X(), pos.Y(), pos.Z(), new TGeoRotation("rotA", 0, 0, 0.)));
|
worldBox->AddNode(startPos, 3, new TGeoCombiTrans( pos.X(), pos.Y(), pos.Z(), new TGeoRotation("rotA", 0, 0, 0.)));
|
||||||
|
|
||||||
if( sx3->GetID() >= 0 ){
|
if( sx3->GetID() >= 0 ){
|
||||||
TVector3 hitPos = sx3->GetHitPos();
|
//TVector3 hitPos = sx3->GetHitPos();
|
||||||
|
TVector3 hitPos = sx3->GetHitPosWithSigma(sigmaW, sigmaL);
|
||||||
|
|
||||||
TGeoVolume * hit = geom->MakeSphere("hitpos", 0, 0, 3);
|
TGeoVolume * hit = geom->MakeSphere("hitpos", 0, 0, 3);
|
||||||
hit->SetLineColor(kRed);
|
hit->SetLineColor(kRed);
|
||||||
|
@ -259,7 +268,7 @@ inline void ANASEN::DrawTrack(TVector3 pos, TVector3 direction, bool drawEstima
|
||||||
|
|
||||||
{//===== complicated
|
{//===== complicated
|
||||||
PWHitInfo hitInfo = pw->GetHitInfo();
|
PWHitInfo hitInfo = pw->GetHitInfo();
|
||||||
pw->CalTrack2(hitPos, hitInfo, true);
|
pw->CalTrack2(hitPos, hitInfo, sigmaA, sigmaC, true);
|
||||||
|
|
||||||
double thetaDeduce = pw->GetTrackTheta() * TMath::RadToDeg();
|
double thetaDeduce = pw->GetTrackTheta() * TMath::RadToDeg();
|
||||||
double phiDeduce = pw->GetTrackPhi() * TMath::RadToDeg();
|
double phiDeduce = pw->GetTrackPhi() * TMath::RadToDeg();
|
||||||
|
|
|
@ -27,7 +27,7 @@ struct PWHitInfo{
|
||||||
//!########################################################
|
//!########################################################
|
||||||
class PW{ // proportional wire
|
class PW{ // proportional wire
|
||||||
public:
|
public:
|
||||||
PW(){ ClearHitInfo(); };
|
PW(){ ClearHitInfo();};
|
||||||
~PW(){};
|
~PW(){};
|
||||||
|
|
||||||
PWHitInfo GetHitInfo() const {return hitInfo;}
|
PWHitInfo GetHitInfo() const {return hitInfo;}
|
||||||
|
@ -62,7 +62,7 @@ public:
|
||||||
void ConstructGeo();
|
void ConstructGeo();
|
||||||
void FindWireID(TVector3 pos, TVector3 direction, bool verbose = false);
|
void FindWireID(TVector3 pos, TVector3 direction, bool verbose = false);
|
||||||
void CalTrack(TVector3 sx3Pos, int anodeID, int cathodeID, bool verbose = false);
|
void CalTrack(TVector3 sx3Pos, int anodeID, int cathodeID, bool verbose = false);
|
||||||
void CalTrack2(TVector3 sx3Pos, PWHitInfo hitInfo, bool verbose = false);
|
void CalTrack2(TVector3 sx3Pos, PWHitInfo hitInfo, double sigmaA = 0, double sigmaC = 0, bool verbose = false);
|
||||||
|
|
||||||
void Print(){
|
void Print(){
|
||||||
printf(" The nearest | Anode: %2d(%5.2f) Cathode: %2d(%5.2f)\n", hitInfo.nearestWire.first,
|
printf(" The nearest | Anode: %2d(%5.2f) Cathode: %2d(%5.2f)\n", hitInfo.nearestWire.first,
|
||||||
|
@ -232,20 +232,21 @@ inline void PW::CalTrack(TVector3 sx3Pos, int anodeID, int cathodeID, bool verbo
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void PW::CalTrack2(TVector3 sx3Pos, PWHitInfo hitInfo, bool verbose){
|
inline void PW::CalTrack2(TVector3 sx3Pos, PWHitInfo hitInfo, double sigmaA, double sigmaC, bool verbose){
|
||||||
|
|
||||||
trackPos = sx3Pos;
|
trackPos = sx3Pos;
|
||||||
|
|
||||||
// fraction between the nearest wire and and the 2nd nearest wire by distance
|
double p1 = TMath::Abs(hitInfo.nearestDist.first + gRandom->Gaus(0, sigmaA));
|
||||||
double totDistA = hitInfo.nearestDist.first + hitInfo.nextNearestDist.first;
|
double p2 = TMath::Abs(hitInfo.nextNearestDist.first + gRandom->Gaus(0, sigmaA));
|
||||||
double fracA = hitInfo.nearestDist.first / totDistA;
|
double fracA = p1 / (p1 + p2);
|
||||||
short anodeID1 = hitInfo.nearestWire.first;
|
short anodeID1 = hitInfo.nearestWire.first;
|
||||||
short anodeID2 = hitInfo.nextNearestWire.first;
|
short anodeID2 = hitInfo.nextNearestWire.first;
|
||||||
TVector3 shiftA1 = (An[anodeID2].first - An[anodeID1].first) * fracA;
|
TVector3 shiftA1 = (An[anodeID2].first - An[anodeID1].first) * fracA;
|
||||||
TVector3 shiftA2 = (An[anodeID2].second - An[anodeID1].second) * fracA;
|
TVector3 shiftA2 = (An[anodeID2].second - An[anodeID1].second) * fracA;
|
||||||
|
|
||||||
double totDistC = hitInfo.nearestDist.second + hitInfo.nextNearestDist.second;
|
double q1 = TMath::Abs(hitInfo.nearestDist.second + gRandom->Gaus(0, sigmaC));
|
||||||
double fracC = hitInfo.nearestDist.second / totDistC;
|
double q2 = TMath::Abs(hitInfo.nextNearestDist.second + gRandom->Gaus(0, sigmaC));
|
||||||
|
double fracC = q1 / (q1 + q2);
|
||||||
short cathodeID1 = hitInfo.nearestWire.second;
|
short cathodeID1 = hitInfo.nearestWire.second;
|
||||||
short cathodeID2 = hitInfo.nextNearestWire.second;
|
short cathodeID2 = hitInfo.nextNearestWire.second;
|
||||||
TVector3 shiftC1 = (Ca[cathodeID2].first - Ca[cathodeID1].first) * fracC;
|
TVector3 shiftC1 = (Ca[cathodeID2].first - Ca[cathodeID1].first) * fracC;
|
||||||
|
|
|
@ -16,6 +16,7 @@ public:
|
||||||
short GetChBk() const {return chBk;}
|
short GetChBk() const {return chBk;}
|
||||||
|
|
||||||
TVector3 GetHitPos() const {return hitPos;}
|
TVector3 GetHitPos() const {return hitPos;}
|
||||||
|
TVector3 GetHitPosWithSigma(double sigmaY_mm, double sigmaZ_mm);
|
||||||
|
|
||||||
double GetZFrac() const {return zFrac;} // range from -0.5 to 0.5
|
double GetZFrac() const {return zFrac;} // range from -0.5 to 0.5
|
||||||
|
|
||||||
|
@ -187,6 +188,23 @@ inline void SX3::FindSX3Pos(TVector3 pos, TVector3 direction, bool verbose){
|
||||||
if( verbose) Print();
|
if( verbose) Print();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline TVector3 SX3::GetHitPosWithSigma(double sigmaY_mm, double sigmaZ_mm){
|
||||||
|
|
||||||
|
double phi = SNorml[id].Phi();
|
||||||
|
|
||||||
|
TVector3 haha = hitPos;
|
||||||
|
haha.RotateZ(-phi);
|
||||||
|
double y = haha.Y() + gRandom->Gaus(0, sigmaY_mm);
|
||||||
|
double z = haha.Z() + gRandom->Gaus(0, sigmaZ_mm);
|
||||||
|
|
||||||
|
haha.SetY(y);
|
||||||
|
haha.SetZ(z);
|
||||||
|
haha.RotateZ(phi);
|
||||||
|
|
||||||
|
return haha;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void SX3::CalSX3Pos(unsigned short ID, unsigned short chUp, unsigned short chDown, unsigned short chBack, float eUp, float eDown){
|
inline void SX3::CalSX3Pos(unsigned short ID, unsigned short chUp, unsigned short chDown, unsigned short chBack, float eUp, float eDown){
|
||||||
|
|
||||||
|
|
|
@ -35,9 +35,14 @@ int main(int argc, char **argv){
|
||||||
std::vector<float> ExAList = {0};
|
std::vector<float> ExAList = {0};
|
||||||
std::vector<float> ExList = {0, 1, 2};
|
std::vector<float> ExList = {0, 1, 2};
|
||||||
|
|
||||||
double vertexXRange[2] = { 0, 0};
|
double vertexXRange[2] = { -10, 10}; // mm
|
||||||
double vertexYRange[2] = { 0, 0};
|
double vertexYRange[2] = { -10, 10};
|
||||||
double vertexZRange[2] = { 0, 0};
|
double vertexZRange[2] = { -70, 70};
|
||||||
|
|
||||||
|
double sigmaSX3_W = 10; // mm
|
||||||
|
double sigmaSX3_L = 0; // mm
|
||||||
|
double sigmaPW_A = 0; // from 0 to 1.
|
||||||
|
double sigmaPW_C = 0; // from 0 to 1.
|
||||||
|
|
||||||
//###################################################
|
//###################################################
|
||||||
transfer.CalReactionConstant();
|
transfer.CalReactionConstant();
|
||||||
|
@ -183,15 +188,19 @@ int main(int argc, char **argv){
|
||||||
sx3Bk = sx3->GetChBk();
|
sx3Bk = sx3->GetChBk();
|
||||||
sx3ZFrac = sx3->GetZFrac();
|
sx3ZFrac = sx3->GetZFrac();
|
||||||
|
|
||||||
sx3X = sx3->GetHitPos().X();
|
//Introduce uncertaity
|
||||||
sx3Y = sx3->GetHitPos().Y();
|
// TVector3 hitPos = sx3->GetHitPos();
|
||||||
sx3Z = sx3->GetHitPos().Z();
|
TVector3 hitPos = sx3->GetHitPosWithSigma(sigmaSX3_W, sigmaSX3_L);
|
||||||
|
|
||||||
|
sx3X = hitPos.X();
|
||||||
|
sx3Y = hitPos.Y();
|
||||||
|
sx3Z = hitPos.Z();
|
||||||
|
|
||||||
pw->CalTrack(sx3->GetHitPos(), anodeID[0], cathodeID[0], false);
|
pw->CalTrack(hitPos, anodeID[0], cathodeID[0], false);
|
||||||
reTheta = pw->GetTrackTheta() * TMath::RadToDeg();
|
reTheta = pw->GetTrackTheta() * TMath::RadToDeg();
|
||||||
rePhi = pw->GetTrackPhi() * TMath::RadToDeg();
|
rePhi = pw->GetTrackPhi() * TMath::RadToDeg();
|
||||||
|
|
||||||
pw->CalTrack2(sx3->GetHitPos(), hitInfo, false);
|
pw->CalTrack2(hitPos, hitInfo, sigmaPW_A, sigmaPW_C, false);
|
||||||
reTheta1 = pw->GetTrackTheta() * TMath::RadToDeg();
|
reTheta1 = pw->GetTrackTheta() * TMath::RadToDeg();
|
||||||
rePhi1 = pw->GetTrackPhi() * TMath::RadToDeg();
|
rePhi1 = pw->GetTrackPhi() * TMath::RadToDeg();
|
||||||
|
|
||||||
|
|
17
script.C
17
script.C
|
@ -246,8 +246,15 @@ void script(TString fileName = "", int maxEvent = -1){
|
||||||
|
|
||||||
TCanvas * c2 = new TCanvas("c2", "ANASEN Simulation", 800, 800);
|
TCanvas * c2 = new TCanvas("c2", "ANASEN Simulation", 800, 800);
|
||||||
c2->cd();
|
c2->cd();
|
||||||
|
|
||||||
|
|
||||||
ANASEN * haha = new ANASEN();
|
ANASEN * haha = new ANASEN();
|
||||||
|
|
||||||
|
haha->SetUncertainties(10, 10, 1, 1);
|
||||||
|
|
||||||
|
PW * pw = haha->GetPW();
|
||||||
|
SX3 * sx3 = haha->GetSX3();
|
||||||
|
|
||||||
// haha->DrawAnasen(0, 1, 0, 1, -1, false);
|
// haha->DrawAnasen(0, 1, 0, 1, -1, false);
|
||||||
|
|
||||||
gRandom->SetSeed(0);
|
gRandom->SetSeed(0);
|
||||||
|
@ -273,13 +280,9 @@ void script(TString fileName = "", int maxEvent = -1){
|
||||||
|
|
||||||
haha->DrawTrack(pos, dir, true);
|
haha->DrawTrack(pos, dir, true);
|
||||||
|
|
||||||
PW pc;
|
pw->FindWireID(pos, dir, true);
|
||||||
pc.ConstructGeo();
|
sx3->FindSX3Pos(pos, dir, true);
|
||||||
pc.FindWireID(pos, dir, true);
|
|
||||||
|
|
||||||
SX3 sx3;
|
|
||||||
sx3.ConstructGeo();
|
|
||||||
sx3.FindSX3Pos(pos, dir, true);
|
|
||||||
|
|
||||||
// haha->CalTrack(sx3.hitPos, wireID.first, wireID.second, true);
|
// haha->CalTrack(sx3.hitPos, wireID.first, wireID.second, true);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user