Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
HistMacro_CDCTimeToDistance.C
Go to the documentation of this file.
1 double long_drift_func[3][3];
2 double short_drift_func[3][3];
3 double magnet_correction[2][2];
4 
5 vector<double> cdc_drift_table;
6 
7 // Set values for the region cut
8 float deltaMin = -0.175, deltaMax = 0.175, tMin = 300, tMax = 1200;
9 
10 unsigned int Locate(vector<double>&xx, double x){
11  int n=xx.size();
12  if (x==xx[0]) return 0;
13  else if (x==xx[n-1]) return n-2;
14 
15  int jl=-1;
16  int ju=n;
17  int ascnd=(xx[n-1]>=xx[0]);
18  while(ju-jl>1){
19  int jm=(ju+jl)>>1;
20  if ( (x>=xx[jm])==ascnd)
21  jl=jm;
22  else
23  ju=jm;
24  }
25  return jl;
26 }
27 
28 Double_t TimeToDistance( Double_t *x, Double_t *par){
29  Double_t d=0.0;
30  double delta = x[1]; // yAxis
31  double t = x[0]; // xAxis
32 
33  // Cut out region in fit.
34  if (delta > deltaMax || delta < deltaMin) return 0.0;
35  if (delta < (((deltaMax - deltaMin) / (tMax - tMin))*(t - tMin) + deltaMin)) return 0.0;
36  // Variables to store values for time-to-distance functions for delta=0
37  // and delta!=0
38  double f_0=0.;
39  double f_delta=0.;
40  if (t > 0){
41  if (delta>0){
42  double a1=par[0];
43  double a2=par[1];
44  double a3=par[2];
45  double b1=par[3];
46  double b2=par[4];
47  double b3=par[5];
48  double c1=par[6];
49  double c2=par[7];
50  double c3=par[8];
51  // use "long side" functional form
52  double my_t=0.001*t;
53  double sqrt_t=sqrt(my_t);
54  double t3=my_t*my_t*my_t;
55  double delta_mag=fabs(delta);
56  double a=a1+a2*delta_mag;
57  double b=b1+b2*delta_mag;
58  double c=c1+c2*delta_mag+c3*delta*delta;
59  f_delta=a*sqrt_t+b*my_t+c*t3;
60  f_0=a1*sqrt_t+b1*my_t+c1*t3;
61 
62  }
63  else{
64  double my_t=0.001*t;
65  double sqrt_t=sqrt(my_t);
66  double delta_mag=fabs(delta);
67 
68  // use "short side" functional form
69  double a1=par[9];
70  double a2=par[10];
71  double a3=par[11];
72  double b1=par[12];
73  double b2=par[13];
74  double b3=par[14];
75  double c1=par[15];
76  double c2=par[16];
77  double c3=par[17];
78  double delta_sq=delta*delta;
79  double a=a1+a2*delta_mag+a3*delta_sq;
80  double b=b1+b2*delta_mag+b3*delta_sq;
81  f_delta=a*sqrt_t+b*my_t;
82  f_0=a1*sqrt_t+b1*my_t;
83 
84  }
85 
86  unsigned int max_index=cdc_drift_table.size()-1;
87  if (t>cdc_drift_table[max_index]){
88  d=f_delta;
89  return d;
90  }
91  // Drift time is within range of table -- interpolate...
92  unsigned int index=0;
93  index=Locate(cdc_drift_table,t);
94  double dt=cdc_drift_table[index+1]-cdc_drift_table[index];
95  double frac=(t-cdc_drift_table[index])/dt;
96  double d_0=0.01*(double(index)+frac);
97 
98  double P=0.;
99  double tcut=250.0; // ns
100  if (t<tcut) {
101  P=(tcut-t)/tcut;
102  }
103  d=f_delta*(d_0/f_0*P+1.-P);
104  }
105  return d;
106 }
107 
108 
110  TF2 *f = new TF2("f",TimeToDistance, 10, 1500, -0.3, 0.3, 18);
111 
112  TProfile *constants = (TProfile *) gDirectory->Get("/CDC_TimeToDistance/CDC_TD_Constants");
113  long_drift_func[0][0] = constants->GetBinContent(101);
114  long_drift_func[0][1] = constants->GetBinContent(102);
115  long_drift_func[0][2] = constants->GetBinContent(103);
116  long_drift_func[1][0] = constants->GetBinContent(104);
117  long_drift_func[1][1] = constants->GetBinContent(105);
118  long_drift_func[1][2] = constants->GetBinContent(106);
119  long_drift_func[2][0] = constants->GetBinContent(107);
120  long_drift_func[2][1] = constants->GetBinContent(108);
121  long_drift_func[2][2] = constants->GetBinContent(109);
122  magnet_correction[0][0] = constants->GetBinContent(110);
123  magnet_correction[0][1] = constants->GetBinContent(111);
124  short_drift_func[0][0] = constants->GetBinContent(112);
125  short_drift_func[0][1] = constants->GetBinContent(113);
126  short_drift_func[0][2] = constants->GetBinContent(114);
127  short_drift_func[1][0] = constants->GetBinContent(115);
128  short_drift_func[1][1] = constants->GetBinContent(116);
129  short_drift_func[1][2] = constants->GetBinContent(117);
130  short_drift_func[2][0] = constants->GetBinContent(118);
131  short_drift_func[2][1] = constants->GetBinContent(119);
132  short_drift_func[2][2] = constants->GetBinContent(120);
133  magnet_correction[1][0] = constants->GetBinContent(121);
134  magnet_correction[1][1] = constants->GetBinContent(122);
135 
136  for (unsigned int i=1; i<=78; i++){
137  cdc_drift_table.push_back(constants->GetBinContent(i));
138  }
139 
140  Double_t parameters[18] =
141  {long_drift_func[0][0], long_drift_func[0][1], long_drift_func[0][2],
142  long_drift_func[1][0], long_drift_func[1][1], long_drift_func[1][2],
143  long_drift_func[2][0], long_drift_func[2][1], long_drift_func[2][2],
144  short_drift_func[0][0], short_drift_func[0][1], short_drift_func[0][2],
145  short_drift_func[1][0], short_drift_func[1][1], short_drift_func[1][2],
146  short_drift_func[2][0], short_drift_func[2][1], short_drift_func[2][2]};
147 
148  f->SetParameters(parameters);
149 
150  TCanvas *c = new TCanvas("c_TD","CDC TD", 1200, 550);
151  c->Divide(2,1);
152 
153  c->cd(1);
154 
155  TProfile2D *profile = (TProfile2D *) gDirectory->Get("/CDC_TimeToDistance/Predicted Drift Distance Vs Delta Vs t_drift");
156 
157  gStyle->SetOptStat(0);
158 
159  Double_t contours[21] =
160  { 0.00, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45,
161  0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0};
162 
163  profile->SetContour(21, contours);
164  profile->Draw("colz");
165  profile->GetXaxis()->SetRangeUser(0,1200);
166  profile->GetYaxis()->SetRangeUser(-0.22,0.22);
167  profile->GetYaxis()->SetTitleOffset(1.15);
168  f->SetContour(21, contours);
169  profile->Draw("cont2 list same");
170  f->Draw("cont2 list same");
171 
172  c->cd(2);
173  TH2I *hist = (TH2I *) gDirectory->Get("/CDC_TimeToDistance/Residual Vs. Drift Time");
174  hist->Draw("colz");
175  hist->GetXaxis()->SetRangeUser(0,1200);
176  hist->GetYaxis()->SetTitleOffset(1.40);
177  c->cd(2)->SetGridx();
178  c->cd(2)->SetGridy();
179 
180  c->cd();
181  c->Update();
182 }
unsigned int Locate(vector< double > &xx, double x)
double short_drift_func[3][3]
Double_t x[NCHANNELS]
Definition: st_tw_resols.C:39
#define c
float tMin
static char index(char c)
Definition: base64.cpp:115
Double_t TimeToDistance(Double_t *x, Double_t *par)
Double_t c1[2][NMODULES]
Definition: tw_corr.C:68
TF1 * f
Definition: FitGains.C:21
float deltaMax
Double_t c2[2][NMODULES]
Definition: tw_corr.C:69
double long_drift_func[3][3]
void HistMacro_CDCTimeToDistance()
vector< double > cdc_drift_table
double magnet_correction[2][2]
float deltaMin
double sqrt(double)
float tMax
TCanvas * c3
TH1F * hist[Idx+1]
Definition: readhist.C:10