AlignChamZNoBF Class Reference

#include <AlignChamZNoBF.h>

Inheritance diagram for AlignChamZNoBF:

JobCModule CfgObserver List of all members.

Public Types

typedef AlignChamZNoBF::track__ TrkInfo_t

Public Member Functions

 AlignChamZNoBF (const char *version)
 ~AlignChamZNoBF ()
JobCResult Ana (const EDMEventHandle &evt)
void NewRun (int run, int subrun)
void EndRun (int run, int subrun)
void Update (const CfgConfig &c)
double ComputeF ()

Private Member Functions

double Fit (TrkInfo_t &ti, double resid[6][4], float *dydz=0, float x[6][4]=0, float y[6][4]=0)
void MakeTree (const char *name)
double ComputeChi2F ()
double ComputeCorrF ()

Private Attributes

std::vector< TrkInfo_tfTrackList
int fDebug
std::string fSegFolder
int fMinNClust
std::vector< int > fFixCham
int fUseCorr

Classes

struct  track__

Detailed Description

Author:
Andre Lebedev This module can be used to fit for DC1-PWC6 misalignment in z and rotation in xy-plane using field-off data. Track information is saved until the end of the run, and then TMinuit is used to minimize either the sum of chi squared or the sum of square of correlation coefficients between residuals and dx/dz. The former method is more general and will pick up rotations much better than the latter.

Definition at line 26 of file AlignChamZNoBF.h.


Member Typedef Documentation

typedef struct AlignChamZNoBF::track__ AlignChamZNoBF::TrkInfo_t


Constructor & Destructor Documentation

AlignChamZNoBF::AlignChamZNoBF ( const char *  version  ) 

Definition at line 28 of file AlignChamZNoBF.cxx.

References JobCModule::CheckInit(), and JobCModule::SetCfgVersion().

00028                                                   :
00029   JobCModule("AlignChamZNoBF")
00030 {
00031   // Register module to be updated with a given config version
00032   SetCfgVersion(version);
00033   // Make sure that configuration has been loaded
00034   CheckInit();
00035 }

AlignChamZNoBF::~AlignChamZNoBF (  ) 

Definition at line 39 of file AlignChamZNoBF.cxx.

00040 {
00041 }


Member Function Documentation

JobCResult AlignChamZNoBF::Ana ( const EDMEventHandle evt  )  [virtual]

Reimplemented from JobCModule.

Definition at line 45 of file AlignChamZNoBF.cxx.

References EDMEventHandle::Cal(), fDebug, Fit(), fMinNClust, fSegFolder, fTrackList, EDMDataBucket::Get(), kDC1, JobCModule::kFailed, kNCham, kNPlane, JobCModule::kPassed, p, GChamGeo::Pitch(), EDMEventHandle::Raw(), and EDMEventHandle::Reco().

00046 {
00047   evt.Raw();
00048   evt.Cal();
00049   std::vector<const TrackSeg*> seg(0);
00050   try {
00051     evt.Reco().Get(fSegFolder.c_str(), seg); 
00052     if (seg.empty()) return kFailed;
00053     if (fDebug) cout << "Got " << seg.size() << " tracks" << endl;
00054   }
00055   catch (...) { return kFailed; }
00056 
00057   TrkInfo_t ti;
00058   double resid[6][4];
00059 
00060   for (unsigned int i = 0; i < seg.size(); ++i) {
00061     const TrackSeg* trk = seg[i];
00062 
00063     if (trk->NClust() < fMinNClust) continue;
00064 
00065     int nGoodClu = 0;
00066 
00067     memset(&ti, 0, sizeof(ti));
00068 
00069     for (int c = kDC1; c < kNCham; ++c) {
00070       for (int p = 0; p < kNPlane; ++p) {
00071     const WireClust* wc = trk->Clust(c, p);
00072     if (!wc || wc->NWire() > 1) continue;
00073     nGoodClu++;
00074     ti.fWire[c - kDC1][p] = wc->AvgWire();
00075     ti.fWeight[c - kDC1][p] = 1.0 / (wc->USig() * wc->USig());
00076       }
00077     }
00078 
00079     if (nGoodClu < fMinNClust) continue;
00080 
00081     // Make sure that track residuals are reasonable
00082     Fit(ti, resid);
00083     for (int c = 0; c < 6 && nGoodClu > 0; ++c) {
00084       for (int p = 0; p < kNPlane; ++p) {
00085     if (ti.fWeight[c][p] > 1 && 
00086         fabs(resid[c][p]) > 1.5 * GChamGeo::Pitch(c + kDC1)) {
00087       nGoodClu = 0;
00088       break;
00089     }
00090       }
00091     }
00092 
00093     if (nGoodClu < fMinNClust) continue;
00094 
00095     fTrackList.push_back(ti);
00096   }
00097 
00098   return kPassed;
00099 }

double AlignChamZNoBF::ComputeChi2F (  )  [private]

Definition at line 118 of file AlignChamZNoBF.cxx.

References GMIPPGeo::Cham(), f, TrkRUtil::FitLineFromWires(), fTrackList, geo, GMIPPGeo::Instance(), kDC1, kNPlane, kPWC6, p, par, parErr, and GChamGeo::ZGas().

Referenced by ComputeF().

00119 {
00120   double f = 0;
00121 
00122   double u[24];
00123   double w[24];
00124   double z[24];
00125   double cosA[24];
00126   double sinA[24];
00127   double z1 = GMIPPGeo::Instance().Cham(kDC1).ZGas() - 50;
00128   double z2 = GMIPPGeo::Instance().Cham(kPWC6).ZGas() + 50;
00129   double par[4];
00130   double parErr[4];
00131 
00132   for (unsigned int i = 0; i < fTrackList.size(); ++i) {
00133     TrkInfo_t& ti = fTrackList[i];
00134 
00135     int nClu = 0;
00136     
00137     for (int c = 0; c < 6; ++c) {
00138       GChamGeo& geo = GMIPPGeo::Instance().Cham(c + kDC1);
00139       for (int p = 0; p < kNPlane; ++p) {
00140     if (ti.fWeight[c][p] < 1e-3) continue;
00141     
00142     geo.WireToU(p + 1, ti.fWire[c][p], u[nClu]);
00143     w[nClu] = ti.fWeight[c][p];
00144     z[nClu] = geo.Z(p + 1);
00145     cosA[nClu] = geo.GAngleCos(p + 1);
00146     sinA[nClu] = geo.GAngleSin(p + 1);
00147     
00148     nClu++;
00149       }
00150     }
00151     
00152     f += TrkRUtil::FitLineFromWires(nClu, u, w, z, cosA, sinA, z1, z2, 
00153                     par, parErr);
00154   }
00155   return f;
00156 }

double AlignChamZNoBF::ComputeCorrF (  )  [private]

Definition at line 160 of file AlignChamZNoBF.cxx.

References dxdz, f, Fit(), fTrackList, kNPlane, p, x, and y.

Referenced by ComputeF().

00160                                     {
00161   double resid[6][kNPlane];
00162   int n[6][kNPlane];
00163   double x[6][kNPlane];
00164   double y[6][kNPlane];
00165   double xx[6][kNPlane];
00166   double yy[6][kNPlane];
00167   double xy[6][kNPlane];
00168   memset(x, 0, sizeof(x));
00169   memset(n, 0, sizeof(n));
00170   memset(y, 0, sizeof(y));
00171   memset(xx, 0, sizeof(xx));
00172   memset(yy, 0, sizeof(yy));
00173   memset(xy, 0, sizeof(xy));
00174 
00175   for (unsigned int i = 0; i < fTrackList.size(); ++i) {
00176     TrkInfo_t& ti = fTrackList[i];
00177     double dxdz = Fit(ti, resid);
00178 
00179     for (int c = 0; c < 6; ++c) {
00180       for (int p = 0; p < kNPlane; ++p) {
00181     if (ti.fWeight[c][p] < 1) continue;
00182         n[c][p]++;
00183         x[c][p] += dxdz;
00184         xx[c][p] += dxdz * dxdz;
00185         y[c][p] += resid[c][p];
00186         yy[c][p] += resid[c][p] * resid[c][p];
00187         xy[c][p] += dxdz * resid[c][p];
00188       }
00189     }
00190   }
00191   double f = 0;
00192   for (int c = 0; c < 6; ++c) {
00193     for (int p = 0; p < kNPlane; ++p) {
00194       if (n[c][p] < 10) continue;
00195 
00196       // Add square of correlation coefficient for this plane
00197       double corr = (n[c][p] * xy[c][p] - x[c][p] * y[c][p]);
00198       corr *= corr;
00199       corr /= (n[c][p] * xx[c][p] - x[c][p] * x[c][p]) *
00200         (n[c][p] * yy[c][p] - y[c][p] * y[c][p]);
00201       assert(fabs(corr) < 1);
00202 
00203       f += corr;
00204     }
00205   }
00206   return f;
00207 }

double AlignChamZNoBF::ComputeF (  ) 

Definition at line 110 of file AlignChamZNoBF.cxx.

References ComputeChi2F(), ComputeCorrF(), and fUseCorr.

00111 {
00112   if (fUseCorr) return ComputeCorrF();
00113   else return ComputeChi2F();
00114 }

void AlignChamZNoBF::EndRun ( int  run,
int  subrun 
) [virtual]

Reimplemented from JobCModule.

Definition at line 307 of file AlignChamZNoBF.cxx.

References fFixCham, fTrackList, geo, gModule, gsFCN(), GMIPPGeo::Instance(), kDC1, MakeTree(), minu, GChamGeo::Name(), name, and par.

00308 {
00309   if (fTrackList.size() < 100) {
00310     cout << "Can't do alignment with " << fTrackList.size() << " tracks"
00311      << endl;
00312     return;
00313   }
00314 
00315   cout << "Doing no B-field alignment with " << fTrackList.size()
00316        << " tracks" << endl;
00317 
00318   MakeTree("pre");
00319 
00320   gModule = this;
00321   TMinuit minu(12);
00322   minu.SetFCN(gsFCN);
00323   
00324   char name[256];
00325   int ierr;
00326   double savePos[6], saveAng[6];
00327   for (int i = 0; i < 6; ++i) {
00328     GChamGeo& geo = GMIPPGeo::Instance().Cham(i + kDC1);
00329     sprintf(name, "%s_z", geo.Name());
00330     minu.mnparm(i, name, geo.ZGas(), 0.1, 
00331         geo.ZGas() - 10, geo.ZGas() + 10, ierr);
00332     savePos[i] = geo.ZGas();
00333 
00334     sprintf(name, "%s_angle", geo.Name());
00335     saveAng[i] = geo.GAngle(1) - geo.LAngle(1);
00336     minu.mnparm(i + 6, name, saveAng[i] * 1e3, 1, -5e2, 5e2, ierr);
00337   }
00338 
00339   for (unsigned int i = 0; i < fFixCham.size(); ++i) 
00340     minu.FixParameter(fFixCham[i]);
00341 
00342   minu.Migrad();
00343 
00344   MakeTree("post");
00345 
00346   double par, pe;
00347   for (int i = 0; i < 6; ++i) {
00348     minu.GetParameter(i, par, pe);
00349     cout << GChamGeo::Name(i + kDC1) << " z shift: " << par - savePos[i]
00350      << " cm, err: " << pe << endl;
00351 
00352     minu.GetParameter(i + 6, par, pe);
00353     cout << GChamGeo::Name(i + kDC1) << " angle shift: " 
00354      << par * 1e-3 - saveAng[i] << " deg, err: " << pe << endl;
00355   }
00356 }

double AlignChamZNoBF::Fit ( TrkInfo_t ti,
double  resid[6][4],
float *  dydz = 0,
float  x[6][4] = 0,
float  y[6][4] = 0 
) [private]

Definition at line 211 of file AlignChamZNoBF.cxx.

References GMIPPGeo::Cham(), AlignChamZNoBF::track__::fWeight, AlignChamZNoBF::track__::fWire, geo, GMIPPGeo::Instance(), kDC1, kNPlane, kPWC6, p, par, parErr, and GChamGeo::ZGas().

Referenced by Ana(), ComputeCorrF(), and MakeTree().

00213 {
00214   double u[24];
00215   double w[24];
00216   double z[24];
00217   double cosA[24];
00218   double sinA[24];
00219   double z1 = GMIPPGeo::Instance().Cham(kDC1).ZGas() - 50;
00220   double z2 = GMIPPGeo::Instance().Cham(kPWC6).ZGas() + 50;
00221   double par[4];
00222   double parErr[4];
00223   int plane[24];
00224 
00225   int nClu = 0;
00226 
00227   for (int c = 0; c < 6; ++c) {
00228     GChamGeo& geo = GMIPPGeo::Instance().Cham(c + kDC1);
00229     for (int p = 0; p < kNPlane; ++p) {
00230       if (ti.fWeight[c][p] < 1e-3) {
00231     resid[c][p] = 1e6;
00232     continue;
00233       }
00234 
00235       geo.WireToU(p + 1, ti.fWire[c][p], u[nClu]);
00236       w[nClu] = ti.fWeight[c][p];
00237       z[nClu] = geo.Z(p + 1);
00238       cosA[nClu] = geo.GAngleCos(p + 1);
00239       sinA[nClu] = geo.GAngleSin(p + 1);
00240       plane[nClu] = c * 4 + p;
00241 
00242       nClu++;
00243     }
00244   }
00245 
00246   TrkRUtil::FitLineFromWires(nClu, u, w, z, cosA, sinA, z1, z2, 
00247                  par, parErr);
00248 
00249   double x1[3] = {par[0], par[1], z1};
00250   double x2[3] = {par[2], par[3], z2};
00251   double x[3];
00252 
00253   double dxdz = (par[2] - par[0]) / (z2 - z1);
00254   if (dydz) *dydz = (par[3] - par[1]) / (z2 - z1);
00255   if (xc && yc) {
00256     for (int c = 0; c < 6; ++c) {
00257       GChamGeo& geo = GMIPPGeo::Instance().Cham(c + kDC1);
00258       for (int p = 0; p < 4; ++p) {
00259     x[2] = geo.Z(p + 1);
00260     TrkRUtil::PredictXY(x1, 0, x2, 0, x, 0);
00261     xc[c][p] = x[0];
00262     yc[c][p] = x[1];
00263       }
00264     }
00265   }
00266 
00267   for (int i = 0; i < nClu; ++i) {
00268     double saveW = w[i];
00269     w[i] = 0;
00270     TrkRUtil::FitLineFromWires(nClu, u, w, z, cosA, sinA, z1, z2, 
00271                    par, parErr);
00272     w[i] = saveW;
00273 
00274     x1[0] = par[0];
00275     x1[1] = par[1];
00276     x2[0] = par[2];
00277     x2[1] = par[3];
00278     x[2] = z[i];
00279     TrkRUtil::PredictXY(x1, 0, x2, 0, x, 0);
00280     
00281     int c = plane[i] / 4;
00282     int p = plane[i] % 4;
00283     GMIPPGeo::Instance().Cham(c + kDC1).XYToU(p + 1, x[0], x[1], 
00284                           resid[c][p]);
00285     resid[c][p] -= u[i];
00286   }
00287 
00288   return dxdz;
00289 }

void AlignChamZNoBF::MakeTree ( const char *  name  )  [private]

Definition at line 360 of file AlignChamZNoBF.cxx.

References dxdz, dydz, Fit(), fTrackList, geo, GMIPPGeo::Instance(), kDC1, tree, x, and y.

Referenced by EndRun().

00361 {
00362   char str[256];
00363   sprintf(str, "%s-alignment Tree", name);
00364   TTree* tree = new TTree(name, str);
00365 
00366   double u[6][4];
00367   float x[6][4];
00368   float y[6][4];
00369   double uperp[6][4];
00370   double resid[6][4];
00371   float dxdz;
00372   float dydz;
00373   tree->Branch("u", &u, "u[6][4]/D");
00374   tree->Branch("x", &x, "x[6][4]/D");
00375   tree->Branch("y", &y, "y[6][4]/D");
00376   tree->Branch("uperp", &uperp, "uperp[6][4]/D");
00377   tree->Branch("resid", &resid, "resid[6][4]/D");
00378   tree->Branch("dxdz", &dxdz, "dxdz/F");
00379   tree->Branch("dydz", &dydz, "dydz/F");
00380   
00381   for (unsigned int i = 0; i < fTrackList.size(); ++i) {
00382     TrkInfo_t& ti = fTrackList[i];
00383 
00384     dxdz = Fit(ti, resid, &dydz, x, y);
00385 
00386     for (int c = 0; c < 6; ++c) {
00387       GChamGeo& geo = GMIPPGeo::Instance().Cham(c + kDC1);
00388       for (int p = 0; p < 4; ++p) {
00389     if (ti.fWeight[c][p] < 1e-3) u[c][p] = 1e6;
00390     else geo.WireToU(p + 1, ti.fWire[c][p], u[c][p]);
00391     geo.XYToUperp(p + 1, x[c][p], y[c][p], uperp[c][p]);
00392       }
00393     }
00394     tree->Fill();
00395   }
00396 
00397   tree->Write();
00398   delete tree;
00399 }

void AlignChamZNoBF::NewRun ( int  run,
int  subrun 
) [virtual]

Reimplemented from JobCModule.

Definition at line 103 of file AlignChamZNoBF.cxx.

References GMIPPGeo::Instance().

00104 {
00105   GMIPPGeo::Instance(run);
00106 }

void AlignChamZNoBF::Update ( const CfgConfig c  )  [virtual]

Implements CfgObserver.

Definition at line 403 of file AlignChamZNoBF.cxx.

References fDebug, fFixCham, JobCModule::fIsInit, fMinNClust, fSegFolder, and fUseCorr.

00404 {
00405   fFixCham.clear();
00406   c("Debug").Get(fDebug);
00407   c("SegFolder").Get(fSegFolder);
00408   c("MinNClust").Get(fMinNClust);
00409   try { c("FixCham").Get(fFixCham); }
00410   catch (...) {
00411     int i;
00412     c("FixCham").Get(i);
00413     fFixCham.push_back(i);
00414   }
00415   c("UseCorr").Get(fUseCorr);
00416 
00417   // Change the flag to signify that our configuration has been read
00418   fIsInit = true;
00419 }


Member Data Documentation

int AlignChamZNoBF::fDebug [private]

Definition at line 56 of file AlignChamZNoBF.h.

Referenced by Ana(), and Update().

std::vector<int> AlignChamZNoBF::fFixCham [private]

Definition at line 59 of file AlignChamZNoBF.h.

Referenced by EndRun(), and Update().

int AlignChamZNoBF::fMinNClust [private]

Definition at line 58 of file AlignChamZNoBF.h.

Referenced by Ana(), and Update().

std::string AlignChamZNoBF::fSegFolder [private]

Definition at line 57 of file AlignChamZNoBF.h.

Referenced by Ana(), and Update().

std::vector<TrkInfo_t> AlignChamZNoBF::fTrackList [private]

Definition at line 54 of file AlignChamZNoBF.h.

Referenced by Ana(), ComputeChi2F(), ComputeCorrF(), EndRun(), and MakeTree().

int AlignChamZNoBF::fUseCorr [private]

Definition at line 60 of file AlignChamZNoBF.h.

Referenced by ComputeF(), and Update().


The documentation for this class was generated from the following files:
Generated on Mon Nov 23 08:03:55 2009 for MIPP(E907) by  doxygen 1.4.7