[f17e10d] | 1 | #include <TVector3.h>
|
---|
| 2 | #include "AcceptanceClx.h"
|
---|
| 3 | #include <iostream>
|
---|
| 4 | //
|
---|
| 5 | // Pt splitting routine
|
---|
| 6 | //
|
---|
| 7 | void AcceptanceClx::VecInsert(Int_t i, Float_t x, TVectorF& Vec)
|
---|
| 8 | {
|
---|
| 9 | // Insert a new element x in location i+1 of vector Vec
|
---|
| 10 | //
|
---|
| 11 | Int_t N = Vec.GetNrows(); // Get vector nitial size
|
---|
| 12 | Vec.ResizeTo(N + 1); // Increase size
|
---|
| 13 | for (Int_t j = N - 1; j > i; j--)Vec(j + 1) = Vec(j); // Shift all elements above i
|
---|
| 14 | Vec(i+1) = x;
|
---|
| 15 | }
|
---|
| 16 | //
|
---|
| 17 | void AcceptanceClx::SplitPt(Int_t i, TVectorF &AccPt)
|
---|
| 18 | {
|
---|
| 19 | Int_t Nrows = fAcc.GetNrows();
|
---|
| 20 | Int_t Ncols = fAcc.GetNcols();
|
---|
| 21 | TMatrixF AccMod(Nrows + 1, Ncols); // Size output matrix
|
---|
| 22 | for (Int_t ith = 0; ith < Ncols; ith++)
|
---|
| 23 | {
|
---|
| 24 | AccMod(i + 1, ith) = AccPt(ith);
|
---|
| 25 | for (Int_t ipt = 0; ipt <= i; ipt++) AccMod(ipt, ith) = fAcc(ipt, ith);
|
---|
| 26 | for (Int_t ipt = i + 1; ipt < Nrows; ipt++) AccMod(ipt + 1, ith) = fAcc(ipt, ith);
|
---|
| 27 | }
|
---|
| 28 | //
|
---|
| 29 | fAcc.ResizeTo(Nrows + 1, Ncols);
|
---|
| 30 | fAcc = AccMod;
|
---|
| 31 | }
|
---|
| 32 | //
|
---|
| 33 | // Theta splitting routine
|
---|
| 34 | void AcceptanceClx::SplitTh(Int_t i, TVectorF &AccTh)
|
---|
| 35 | {
|
---|
| 36 | Int_t Nrows = fAcc.GetNrows();
|
---|
| 37 | Int_t Ncols = fAcc.GetNcols();
|
---|
| 38 | TMatrixF AccMod(Nrows, Ncols + 1); // Size output matrix
|
---|
| 39 | for (Int_t ipt = 0; ipt < Nrows; ipt++)
|
---|
| 40 | {
|
---|
| 41 | AccMod(ipt, i + 1) = AccTh(ipt);
|
---|
| 42 | for (Int_t ith = 0; ith <= i; ith++) AccMod(ipt, ith) = fAcc(ipt, ith);
|
---|
| 43 | for (Int_t ith = i + 1; ith < Ncols; ith++) AccMod(ipt, ith + 1) = fAcc(ipt, ith);
|
---|
| 44 | }
|
---|
| 45 | //
|
---|
| 46 | fAcc.ResizeTo(Nrows, Ncols + 1);
|
---|
| 47 | fAcc = AccMod;
|
---|
| 48 | }
|
---|
| 49 | //
|
---|
| 50 | // Constructors
|
---|
| 51 | //
|
---|
| 52 | AcceptanceClx::AcceptanceClx(TString InFile)
|
---|
| 53 | {
|
---|
| 54 | ReadAcceptance(InFile);
|
---|
| 55 | }
|
---|
| 56 | //
|
---|
| 57 | AcceptanceClx::AcceptanceClx(SolGeom* InGeo)
|
---|
| 58 | {
|
---|
| 59 | // Initializations
|
---|
| 60 | //
|
---|
| 61 | //std::cout << "Entered constructor of AccpeptanceClx" << std::endl;
|
---|
| 62 | // Setup grid
|
---|
| 63 | // Start grid parameters
|
---|
| 64 | //
|
---|
| 65 | // Pt nodes
|
---|
| 66 | const Int_t NpPtInp = 5;
|
---|
| 67 | Float_t PtInit[NpPtInp] = { 0., 1., 10., 100., 250. };
|
---|
| 68 | TVectorF Pta(NpPtInp, PtInit);
|
---|
| 69 | Int_t NpPt = Pta.GetNrows(); // Nr. of starting pt points
|
---|
| 70 | // Theta nodes
|
---|
| 71 | const Int_t NpThInp = 15;
|
---|
| 72 | Float_t ThInit[NpThInp] = { 0.,5.,10.,20.,30.,40.,50.,90.,
|
---|
| 73 | 130.,140.,150.,160.,170.,175., 180. };
|
---|
| 74 | TVectorF Tha(NpThInp, ThInit);
|
---|
| 75 | Int_t NpTh = Tha.GetNrows(); // Nr. of starting theta points
|
---|
| 76 | //std::cout << "AcceptanceClv:: Pta and Tha arrays defined" << std::endl;
|
---|
| 77 | //
|
---|
| 78 | // Grid splitting parameters
|
---|
| 79 | Float_t dPtMin = 0.2; // Grid Pt resolution (GeV)
|
---|
| 80 | Float_t dThMin = 2.0; // Grid Theta resolution (degrees)
|
---|
| 81 | Float_t dAmin = 1.0; // Minimum # hits step
|
---|
| 82 | //
|
---|
| 83 | fAcc.ResizeTo(NpPt, NpTh);
|
---|
| 84 | //
|
---|
| 85 | //
|
---|
| 86 | // Event loop: fill matrix starting nodes
|
---|
| 87 | //
|
---|
| 88 | TVector3 xv(0., 0., 0.);
|
---|
| 89 | for (Int_t ipt = 0; ipt < NpPt; ipt++) // Scan pt bins
|
---|
| 90 | {
|
---|
| 91 | // Momentum in GeV
|
---|
| 92 | Double_t pt = Pta(ipt);
|
---|
| 93 | //
|
---|
| 94 | for (Int_t ith = 0; ith < NpTh; ith++) // Scan theta bins
|
---|
| 95 | {
|
---|
| 96 | //
|
---|
| 97 | // Theta in from degrees to radians
|
---|
| 98 | Double_t th = TMath::Pi() * Tha(ith) / 180.;
|
---|
| 99 | Double_t pz = pt / TMath::Tan(th);
|
---|
| 100 | TVector3 tp(pt, 0., pz);
|
---|
| 101 | //
|
---|
| 102 | // Get number of measurement hits
|
---|
| 103 | //
|
---|
| 104 | SolTrack* gTrk = new SolTrack(xv, tp, InGeo); // Generated track
|
---|
| 105 | Int_t Mhits = gTrk->nmHit(); // Nr. Measurement hits
|
---|
| 106 | fAcc(ipt, ith) = (Float_t)Mhits;
|
---|
| 107 | }
|
---|
| 108 | }
|
---|
| 109 | //
|
---|
| 110 | // Scan nodes and split if needed
|
---|
| 111 | //
|
---|
| 112 | Int_t Nsplits = 1; // Number of split per iteration
|
---|
| 113 | Int_t Ncycles = 0; // Number of iterations
|
---|
| 114 | Int_t MaxSplits = 200; // Maximum number of splits
|
---|
| 115 | Int_t NsplitCnt = 0;
|
---|
| 116 | //
|
---|
| 117 | while (Nsplits > 0)
|
---|
| 118 | {
|
---|
| 119 | Nsplits = 0;
|
---|
| 120 | // Scan nodes
|
---|
| 121 | for (Int_t ipt = 0; ipt < NpPt - 1; ipt++) // Scan pt bins
|
---|
| 122 | {
|
---|
| 123 | for (Int_t ith = 0; ith < NpTh - 1; ith++) // Scan theta bins
|
---|
| 124 | {
|
---|
| 125 | Float_t dAp = TMath::Abs(fAcc(ipt + 1, ith) - fAcc(ipt, ith));
|
---|
| 126 | Float_t dPt = TMath::Abs(Pta(ipt + 1) - Pta(ipt));
|
---|
| 127 | //
|
---|
| 128 | // Pt split
|
---|
| 129 | if (dPt > dPtMin && dAp > dAmin && Nsplits < MaxSplits) {
|
---|
| 130 | //std::cout << "Pt(" << ipt << ") = " << Pta(ipt) << ", dAp = " << dAp << std::endl;
|
---|
| 131 | NsplitCnt++; // Total splits counter
|
---|
| 132 | Nsplits++; // Increase splits/cycle
|
---|
| 133 | NpPt++; // Increase #pt points
|
---|
| 134 | //std::cout << "New pt split: dAp = " << dAp << ", dPt = " << dPt <<
|
---|
| 135 | // ", Nsplits = " << Nsplits << ", NpPt = " << NpPt << std::endl;
|
---|
| 136 | Float_t newPt = 0.5 * (Pta(ipt + 1) + Pta(ipt));
|
---|
| 137 | VecInsert(ipt, newPt, Pta);
|
---|
| 138 | TVectorF AccPt(NpTh);
|
---|
| 139 | for (Int_t i = 0; i < NpTh; i++)
|
---|
| 140 | {
|
---|
| 141 | Double_t pt = newPt;
|
---|
| 142 | Double_t th = TMath::Pi() * Tha[i] / 180.;
|
---|
| 143 | Double_t pz = pt / TMath::Tan(th);
|
---|
| 144 | TVector3 tp(pt, 0., pz);
|
---|
| 145 | SolTrack* gTrk = new SolTrack(xv, tp, InGeo); // Generated track
|
---|
| 146 | Int_t Mhits = gTrk->nmHit(); // Nr. Measurement hits
|
---|
| 147 | AccPt(i) = (Float_t)Mhits;
|
---|
| 148 | }
|
---|
| 149 | SplitPt(ipt, AccPt);
|
---|
| 150 | // Completed Pt split
|
---|
| 151 | }
|
---|
| 152 | //
|
---|
| 153 | Float_t dAt = TMath::Abs(fAcc(ipt, ith + 1) - fAcc(ipt, ith));
|
---|
| 154 | Float_t dTh = TMath::Abs(Tha(ith + 1) - Tha(ith));
|
---|
| 155 | //
|
---|
| 156 | // Theta split
|
---|
| 157 | if (dTh > dThMin && dAt > dAmin && Nsplits < MaxSplits) {
|
---|
| 158 | //std::cout << "Th(" << ith << ") = " << Tha(ith) << ", dAt = " << dAt << std::endl;
|
---|
| 159 | NsplitCnt++; // Total splits counter
|
---|
| 160 | Nsplits++; // Increase splits
|
---|
| 161 | NpTh++; // Increase #pt points
|
---|
| 162 | //std::cout << "New th split: dAt = " << dAt << ", dTh = " << dTh <<
|
---|
| 163 | // ", Nsplits = " << Nsplits << ", NpTh = " << NpTh << std::endl;
|
---|
| 164 | Float_t newTh = 0.5 * (Tha(ith + 1) + Tha(ith));
|
---|
| 165 | VecInsert(ith, newTh, Tha);
|
---|
| 166 | TVectorF AccTh(NpPt);
|
---|
| 167 | for (Int_t i = 0; i < NpPt; i++)
|
---|
| 168 | {
|
---|
| 169 | Double_t pt = Pta(i);
|
---|
| 170 | Double_t th = TMath::Pi() * newTh / 180.;
|
---|
| 171 | Double_t pz = pt / TMath::Tan(th);
|
---|
| 172 | TVector3 tp(pt, 0., pz);
|
---|
| 173 | SolTrack* gTrk = new SolTrack(xv, tp, InGeo); // Generated track
|
---|
| 174 | Int_t Mhits = gTrk->nmHit(); // Nr. Measurement hits
|
---|
| 175 | AccTh(i) = (Float_t)Mhits;
|
---|
| 176 | }
|
---|
| 177 | SplitTh(ith, AccTh);
|
---|
| 178 | // Theta splits completed
|
---|
| 179 | }
|
---|
| 180 | } // End loop on theta nodes
|
---|
| 181 | } // End loop on pt nodes
|
---|
| 182 | Ncycles++;
|
---|
| 183 | } // End loop on iteration
|
---|
| 184 | //
|
---|
| 185 | std::cout<<"AcceptanceClx:: Acceptance generation completed after "<<Ncycles<<" cycles"
|
---|
| 186 | <<" and a total number of "<<NsplitCnt<< " splits"<<std::endl;
|
---|
| 187 | //
|
---|
| 188 | // Store final variables and parameters
|
---|
| 189 | //
|
---|
| 190 | fNPtNodes = NpPt;
|
---|
| 191 | Int_t PtCk = Pta.GetNrows();
|
---|
| 192 | if (PtCk != NpPt)
|
---|
| 193 | std::cout << "AcceptanceClx:: Error in grid generation NpPt=" << NpPt << ", Pta size= " << PtCk << std::endl;
|
---|
| 194 | fPtArray.ResizeTo(NpPt);
|
---|
| 195 | fPtArray = Pta; // Array of Pt nodes
|
---|
| 196 | //
|
---|
| 197 | fNThNodes = NpTh;
|
---|
| 198 | Int_t ThCk = Tha.GetNrows();
|
---|
| 199 | if (ThCk != NpTh)
|
---|
| 200 | std::cout << "AcceptanceClx:: Error in grid generation NpTh=" << NpTh << ", Tha size= " << ThCk << std::endl;
|
---|
| 201 | fThArray.ResizeTo(NpTh);
|
---|
| 202 | fThArray = Tha; // Array of Theta nodes
|
---|
| 203 | //
|
---|
| 204 | std::cout << "AcceptanceClx:: Acceptance encoding with " << fNPtNodes
|
---|
| 205 | <<" pt nodes and "<< fNThNodes <<" theta nodes"<< std::endl;
|
---|
| 206 | Int_t Nrows = fAcc.GetNrows();
|
---|
| 207 | Int_t Ncols = fAcc.GetNcols();
|
---|
| 208 | //std::cout<<"AcceptanceClx:: fAcc rows: "<<Nrows<<", cols: "<<Ncols<<std::endl;
|
---|
| 209 | //std::cout<<"AcceptanceClx:: Pta size: "<<Pta.GetNrows()<<", Tha size: "<<Tha.GetNrows()<<std::endl;;
|
---|
| 210 | //std::cout<<"AcceptanceClx:: pt nodes"<<std::endl; fPtArray.Print();
|
---|
| 211 | //std::cout<<"AcceptanceClx:: th nodes"<<std::endl; fThArray.Print();
|
---|
| 212 | }
|
---|
| 213 |
|
---|
| 214 | // Destructor
|
---|
| 215 | AcceptanceClx::~AcceptanceClx()
|
---|
| 216 | {
|
---|
| 217 | fNPtNodes = 0;
|
---|
| 218 | fNThNodes = 0;
|
---|
| 219 | fAcc.Clear();
|
---|
| 220 | fPtArray.Clear();
|
---|
| 221 | fThArray.Clear();
|
---|
| 222 | }
|
---|
| 223 | //
|
---|
| 224 | void AcceptanceClx::WriteAcceptance(TFile *fout)
|
---|
| 225 | {
|
---|
| 226 | //
|
---|
| 227 | // Write out data
|
---|
| 228 | TTree* tree = new TTree("treeAcc", "Acceptance tree");
|
---|
| 229 | TMatrixF* pntMatF = &fAcc;
|
---|
| 230 | TVectorF* pntVecP = &fPtArray;
|
---|
| 231 | TVectorF* pntVecT = &fThArray;
|
---|
| 232 | tree->Branch("AcceptanceMatrix", "TMatrixF", &pntMatF, 64000, 0);
|
---|
| 233 | tree->Branch("AcceptancePtVec", "TVectorF", &pntVecP, 64000, 0);
|
---|
| 234 | tree->Branch("AcceptanceThVec", "TVectorF", &pntVecT, 64000, 0);
|
---|
| 235 | tree->Fill();
|
---|
| 236 | fout->Write();
|
---|
| 237 | }
|
---|
| 238 | //
|
---|
| 239 | void AcceptanceClx::WriteAcceptance(TString OutFile)
|
---|
| 240 | {
|
---|
| 241 | //
|
---|
| 242 | // Write out data
|
---|
| 243 | TFile* fout = new TFile(OutFile,"RECREATE");
|
---|
| 244 | WriteAcceptance(fout);
|
---|
| 245 | fout->Close();
|
---|
| 246 | delete fout;
|
---|
| 247 | }
|
---|
| 248 | //
|
---|
| 249 | void AcceptanceClx::ReadAcceptance(TString InFile)
|
---|
| 250 | {
|
---|
| 251 | //
|
---|
| 252 | // Read in data
|
---|
| 253 | TFile* f = new TFile(InFile, "READ");
|
---|
| 254 | //
|
---|
| 255 | // Import TTree
|
---|
| 256 | TTree* T = (TTree*)f->Get("treeAcc");
|
---|
| 257 | //
|
---|
| 258 | // Get matrix
|
---|
| 259 | TMatrixF* pAcc = new TMatrixF();
|
---|
| 260 | T->SetBranchAddress("AcceptanceMatrix", &pAcc);
|
---|
| 261 | T->GetEntry(0);
|
---|
| 262 | //
|
---|
| 263 | fNPtNodes = pAcc->GetNrows();
|
---|
| 264 | fNThNodes = pAcc->GetNcols();
|
---|
| 265 | fAcc.ResizeTo(fNPtNodes, fNThNodes);
|
---|
| 266 | fAcc = *pAcc;
|
---|
| 267 | //
|
---|
| 268 | // Get Pt grid
|
---|
| 269 | TVectorF* pPtArray = new TVectorF();
|
---|
| 270 | T->SetBranchAddress("AcceptancePtVec", &pPtArray);
|
---|
| 271 | T->GetEntry(0);
|
---|
| 272 | fPtArray.ResizeTo(fNPtNodes);
|
---|
| 273 | fPtArray = *pPtArray;
|
---|
| 274 | //
|
---|
| 275 | // Get Theta array
|
---|
| 276 | TVectorF* pThArray = new TVectorF();
|
---|
| 277 | T->SetBranchAddress("AcceptanceThVec", &pThArray);
|
---|
| 278 | T->GetEntry(0);
|
---|
| 279 | fThArray.ResizeTo(fNThNodes);
|
---|
| 280 | fThArray = *pThArray;
|
---|
| 281 | //
|
---|
| 282 | std::cout << "AcceptanceClx::Read complete: Npt= " << fNPtNodes << ", Nth= " << fNThNodes << std::endl;
|
---|
| 283 | //
|
---|
| 284 | f->Close();
|
---|
| 285 | delete f;
|
---|
| 286 | }
|
---|
| 287 | //
|
---|
| 288 | Double_t AcceptanceClx::HitNumber(Double_t pt, Double_t theta)
|
---|
| 289 | {
|
---|
| 290 | //
|
---|
| 291 | // Protect against values out of range
|
---|
| 292 | //std::cout << "AcceptanceClx::HitNumber: just in pt= " << pt << ", theta = " << theta << std::endl;
|
---|
| 293 | //std::cout << "AcceptanceClx::HitNumber: ptArr(0)= " << fPtArray(0) << ", thArr(0) = " << fThArray(0) << std::endl;
|
---|
| 294 | //std::cout << "AcceptanceClx::HitNumber: ptArr(E)= " << fPtArray(fNPtNodes - 1)
|
---|
| 295 | // << ", thArr(E) = " << fThArray(fNThNodes - 1) << std::endl;
|
---|
| 296 | Float_t eps = 1.0e-4;
|
---|
| 297 | Float_t pt0 = (Float_t)pt;
|
---|
| 298 | if (pt0 <= fPtArray(0)) pt0 = fPtArray(0) + eps;
|
---|
| 299 | else if (pt0 >= fPtArray(fNPtNodes-1)) pt0 = fPtArray(fNPtNodes-1) - eps;
|
---|
| 300 | Float_t th0 = (Float_t)theta;
|
---|
| 301 | if (th0 <= fThArray(0)) th0 = fThArray(0) + eps;
|
---|
| 302 | else if (th0 >= fThArray(fNThNodes - 1)) th0 = fThArray(fNThNodes - 1) - eps;
|
---|
| 303 | //
|
---|
| 304 | // Find cell
|
---|
| 305 | Float_t* parray = fPtArray.GetMatrixArray();
|
---|
| 306 | Int_t ip = TMath::BinarySearch(fNPtNodes, parray, pt0);
|
---|
| 307 | Float_t* tarray = fThArray.GetMatrixArray();
|
---|
| 308 | Int_t it = TMath::BinarySearch(fNThNodes, tarray, th0);
|
---|
| 309 | //
|
---|
| 310 | if (ip<0 || ip >fNPtNodes - 2)
|
---|
| 311 | {
|
---|
| 312 | std::cout << "Search error: (ip, pt) = (" << ip << ", " << pt << "), pt0 = " << pt0 << std::endl;
|
---|
| 313 | std::cout << "Search error: pt nodes = " << fNPtNodes
|
---|
| 314 | << " , last value = " << fPtArray(fNPtNodes - 1) << std::endl;
|
---|
| 315 | }
|
---|
| 316 | if (it<0 || ip >fNThNodes - 2)
|
---|
| 317 | {
|
---|
| 318 | std::cout << "Search error: (it, th) = (" << it << ", " << theta << "), th0 = " << th0 << std::endl;
|
---|
| 319 | std::cout << "Search error: th nodes = " << fNThNodes
|
---|
| 320 | << " , last value = " << fThArray(fNThNodes - 1) << std::endl;
|
---|
| 321 | }
|
---|
| 322 | //
|
---|
| 323 | // Bilinear interpolation
|
---|
| 324 | //
|
---|
| 325 | Double_t spt = (pt0 - fPtArray(ip)) / (fPtArray(ip + 1) - fPtArray(ip));
|
---|
| 326 | Double_t sth = (th0 - fThArray(it)) / (fThArray(it + 1) - fThArray(it));
|
---|
| 327 | Double_t A11 = fAcc(ip, it);
|
---|
| 328 | Double_t A12 = fAcc(ip, it+1);
|
---|
| 329 | Double_t A21 = fAcc(ip+1, it);
|
---|
| 330 | Double_t A22 = fAcc(ip+1, it+1);
|
---|
| 331 | Double_t A = A11 * (1 - spt) * (1 - sth) + A12 * (1 - spt) * sth +
|
---|
| 332 | A21 * spt * (1 - sth) + A22 * spt * sth;
|
---|
| 333 | //
|
---|
| 334 | return A;
|
---|
| 335 | }
|
---|
| 336 | //
|
---|
| 337 | Double_t AcceptanceClx::HitNum(Double_t *x, Double_t *p) // Theta in degrees
|
---|
| 338 | {
|
---|
| 339 | Double_t pt = x[0];
|
---|
| 340 | Double_t th = x[1];
|
---|
| 341 | //
|
---|
| 342 | return HitNumber(pt, th);
|
---|
| 343 | }
|
---|
| 344 | //
|
---|