Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
JEventProcessor_MilleFieldOn.cc
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: JEventProcessor_MilleFieldOn.cc
4 // Created: Tue Jan 17 19:32:32 Local time zone must be set--see zic manual page 2017
5 // Creator: mstaib (on Linux egbert 2.6.32-642.6.2.el6.x86_64 x86_64)
6 //
7 
10 #include "PID/DChargedTrack.h"
12 #include "CDC/DCDCTrackHit.h"
13 #include "CDC/DCDCWire.h"
14 #include "TDirectory.h"
15 using namespace jana;
16 
17 
18 // Routine used to create our JEventProcessor
19 #include <JANA/JApplication.h>
20 #include <JANA/JFactory.h>
21 extern "C"{
22 void InitPlugin(JApplication *app){
23  InitJANAPlugin(app);
24  app->AddProcessor(new JEventProcessor_MilleFieldOn());
25 }
26 } // "C"
27 
28 
29 //------------------
30 // JEventProcessor_MilleFieldOn (Constructor)
31 //------------------
33 {
34 
35 }
36 
37 //------------------
38 // ~JEventProcessor_MilleFieldOn (Destructor)
39 //------------------
41 {
42 
43 }
44 
45 //------------------
46 // init
47 //------------------
49 {
50  // This is called once at program startup.
51  milleWriter = new Mille("fieldon_mille_out.mil");
52 
53  gDirectory->mkdir("AlignmentConstants");
54  gDirectory->cd("AlignmentConstants");
55  // We need the constants used for this iteration
56  // Use a TProfile to avoid problems adding together multiple root files...
57  HistCurrentConstantsCDC = new TProfile("CDCAlignmentConstants", "Constants Used for CDC Alignment (In MILLEPEDE Order)", 20000 ,0.5, 20000.5);
58  HistCurrentConstantsFDC = new TProfile("FDCAlignmentConstants", "Constants Used for FDC Alignment (In MILLEPEDE Order)", 26000 ,0.5, 26000.5);
59 
60  gDirectory->cd("..");
61 
62  return NOERROR;
63 }
64 
65 //------------------
66 // brun
67 //------------------
68 jerror_t JEventProcessor_MilleFieldOn::brun(JEventLoop *eventLoop, int32_t runnumber)
69 {
70  // Get the current set of constants and sve them in the histogram
71  // This is called whenever the run number changes
72  // Check for magnetic field
73  DApplication* dapp=dynamic_cast<DApplication*>(eventLoop->GetJApplication());
74  bool dIsNoFieldFlag = (dynamic_cast<const DMagneticFieldMapNoField*>(dapp->GetBfield(runnumber)) != NULL);
75 
76  // This plugin is designed for field off data. If this is used for field on data, Abort...
77  if (dIsNoFieldFlag){
78  jerr << " ********No Field******** Plugin MilleFieldOn is for use with magnetic field!!! Aborting " << endl;
79  japp->Quit();
80  }
81 
82  // Store the current values of the alignment constants
83  JCalibration * jcalib = eventLoop->GetJCalibration();
84  vector<map<string,double> >vals;
85  if (jcalib->Get("CDC/global_alignment",vals)==false){
86  map<string,double> &row = vals[0];
87  // Get the offsets from the calibration database
88  HistCurrentConstantsCDC->Fill(1,row["dX"]);
89  HistCurrentConstantsCDC->Fill(2,row["dY"]);
90  HistCurrentConstantsCDC->Fill(3,row["dZ"]);
91  HistCurrentConstantsCDC->Fill(4,row["dPhiX"]);
92  HistCurrentConstantsCDC->Fill(5,row["dPhiY"]);
93  HistCurrentConstantsCDC->Fill(6,row["dPhiZ"]);
94  }
95 
96  if (jcalib->Get("CDC/wire_alignment",vals)==false){
97  for(unsigned int i=0; i<vals.size(); i++){
98  map<string,double> &row = vals[i];
99  // Get the offsets from the calibration database
100  HistCurrentConstantsCDC->Fill(1000+(i*4+1),row["dxu"]);
101  HistCurrentConstantsCDC->Fill(1000+(i*4+2),row["dyu"]);
102  HistCurrentConstantsCDC->Fill(1000+(i*4+3),row["dxd"]);
103  HistCurrentConstantsCDC->Fill(1000+(i*4+4),row["dyd"]);
104  }
105  }
106 
107  if (jcalib->Get("CDC/timing_offsets",vals)==false){
108  for(unsigned int i=0; i<vals.size(); i++){
109  map<string,double> &row = vals[i];
110  // Get the offsets from the calibration database
111  HistCurrentConstantsCDC->Fill(16000+(i+1),row["t0"]);
112  }
113  }
114 
115  if (jcalib->Get("FDC/cathode_alignment",vals)==false){
116  for(unsigned int i=0; i<vals.size(); i++){
117  map<string,double> &row = vals[i];
118  // Get the offsets from the calibration database
119  HistCurrentConstantsFDC->Fill((i+1)*1000+101,row["dU"]);
120  HistCurrentConstantsFDC->Fill((i+1)*1000+102,row["dV"]);
121  HistCurrentConstantsFDC->Fill((i+1)*1000+103,row["dPhiU"]);
122  HistCurrentConstantsFDC->Fill((i+1)*1000+104,row["dPhiV"]);
123  }
124  }
125 
126  if (jcalib->Get("FDC/cell_offsets",vals)==false){
127  for(unsigned int i=0; i<vals.size(); i++){
128  map<string,double> &row = vals[i];
129  // Get the offsets from the calibration database
130  HistCurrentConstantsFDC->Fill((i+1)*1000+1,row["xshift"]);
131  HistCurrentConstantsFDC->Fill((i+1)*1000+100,row["yshift"]);
132  }
133  }
134 
135  if (jcalib->Get("FDC/cell_rotations",vals)==false){
136  for(unsigned int i=0; i<vals.size(); i++){
137  map<string,double> &row = vals[i];
138  HistCurrentConstantsFDC->Fill((i+1)*1000+2,row["dPhiX"]);
139  HistCurrentConstantsFDC->Fill((i+1)*1000+3,row["dPhiY"]);
140  HistCurrentConstantsFDC->Fill((i+1)*1000+4,row["dPhiZ"]);
141  }
142  }
143  if (jcalib->Get("FDC/wire_alignment",vals)==false){
144  for(unsigned int i=0; i<vals.size(); i++){
145  map<string,double> &row = vals[i];
146  // Get the offsets from the calibration database
147  HistCurrentConstantsFDC->Fill((i+1)*1000+5,row["dZ"]);
148  }
149  }
150 
151  if (jcalib->Get("FDC/package1/strip_gains_v2",vals)==false){
152  for(unsigned int i=0; i<vals.size(); i++){
153  map<string,double> &row = vals[i];
154  // Get the offsets from the calibration database
155  char name[32];
156  for (unsigned int j=1; j<= 216; j++)
157  {
158  sprintf(name,"strip%i", j);
159  if (i%2){ // V
160  HistCurrentConstantsFDC->Fill((i/2+1)*1000+600+j,row[name]);
161  }
162  else {// U
163  HistCurrentConstantsFDC->Fill((i/2+1)*1000+300+j,row[name]);
164  }
165  }
166  }
167  }
168 
169  if (jcalib->Get("FDC/package2/strip_gains_v2",vals)==false){
170  for(unsigned int i=0; i<vals.size(); i++){
171  map<string,double> &row = vals[i];
172  // Get the offsets from the calibration database
173  char name[32];
174  for (unsigned int j=1; j<= 216; j++)
175  {
176  sprintf(name,"strip%i", j);
177  if (i%2){ // V
178  HistCurrentConstantsFDC->Fill((i/2+7)*1000+600+j,row[name]);
179  }
180  else // U
181  HistCurrentConstantsFDC->Fill((i/2+7)*1000+300+j,row[name]);
182  }
183  }
184  }
185 
186  if (jcalib->Get("FDC/package3/strip_gains_v2",vals)==false){
187  for(unsigned int i=0; i<vals.size(); i++){
188  map<string,double> &row = vals[i];
189  // Get the offsets from the calibration database
190  char name[32];
191  for (unsigned int j=1; j<= 216; j++)
192  {
193  sprintf(name,"strip%i", j);
194  if (i%2){ // V
195  HistCurrentConstantsFDC->Fill((i/2+13)*1000+600+j,row[name]);
196  }
197  else // U
198  HistCurrentConstantsFDC->Fill((i/2+13)*1000+300+j,row[name]);
199  }
200  }
201  }
202 
203  if (jcalib->Get("FDC/package4/strip_gains_v2",vals)==false){
204  for(unsigned int i=0; i<vals.size(); i++){
205  map<string,double> &row = vals[i];
206  // Get the offsets from the calibration database
207  char name[32];
208  for (unsigned int j=1; j<= 216; j++)
209  {
210  sprintf(name,"strip%i", j);
211  if (i%2){ // V
212  HistCurrentConstantsFDC->Fill((i/2+19)*1000+600+j,row[name]);
213  }
214  else // U
215  HistCurrentConstantsFDC->Fill((i/2+19)*1000+300+j,row[name]);
216  }
217  }
218  }
219 
220  if (jcalib->Get("FDC/package1/wire_timing_offsets",vals)==false){
221  for(unsigned int i=0; i<vals.size(); i++){
222  map<string,double> &row = vals[i];
223  // Get the offsets from the calibration database
224  char name[32];
225  for (unsigned int j=1; j<= 96; j++)
226  {
227  sprintf(name,"wire%i", j);
228  HistCurrentConstantsFDC->Fill((i+1)*1000+900+j,row[name]);
229  }
230  }
231  }
232  if (jcalib->Get("FDC/package2/wire_timing_offsets",vals)==false){
233  for(unsigned int i=0; i<vals.size(); i++){
234  map<string,double> &row = vals[i];
235  // Get the offsets from the calibration database
236  char name[32];
237  for (unsigned int j=1; j<= 96; j++)
238  {
239  sprintf(name,"wire%i", j);
240  HistCurrentConstantsFDC->Fill((i+7)*1000+900+j,row[name]);
241  }
242  }
243  }
244  if (jcalib->Get("FDC/package3/wire_timing_offsets",vals)==false){
245  for(unsigned int i=0; i<vals.size(); i++){
246  map<string,double> &row = vals[i];
247  // Get the offsets from the calibration database
248  char name[32];
249  for (unsigned int j=1; j<= 96; j++)
250  {
251  sprintf(name,"wire%i", j);
252  HistCurrentConstantsFDC->Fill((i+13)*1000+900+j,row[name]);
253  }
254  }
255  }
256  if (jcalib->Get("FDC/package4/wire_timing_offsets",vals)==false){
257  for(unsigned int i=0; i<vals.size(); i++){
258  map<string,double> &row = vals[i];
259  // Get the offsets from the calibration database
260  char name[32];
261  for (unsigned int j=1; j<= 96; j++)
262  {
263  sprintf(name,"wire%i", j);
264  HistCurrentConstantsFDC->Fill((i+19)*1000+900+j,row[name]);
265  }
266  }
267  }
268 
269 
270  if (jcalib->Get("FDC/strip_pitches_v2",vals)==false){
271  for(unsigned int i=0; i<vals.size(); i++){
272  map<string,double> &row = vals[i];
273  HistCurrentConstantsFDC->Fill((i+1)*1000 + 200, row["U_SP_1"]);
274  HistCurrentConstantsFDC->Fill((i+1)*1000 + 201, row["U_G_1"]);
275  HistCurrentConstantsFDC->Fill((i+1)*1000 + 202, row["U_SP_2"]);
276  HistCurrentConstantsFDC->Fill((i+1)*1000 + 203, row["U_G_2"]);
277  HistCurrentConstantsFDC->Fill((i+1)*1000 + 204, row["U_SP_3"]);
278  HistCurrentConstantsFDC->Fill((i+1)*1000 + 205, row["V_SP_1"]);
279  HistCurrentConstantsFDC->Fill((i+1)*1000 + 206, row["V_G_1"]);
280  HistCurrentConstantsFDC->Fill((i+1)*1000 + 207, row["V_SP_2"]);
281  HistCurrentConstantsFDC->Fill((i+1)*1000 + 208, row["V_G_2"]);
282  HistCurrentConstantsFDC->Fill((i+1)*1000 + 209, row["V_SP_3"]);
283  }
284  }
285 
286  return NOERROR;
287 }
288 
289 //------------------
290 // evnt
291 //------------------
292 jerror_t JEventProcessor_MilleFieldOn::evnt(JEventLoop *loop, uint64_t eventnumber)
293 {
294  int straw_offset[29] = {0,0,42,84,138,192,258,324,404,484,577,670,776,882,1005,1128,1263,1398,1544,1690,1848,2006,2176,2346,2528,2710,2907,3104,3313};
295  // Loop over the tracks, get the tracking pulls, and fill some histograms. Easy peasy
296  vector<const DChargedTrack *> trackVector;
297  loop->Get(trackVector);
298 
299  for (size_t i = 0; i < trackVector.size(); i++){
300  // TODO: Should be changed to use PID FOM when ready
301  const DChargedTrackHypothesis *bestHypothesis = trackVector[i]->Get_BestTrackingFOM();
302 
303  if (bestHypothesis == NULL) continue;
304 
305  auto thisTimeBasedTrack = bestHypothesis->Get_TrackTimeBased();
306  double trackingFOM = TMath::Prob(thisTimeBasedTrack->chisq, thisTimeBasedTrack->Ndof);
307 
308  // Some quality cuts for the tracks we will use
309  // Keep this minimal for now and investigate later
310  float trackingFOMCut = 0.001;
311  if(trackingFOM < trackingFOMCut) continue;
312 
313  // Get the pulls vector from the track
314  if (!thisTimeBasedTrack->IsSmoothed) continue;
315 
316  vector<DTrackFitter::pull_t> pulls = thisTimeBasedTrack->pulls;
317  // Determine TrackType and check for nan
318  bool isCDCOnly=true; //bool isFDCOnly=true;
319  bool anyNaN=false;
320  int nCDC=0, nFDC=0;
321  int pullsNDF=0;
322  for (size_t iPull = 0; iPull < pulls.size(); iPull++){
323  const DCDCTrackHit *cdc_hit = pulls[iPull].cdc_hit;
324  //const DFDCPseudo *fdc_hit = pulls[iPull].fdc_hit;
325  float err = pulls[iPull].err;
326  float errc = pulls[iPull].errc;
327  if (cdc_hit == NULL) {pullsNDF+=2;nFDC++;isCDCOnly=false;}
328  else {pullsNDF++;nCDC++;}
329  if ( err != err || errc != errc) anyNaN=true;
330  //if (fdc_hit == NULL) isFDCOnly=false;
331  }
332  pullsNDF-=5;
333  if (anyNaN) continue;
334  if(pullsNDF != thisTimeBasedTrack->Ndof) continue;
335 
336  int trackingNDFCut = 22;
337  if (isCDCOnly) trackingNDFCut = 10;
338 
339  if( thisTimeBasedTrack->Ndof < trackingNDFCut) continue;
340  /*
341  double phi = bestHypothesis->momentum().Phi()*TMath::RadToDeg();
342  double theta = bestHypothesis->momentum().Theta()*TMath::RadToDeg();
343  double pmag = bestHypothesis->momentum().Mag();
344 
345  if (pmag < 0.5) continue;
346  */
347 
348  japp->RootWriteLock(); // Just use the root lock as a temporary
349  for (size_t iPull = 0; iPull < pulls.size(); iPull++){
350  // Here is all of the information currently stored in the pulls from the fit
351  // From TRACKING/DTrackFitter.h
352  float resi = pulls[iPull].resi; // residual of measurement
353  float err = pulls[iPull].err; // estimated error of measurement
354  //double s = pulls[iPull].s;
355  //double tdrift = pulls[iPull].tdrift; // drift time of this measurement
356  //double d = pulls[iPull].d; // doca to wire
357  const DCDCTrackHit *cdc_hit = pulls[iPull].cdc_hit;
358  const DFDCPseudo *fdc_hit = pulls[iPull].fdc_hit;
359  //double docaphi = pulls[iPull].docaphi; // phi of doca in CDC straws
360  //double z = pulls[iPull].z;// z position at doca
361  //double tcorr = pulls[iPull].tcorr; // drift time with correction for B
362  float resic = pulls[iPull].resic; // residual for FDC cathode measuremtns
363  float errc = pulls[iPull].errc;
364 
365  vector<double> trackDerivatives = pulls[iPull].trackDerivatives;
366  if (trackDerivatives.size()==0) continue;
367 
368  if (fdc_hit != NULL && fdc_hit->status == 6) {
369  // Add fdc hit
370  DFDCPseudo *thisHit = const_cast<DFDCPseudo *>(fdc_hit);
371 
372  vector<double> pseudoAlignmentDerivatives = thisHit->GetFDCPseudoAlignmentDerivatives();
373  vector<double> fdcStripGainDerivatives = thisHit->GetFDCStripGainDerivatives();
374  vector<double> fdcStripPitchDerivatives = thisHit->GetFDCStripPitchDerivatives();
375 
376  unsigned int layerOffset = 100000 + thisHit->wire->layer * 1000;
377 
378  //Now we need to fill the Mille structure once for our wire measurment and once for our cathode measurement
379  const int NLC = 4; // Number of local parameters
380  const int NGL_W = 6; // Number of global parameters for wire alignment
381  float localDerW[NLC];
382  float globalDerW[NGL_W];
383  int labelW[NGL_W];
384 
385  localDerW[0]=trackDerivatives[FDCTrackD::dDOCAW_dx]; localDerW[1]=trackDerivatives[FDCTrackD::dDOCAW_dy];
386  localDerW[2]=trackDerivatives[FDCTrackD::dDOCAW_dtx]; localDerW[3]=trackDerivatives[FDCTrackD::dDOCAW_dty];
387 
388  globalDerW[0] = trackDerivatives[FDCTrackD::dDOCAW_dDeltaX]; labelW[0] = layerOffset + 1;
389  globalDerW[1] = trackDerivatives[FDCTrackD::dDOCAW_dDeltaPhiX]; labelW[1] = layerOffset + 2;
390  globalDerW[2] = trackDerivatives[FDCTrackD::dDOCAW_dDeltaPhiY]; labelW[2] = layerOffset + 3;
391  globalDerW[3] = trackDerivatives[FDCTrackD::dDOCAW_dDeltaPhiZ]; labelW[3] = layerOffset + 4;
392  globalDerW[4] = trackDerivatives[FDCTrackD::dDOCAW_dDeltaZ]; labelW[4] = layerOffset + 5;
393  globalDerW[5] = -trackDerivatives[FDCTrackD::dW_dt0]; labelW[5] = layerOffset + 900 + fdc_hit->wire->wire;
394 
395  milleWriter->mille(NLC, localDerW, NGL_W, globalDerW, labelW, resi, err);
396 
397  // Now for the cathode measurement, there are more alignment parameters.
398  const int NGL_C = 26; // Number of global parameters for wire alignment
399  float localDerC[NLC];
400  float globalDerC[NGL_C];
401  int labelC[NGL_C];
402 
403  localDerC[0]=trackDerivatives[FDCTrackD::dDOCAC_dx]; localDerC[1]=trackDerivatives[FDCTrackD::dDOCAC_dy];
404  localDerC[2]=trackDerivatives[FDCTrackD::dDOCAC_dtx]; localDerC[3]=trackDerivatives[FDCTrackD::dDOCAC_dty];
405 
406  globalDerC[0] = -1.0; labelC[0] = layerOffset + 100;
407  globalDerC[1] = trackDerivatives[FDCTrackD::dDOCAC_dDeltaX]; labelC[1] = layerOffset + 1;
408  globalDerC[2] = trackDerivatives[FDCTrackD::dDOCAC_dDeltaPhiX]; labelC[2] = layerOffset + 2;
409  globalDerC[3] = trackDerivatives[FDCTrackD::dDOCAC_dDeltaPhiY]; labelC[3] = layerOffset + 3;
410  globalDerC[4] = trackDerivatives[FDCTrackD::dDOCAC_dDeltaPhiZ]; labelC[4] = layerOffset + 4;
411  globalDerC[5] = trackDerivatives[FDCTrackD::dDOCAC_dDeltaZ]; labelC[5] = layerOffset + 5;
412 
413  // Cathode U and V offsets
414  globalDerC[6] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaU]; labelC[6] = layerOffset + 101;
415  globalDerC[7] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaV]; labelC[7] = layerOffset + 102;
416  globalDerC[8] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaPhiU]; labelC[8] = layerOffset + 103;
417  globalDerC[9] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaPhiV]; labelC[9] = layerOffset + 104;
418 
419  // Strip Pitch Calibration
420  globalDerC[10] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaU]*fdcStripPitchDerivatives[0]; labelC[10] = layerOffset + 200;
421  globalDerC[11] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaU]*fdcStripPitchDerivatives[1]; labelC[11] = layerOffset + 201;
422  globalDerC[12] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaU]*fdcStripPitchDerivatives[2]; labelC[12] = layerOffset + 202;
423  globalDerC[13] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaU]*fdcStripPitchDerivatives[3]; labelC[13] = layerOffset + 203;
424  globalDerC[14] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaU]*fdcStripPitchDerivatives[4]; labelC[14] = layerOffset + 204;
425  globalDerC[15] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaV]*fdcStripPitchDerivatives[5]; labelC[15] = layerOffset + 205;
426  globalDerC[16] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaV]*fdcStripPitchDerivatives[6]; labelC[16] = layerOffset + 206;
427  globalDerC[17] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaV]*fdcStripPitchDerivatives[7]; labelC[17] = layerOffset + 207;
428  globalDerC[18] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaV]*fdcStripPitchDerivatives[8]; labelC[18] = layerOffset + 208;
429  globalDerC[19] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaV]*fdcStripPitchDerivatives[9]; labelC[19] = layerOffset + 209;
430 
431  // Strip Gain Calibration
432  vector<const DFDCCathodeCluster *> cathodeClusters;
433  thisHit->Get(cathodeClusters);
434  unsigned int gainLabels[6]={};
435  for(unsigned int j = 0; j< cathodeClusters.size(); j++){
436  if(cathodeClusters[j]->plane == 3) { // U strips
437  unsigned int k=0;
438  for (; k < cathodeClusters[j]->members.size(); k++){
439  if (thisHit->cluster_u.index(0) == cathodeClusters[j]->members[k]->element) break;
440  }
441  gainLabels[0] = cathodeClusters[j]->members[k]->type != 3 ? thisHit->cluster_u.index(0) : thisHit->cluster_u.index(0)+108;
442  gainLabels[1] = cathodeClusters[j]->members[k+1]->type != 3 ? thisHit->cluster_u.index(1) : thisHit->cluster_u.index(1)+108;
443  gainLabels[2] = cathodeClusters[j]->members[k+2]->type != 3 ? thisHit->cluster_u.index(2) : thisHit->cluster_u.index(2)+108;
444  }
445  else if (cathodeClusters[j]->plane == 1) { // V strips
446  unsigned int k=0;
447  for (; k < cathodeClusters[j]->members.size(); k++){
448  if (thisHit->cluster_v.index(0) == cathodeClusters[j]->members[k]->element) break;
449  }
450  gainLabels[3] = cathodeClusters[j]->members[k]->type != 3 ? thisHit->cluster_v.index(0) : thisHit->cluster_v.index(0)+108;
451  gainLabels[4] = cathodeClusters[j]->members[k+1]->type != 3 ? thisHit->cluster_v.index(1) : thisHit->cluster_v.index(1)+108;
452  gainLabels[5] = cathodeClusters[j]->members[k+2]->type != 3 ? thisHit->cluster_v.index(2) : thisHit->cluster_v.index(2)+108;
453  }
454  }
455 
456  globalDerC[20] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaU]*fdcStripGainDerivatives[0]; labelC[20] = layerOffset + 300 + gainLabels[0];
457  globalDerC[21] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaU]*fdcStripGainDerivatives[1]; labelC[21] = layerOffset + 300 + gainLabels[1];
458  globalDerC[22] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaU]*fdcStripGainDerivatives[2]; labelC[22] = layerOffset + 300 + gainLabels[2];
459  globalDerC[23] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaV]*fdcStripGainDerivatives[3]; labelC[23] = layerOffset + 600 + gainLabels[3];
460  globalDerC[24] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaV]*fdcStripGainDerivatives[4]; labelC[24] = layerOffset + 600 + gainLabels[4];
461  globalDerC[25] = -pseudoAlignmentDerivatives[FDCPseudoD::dSddeltaV]*fdcStripGainDerivatives[5]; labelC[25] = layerOffset + 600 + gainLabels[5];
462 
463  milleWriter->mille(NLC, localDerC, NGL_C, globalDerC, labelC, resic, errc);
464  }
465 
466  if (cdc_hit != NULL){
467 
468  const DCDCWire *constWire = cdc_hit->wire;
469  DCDCWire *thisWire = const_cast<DCDCWire *>(constWire);
470 
471  vector<double> wireDerivatives = thisWire->GetCDCWireDerivatives();
472 
473  //Now we need to fill the Mille structure once for our wire measurment and once for our cathode measurement
474  const int NLC = 5; // Number of local parameters
475  const int NGL = 11; // Number of global parameters for wire alignment
476  float localDer[NLC];
477  float globalDer[NGL];
478  int label[NGL];
479 
480  localDer[0]=trackDerivatives[CDCTrackD::dDOCAdS0]; localDer[1]=trackDerivatives[CDCTrackD::dDOCAdS1];
481  localDer[2]=trackDerivatives[CDCTrackD::dDOCAdS2]; localDer[3]=trackDerivatives[CDCTrackD::dDOCAdS3];
482  localDer[4]=trackDerivatives[CDCTrackD::dDOCAdS4];
483 
484  if (isCDCOnly){ // Global shifts will not affect residuals
485  globalDer[0]=0.0; label[0]=1;
486  globalDer[1]=0.0; label[0]=2;
487  globalDer[2]=0.0; label[0]=3;
488  globalDer[3]=0.0; label[0]=4;
489  globalDer[4]=0.0; label[0]=5;
490  globalDer[5]=0.0; label[0]=6;
491  }
492  else{
493  globalDer[0]=trackDerivatives[CDCTrackD::dDOCAdOriginX]*wireDerivatives[CDCWireD::dOriginXddeltaX]
494  +trackDerivatives[CDCTrackD::dDOCAdOriginY]*wireDerivatives[CDCWireD::dOriginYddeltaX]
495  +trackDerivatives[CDCTrackD::dDOCAdOriginZ]*wireDerivatives[CDCWireD::dOriginZddeltaX]
496  +trackDerivatives[CDCTrackD::dDOCAdDirX]*wireDerivatives[CDCWireD::dDirXddeltaX]
497  +trackDerivatives[CDCTrackD::dDOCAdDirY]*wireDerivatives[CDCWireD::dDirYddeltaX]
498  +trackDerivatives[CDCTrackD::dDOCAdDirZ]*wireDerivatives[CDCWireD::dDirZddeltaX];
499  label[0]=1;
500 
501  globalDer[1]=trackDerivatives[CDCTrackD::dDOCAdOriginX]*wireDerivatives[CDCWireD::dOriginXddeltaY]
502  +trackDerivatives[CDCTrackD::dDOCAdOriginY]*wireDerivatives[CDCWireD::dOriginYddeltaY]
503  +trackDerivatives[CDCTrackD::dDOCAdOriginZ]*wireDerivatives[CDCWireD::dOriginZddeltaY]
504  +trackDerivatives[CDCTrackD::dDOCAdDirX]*wireDerivatives[CDCWireD::dDirXddeltaY]
505  +trackDerivatives[CDCTrackD::dDOCAdDirY]*wireDerivatives[CDCWireD::dDirYddeltaY]
506  +trackDerivatives[CDCTrackD::dDOCAdDirZ]*wireDerivatives[CDCWireD::dDirZddeltaY];
507  label[1]=2;
508 
509  globalDer[2]=trackDerivatives[CDCTrackD::dDOCAdOriginX]*wireDerivatives[CDCWireD::dOriginXddeltaZ]
510  +trackDerivatives[CDCTrackD::dDOCAdOriginY]*wireDerivatives[CDCWireD::dOriginYddeltaZ]
511  +trackDerivatives[CDCTrackD::dDOCAdOriginZ]*wireDerivatives[CDCWireD::dOriginZddeltaZ]
512  +trackDerivatives[CDCTrackD::dDOCAdDirX]*wireDerivatives[CDCWireD::dDirXddeltaZ]
513  +trackDerivatives[CDCTrackD::dDOCAdDirY]*wireDerivatives[CDCWireD::dDirYddeltaZ]
514  +trackDerivatives[CDCTrackD::dDOCAdDirZ]*wireDerivatives[CDCWireD::dDirZddeltaZ];
515  label[2]=3;
516 
517  globalDer[3]=trackDerivatives[CDCTrackD::dDOCAdOriginX]*wireDerivatives[CDCWireD::dOriginXddeltaPhiX]
518  +trackDerivatives[CDCTrackD::dDOCAdOriginY]*wireDerivatives[CDCWireD::dOriginYddeltaPhiX]
519  +trackDerivatives[CDCTrackD::dDOCAdOriginZ]*wireDerivatives[CDCWireD::dOriginZddeltaPhiX]
520  +trackDerivatives[CDCTrackD::dDOCAdDirX]*wireDerivatives[CDCWireD::dDirXddeltaPhiX]
521  +trackDerivatives[CDCTrackD::dDOCAdDirY]*wireDerivatives[CDCWireD::dDirYddeltaPhiX]
522  +trackDerivatives[CDCTrackD::dDOCAdDirZ]*wireDerivatives[CDCWireD::dDirZddeltaPhiX];
523  label[3]=4;
524 
525  globalDer[4]=trackDerivatives[CDCTrackD::dDOCAdOriginX]*wireDerivatives[CDCWireD::dOriginXddeltaPhiY]
526  +trackDerivatives[CDCTrackD::dDOCAdOriginY]*wireDerivatives[CDCWireD::dOriginYddeltaPhiY]
527  +trackDerivatives[CDCTrackD::dDOCAdOriginZ]*wireDerivatives[CDCWireD::dOriginZddeltaPhiY]
528  +trackDerivatives[CDCTrackD::dDOCAdDirX]*wireDerivatives[CDCWireD::dDirXddeltaPhiY]
529  +trackDerivatives[CDCTrackD::dDOCAdDirY]*wireDerivatives[CDCWireD::dDirYddeltaPhiY]
530  +trackDerivatives[CDCTrackD::dDOCAdDirZ]*wireDerivatives[CDCWireD::dDirZddeltaPhiY];
531  label[4]=5;
532 
533  globalDer[5]=trackDerivatives[CDCTrackD::dDOCAdOriginX]*wireDerivatives[CDCWireD::dOriginXddeltaPhiZ]
534  +trackDerivatives[CDCTrackD::dDOCAdOriginY]*wireDerivatives[CDCWireD::dOriginYddeltaPhiZ]
535  +trackDerivatives[CDCTrackD::dDOCAdOriginZ]*wireDerivatives[CDCWireD::dOriginZddeltaPhiZ]
536  +trackDerivatives[CDCTrackD::dDOCAdDirX]*wireDerivatives[CDCWireD::dDirXddeltaPhiZ]
537  +trackDerivatives[CDCTrackD::dDOCAdDirY]*wireDerivatives[CDCWireD::dDirYddeltaPhiZ]
538  +trackDerivatives[CDCTrackD::dDOCAdDirZ]*wireDerivatives[CDCWireD::dDirZddeltaPhiZ];
539  label[5]=6;
540  }
541  globalDer[6]=trackDerivatives[CDCTrackD::dDOCAdOriginX]*wireDerivatives[CDCWireD::dOriginXddeltaXu]
542  +trackDerivatives[CDCTrackD::dDOCAdOriginY]*wireDerivatives[CDCWireD::dOriginYddeltaXu]
543  +trackDerivatives[CDCTrackD::dDOCAdOriginZ]*wireDerivatives[CDCWireD::dOriginZddeltaXu]
544  +trackDerivatives[CDCTrackD::dDOCAdDirX]*wireDerivatives[CDCWireD::dDirXddeltaXu]
545  +trackDerivatives[CDCTrackD::dDOCAdDirY]*wireDerivatives[CDCWireD::dDirYddeltaXu]
546  +trackDerivatives[CDCTrackD::dDOCAdDirZ]*wireDerivatives[CDCWireD::dDirZddeltaXu];
547  label[6]=1000 + (straw_offset[thisWire->ring]+(thisWire->straw-1))*4 + 1;
548 
549  if (false){
550  jout << " Dumping deltaXu derivatives============ Wire " << thisWire->ring << " Straw " << thisWire->straw << endl;
551  jout << " Total = " << globalDer[6] << endl;
552  jout << "trackDerivatives[CDCTrackD::dDOCAdOriginX] " << trackDerivatives[CDCTrackD::dDOCAdOriginX] << " wireDerivatives[CDCWireD::dOriginXddeltaXu]" << wireDerivatives[CDCWireD::dOriginXddeltaXu] << endl;
553  jout << "trackDerivatives[CDCTrackD::dDOCAdOriginY] " << trackDerivatives[CDCTrackD::dDOCAdOriginY] << " wireDerivatives[CDCWireD::dOriginYddeltaXu]" << wireDerivatives[CDCWireD::dOriginYddeltaXu] << endl;
554  jout << "trackDerivatives[CDCTrackD::dDOCAdOriginZ] " << trackDerivatives[CDCTrackD::dDOCAdOriginZ] << " wireDerivatives[CDCWireD::dOriginZddeltaXu]" << wireDerivatives[CDCWireD::dOriginZddeltaXu] << endl;
555  jout << "trackDerivatives[CDCTrackD::dDOCAdDirX] " << trackDerivatives[CDCTrackD::dDOCAdDirX] << " wireDerivatives[CDCWireD::dDirXddeltaXu]" << wireDerivatives[CDCWireD::dDirXddeltaXu] << endl;
556  jout << "trackDerivatives[CDCTrackD::dDOCAdDirY] " << trackDerivatives[CDCTrackD::dDOCAdDirY] << " wireDerivatives[CDCWireD::dDirYddeltaXu]" << wireDerivatives[CDCWireD::dDirYddeltaXu] << endl;
557  jout << "trackDerivatives[CDCTrackD::dDOCAdDirZ] " << trackDerivatives[CDCTrackD::dDOCAdDirZ] << " wireDerivatives[CDCWireD::dDirZddeltaXu]" << wireDerivatives[CDCWireD::dDirZddeltaXu] << endl;
558  }
559 
560  globalDer[7]=trackDerivatives[CDCTrackD::dDOCAdOriginX]*wireDerivatives[CDCWireD::dOriginXddeltaYu]
561  +trackDerivatives[CDCTrackD::dDOCAdOriginY]*wireDerivatives[CDCWireD::dOriginYddeltaYu]
562  +trackDerivatives[CDCTrackD::dDOCAdOriginZ]*wireDerivatives[CDCWireD::dOriginZddeltaYu]
563  +trackDerivatives[CDCTrackD::dDOCAdDirX]*wireDerivatives[CDCWireD::dDirXddeltaYu]
564  +trackDerivatives[CDCTrackD::dDOCAdDirY]*wireDerivatives[CDCWireD::dDirYddeltaYu]
565  +trackDerivatives[CDCTrackD::dDOCAdDirZ]*wireDerivatives[CDCWireD::dDirZddeltaYu];
566  label[7]=1000 + (straw_offset[thisWire->ring]+(thisWire->straw-1))*4 + 2;
567 
568  globalDer[8]=trackDerivatives[CDCTrackD::dDOCAdOriginX]*wireDerivatives[CDCWireD::dOriginXddeltaXd]
569  +trackDerivatives[CDCTrackD::dDOCAdOriginY]*wireDerivatives[CDCWireD::dOriginYddeltaXd]
570  +trackDerivatives[CDCTrackD::dDOCAdOriginZ]*wireDerivatives[CDCWireD::dOriginZddeltaXd]
571  +trackDerivatives[CDCTrackD::dDOCAdDirX]*wireDerivatives[CDCWireD::dDirXddeltaXd]
572  +trackDerivatives[CDCTrackD::dDOCAdDirY]*wireDerivatives[CDCWireD::dDirYddeltaXd]
573  +trackDerivatives[CDCTrackD::dDOCAdDirZ]*wireDerivatives[CDCWireD::dDirZddeltaXd];
574  label[8]=1000 + (straw_offset[thisWire->ring]+(thisWire->straw-1))*4 + 3;
575 
576  globalDer[9]=trackDerivatives[CDCTrackD::dDOCAdOriginX]*wireDerivatives[CDCWireD::dOriginXddeltaYd]
577  +trackDerivatives[CDCTrackD::dDOCAdOriginY]*wireDerivatives[CDCWireD::dOriginYddeltaYd]
578  +trackDerivatives[CDCTrackD::dDOCAdOriginZ]*wireDerivatives[CDCWireD::dOriginZddeltaYd]
579  +trackDerivatives[CDCTrackD::dDOCAdDirX]*wireDerivatives[CDCWireD::dDirXddeltaYd]
580  +trackDerivatives[CDCTrackD::dDOCAdDirY]*wireDerivatives[CDCWireD::dDirYddeltaYd]
581  +trackDerivatives[CDCTrackD::dDOCAdDirZ]*wireDerivatives[CDCWireD::dDirZddeltaYd];
582  label[9]=1000 + (straw_offset[thisWire->ring]+(thisWire->straw-1))*4 + 4;
583 
584  globalDer[10]=-trackDerivatives[CDCTrackD::dDdt0];
585  label[10]=16000+straw_offset[thisWire->ring]+thisWire->straw;
586 
587  milleWriter->mille(NLC, localDer, NGL, globalDer, label, resi, err);
588  }
589 
590  }
591  milleWriter->end();
592 
593  japp->RootUnLock();
594 
595  }// End loop over tracks
596 
597  return NOERROR;
598 }
599 
600 //------------------
601 // erun
602 //------------------
604 {
605  // This is called whenever the run number changes, before it is
606  // changed to give you a chance to clean up before processing
607  // events from the next run number.
608  return NOERROR;
609 }
610 
611 //------------------
612 // fini
613 //------------------
615 {
616  // Called before program exit after event processing is finished.
617  delete milleWriter;
618  return NOERROR;
619 }
620 
DApplication * dapp
const DCDCWire * wire
Definition: DCDCTrackHit.h:37
int status
status word for pseudopoint
Definition: DFDCPseudo.h:94
vector< double > GetCDCWireDerivatives()
Definition: DCDCWire.h:100
sprintf(text,"Post KinFit Cut")
DMagneticFieldMap * GetBfield(unsigned int run_number=1)
const DTrackTimeBased * Get_TrackTimeBased(void) const
const DFDCWire * wire
DFDCWire for this wire.
Definition: DFDCPseudo.h:92
DMatrix3x1 index
Definition: DFDCPseudo.h:30
class DFDCPseudo: definition for a reconstructed point in the FDC
Definition: DFDCPseudo.h:74
jerror_t brun(jana::JEventLoop *eventLoop, int32_t runnumber)
Called everytime a new run number is detected.
vector< double > GetFDCPseudoAlignmentDerivatives()
Definition: DFDCPseudo.h:125
JApplication * japp
int layer
1-24
Definition: DFDCWire.h:16
centroid_t cluster_v
Cathode cluster centroids, Useful for gain/strip pitch calibration.
Definition: DFDCPseudo.h:88
InitPlugin_t InitPlugin
vector< double > GetFDCStripGainDerivatives()
Definition: DFDCPseudo.h:160
int straw
Definition: DCDCWire.h:81
Class to write C binary file.
void cdc_hit(Int_t &, Int_t &, Int_t &, Int_t[], Int_t, Int_t, Int_t, Int_t, Int_t, Int_t)
Definition: fa125fns.h:55
const vector< double > GetFDCStripPitchDerivatives()
Definition: DFDCPseudo.h:207
centroid_t cluster_u
Definition: DFDCPseudo.h:88
int wire
1-N
Definition: DFDCWire.h:17
int ring
Definition: DCDCWire.h:80
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
jerror_t evnt(jana::JEventLoop *eventLoop, uint64_t eventnumber)
Called every event.
jerror_t init(void)
Called once at program start.
jerror_t fini(void)
Called after last event of last event source has been processed.