BmnRoot
Loading...
Searching...
No Matches
BmnGemResiduals.cxx
Go to the documentation of this file.
1#include <BmnGemResiduals.h>
2#include <Fit/FitResult.h>
3#include <TSystem.h>
4
5BmnGemResiduals::BmnGemResiduals(Int_t run_period, Int_t run_number, Double_t fieldScale) :
6isField(kFALSE),
7isResid(kTRUE),
8fDebug(kFALSE),
9outRes(NULL),
10isPrintToFile(kFALSE),
11isMergedDigits(kFALSE) {
12 fPeriod = run_period;
13 fNumber = run_number;
14
15 if (Abs(fieldScale) > DBL_EPSILON)
16 isField = kTRUE;
17
18 TString gPathConfig = gSystem->Getenv("VMCWORKDIR");
19 TString gPathGemConfig = gPathConfig + "/parameters/gem/XMLConfigs/";
20 TString confGem = (fPeriod == 7) ? "GemRunSpring2018.xml" : (fPeriod == 6) ? "GemRunSpring2017.xml" : "";
21 if (confGem == "") {
22 printf(ANSI_COLOR_RED "No GEM geometry defined!\n" ANSI_COLOR_RESET);
23 throw;
24 }
25 fDetector = new BmnGemStripStationSet(gPathGemConfig + confGem);
26
27 fBranchGemHits = "BmnGemStripHit";
28 fBranchGemTracks = "BmnGemTrack";
29 fBranchResiduals = "BmnResiduals";
30 fBranchFairEventHeader = "EventHeader.";
31}
32
34 FairRootManager* ioman = FairRootManager::Instance();
35
36 fGemHits = (TClonesArray*) ioman->GetObject(fBranchGemHits.Data());
37 fGemTracks = (TClonesArray*) ioman->GetObject(fBranchGemTracks.Data());
38 fFairEventHeader = (FairEventHeader*) ioman->GetObject(fBranchFairEventHeader.Data());
39
40 fGemResiduals = new TClonesArray(fBranchResiduals.Data());
41
42 ioman->Register("BmnGemResiduals", "RESID", fGemResiduals, kTRUE);
43 if (TString(ioman->GetInFile()->GetName()).Contains("merge"))
44 isMergedDigits = kTRUE;
45}
46
47void BmnGemResiduals::Exec(Option_t* opt) {
48 fFairEventHeader->SetRunId((isMergedDigits) ? 0 : fNumber);
49 fGemResiduals->Delete();
50 ResidualsAndDistances();
51}
52
53void BmnGemResiduals::ResidualsAndDistances() {
54 if (isMergedDigits) {
55 // To be used for rough alignment (1205 + 1233 in RUN6 as an example)
56 // 2 tracks simultaneously separated and satisfying Tx1 * Tx2 < 0
57 if (fGemTracks->GetEntriesFast() != 2)
58 return;
59 Double_t Tx1 = ((BmnGemTrack*) fGemTracks->UncheckedAt(0))->GetParamFirst()->GetTx();
60 Double_t Tx2 = ((BmnGemTrack*) fGemTracks->UncheckedAt(1))->GetParamFirst()->GetTx();
61 if (Tx1 * Tx2 > 0)
62 return;
63 }
64
65 for (Int_t iTrack = 0; iTrack < fGemTracks->GetEntriesFast(); iTrack++) {
66 BmnGemTrack* track = (BmnGemTrack*) fGemTracks->UncheckedAt(iTrack);
67
68 Double_t tx = track->GetParamFirst()->GetTx();
69 Double_t ty = track->GetParamFirst()->GetTy();
70
71 Double_t xFirst = track->GetParamFirst()->GetX();
72 Double_t yFirst = track->GetParamFirst()->GetY();
73 Double_t zFirst = track->GetParamFirst()->GetZ();
74
75 for (Int_t iHit = 0; iHit < track->GetNHits(); iHit++) {
76 BmnGemStripHit* hit = (BmnGemStripHit*) fGemHits->At(track->GetHitIndex(iHit));
77 Double_t x = hit->GetX();
78 Double_t y = hit->GetY();
79 Double_t z = hit->GetZ();
80
81 Double_t xRes = 0., yRes = 0.;
82 if (!isField) {
83 if (isResid) {
84 xRes = x - (xFirst + tx * (z - zFirst));
85 yRes = y - (yFirst + ty * (z - zFirst));
86 } else {
87 Double_t a = 0., b = 0.;
88 LineFit(a, b, track, fGemHits, 1, iHit); // bmnbase/BmnMath.h
89 xRes = x - (a * z + b);
90 LineFit(a, b, track, fGemHits, 2, iHit);
91 yRes = y - (a * z + b);
92 }
93 } else {
94 isResid = kFALSE;
95 Double_t A = 0., B = 0., C = 0.;
96 Pol2Fit(track, fGemHits, A, B, C, iHit); // XZ-plane
97 xRes = x - A * z * z - B * z - C;
98
99 Double_t a = 0., b = 0.;
100 LineFit(a, b, track, fGemHits, 2, iHit);
101 yRes = y - (a * z + b); // YZ-plane
102 }
103
104 BmnResiduals* resid = new((*fGemResiduals)[fGemResiduals->GetEntriesFast()]) BmnResiduals(hit->GetStation(), hit->GetModule(), xRes, yRes, 0., isField, isResid);
105 resid->SetTrackId(iTrack);
106 resid->SetHitId(track->GetHitIndex(iHit));
107 resid->SetIsMergedDigits(isMergedDigits);
108 }
109 }
110}
111
113 delete fDetector;
114}
TVector3 LineFit(BmnTrack *track, const TClonesArray *arr, TString type)
Definition BmnMath.cxx:113
void Pol2Fit(BmnTrack *track, const TClonesArray *arr, Double_t &A, Double_t &B, Double_t &C, Int_t idSkip)
Definition BmnMath.cxx:781
#define ANSI_COLOR_RED
Definition BmnMath.h:16
#define ANSI_COLOR_RESET
Definition BmnMath.h:18
virtual InitStatus Init()
virtual void Exec(Option_t *opt)
virtual void Finish()
Int_t GetModule()
Definition BmnHit.h:77
Short_t GetStation() const
Definition BmnHit.h:45
FairTrackParam * GetParamFirst()
Definition BmnTrack.h:72
Int_t GetNHits() const
Definition BmnTrack.h:44
Int_t GetHitIndex(Int_t iHit) const
Definition BmnTrack.h:48