Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-05 08:15:15

0001 #include <trackbase/ActsGeometry.h>
0002 
0003 bool writer = true;
0004 
0005 const int nlayers = 7;
0006 
0007 namespace 
0008 {
0009   template<class T> inline constexpr T square(const T& x) { return x*x;}
0010   template<class T> inline constexpr T get_r(const T&x ,const T&y)
0011   { return std::sqrt(square(x)+square(y)); }
0012   inline const double get_angle(const Acts::Vector3&x, const Acts::Vector3& y)
0013   { return std::acos(x.dot(y)/(x.norm() * y.norm())); }
0014 }
0015 
0016 void AnalyzeResiduals(std::string infile, const bool use_helical = false)
0017 {
0018   TFile *file = TFile::Open(infile.c_str());
0019   if(!file)
0020     {
0021       std::cout << "wrong file name" << std::endl;
0022       return;
0023     }
0024   auto tree = (TTree*)file->Get("residualtree");
0025   
0026   float px, py, pz, pt, eta, phi, deltapt, quality, pcax, pcay, pcaz;
0027   int nhits, nmaps, nintt, ntpc, nmms, charge;
0028   
0029   std::vector<float>* cluslx=0;
0030   std::vector<float>* cluslz=0;
0031   std::vector<float>* cluselx=0;
0032   std::vector<float>* cluselz=0;
0033   std::vector<float>* clusgx=0;
0034   std::vector<float>* clusgy=0;
0035   std::vector<float>* clusgz=0;
0036   std::vector<int>* cluslayer=0;
0037   std::vector<int>* clussize=0;
0038   std::vector<uint32_t>* clushitsetkey = 0;
0039 
0040   std::vector<float>* idealsurfcenterx=0;
0041   std::vector<float>* idealsurfcentery=0;
0042   std::vector<float>* idealsurfcenterz=0;
0043   std::vector<float>* idealsurfnormx=0;
0044   std::vector<float>* idealsurfnormy=0;
0045   std::vector<float>* idealsurfnormz=0;
0046   std::vector<float>* missurfcenterx=0;
0047   std::vector<float>* missurfcentery=0;
0048   std::vector<float>* missurfcenterz=0;
0049   std::vector<float>* missurfnormx=0;
0050   std::vector<float>* missurfnormy=0;
0051   std::vector<float>* missurfnormz=0;
0052   std::vector<float>* clusgxideal=0;
0053   std::vector<float>* clusgyideal=0;
0054   std::vector<float>* clusgzideal=0;
0055   std::vector<float>* missurfalpha=0;
0056   std::vector<float>* missurfbeta=0;
0057   std::vector<float>* missurfgamma=0;
0058   std::vector<float>* idealsurfalpha=0;
0059   std::vector<float>* idealsurfbeta=0;
0060   std::vector<float>* idealsurfgamma=0;
0061 
0062   std::vector<float>* statelx=0;
0063   std::vector<float>* statelz=0;
0064   std::vector<float>* stateelx=0;
0065   std::vector<float>* stateelz=0;
0066   std::vector<float>* stategx=0;
0067   std::vector<float>* stategy=0;
0068   std::vector<float>* stategz=0;
0069   std::vector<float>* statepx=0;
0070   std::vector<float>* statepy=0;
0071   std::vector<float>* statepz=0;
0072   std::vector<float>* statepl=0;
0073 
0074   std::vector<float>* statelxglobderivdx=0;
0075   std::vector<float> *statelxglobderivdy=0;
0076   std::vector<float> *statelxglobderivdz=0;
0077   std::vector<float> *statelxglobderivdalpha=0;
0078   std::vector<float> *statelxglobderivdbeta=0;
0079   std::vector<float> *statelxglobderivdgamma=0;
0080 
0081   std::vector<float> *statelxlocderivd0=0;
0082   std::vector<float> *statelxlocderivz0=0;
0083   std::vector<float> *statelxlocderivphi=0;
0084   std::vector<float> *statelxlocderivtheta=0;
0085   std::vector<float> *statelxlocderivqop=0;
0086   
0087   std::vector<float> *statelzglobderivdx=0;
0088   std::vector<float> *statelzglobderivdy=0;
0089   std::vector<float> *statelzglobderivdz=0;
0090   std::vector<float> *statelzglobderivdalpha=0;
0091   std::vector<float> *statelzglobderivdbeta=0;
0092   std::vector<float> *statelzglobderivdgamma=0;
0093 
0094   std::vector<float> *statelzlocderivd0=0;
0095   std::vector<float> *statelzlocderivz0=0;
0096   std::vector<float> *statelzlocderivphi=0;
0097   std::vector<float> *statelzlocderivtheta=0;
0098   std::vector<float> *statelzlocderivqop=0;
0099 
0100   tree->SetBranchAddress("px",&px);
0101   tree->SetBranchAddress("py",&py);
0102   tree->SetBranchAddress("pz",&pz);
0103   tree->SetBranchAddress("pt",&pt);
0104   tree->SetBranchAddress("eta",&eta);
0105   tree->SetBranchAddress("phi",&phi);
0106   tree->SetBranchAddress("deltapt",&deltapt);
0107   tree->SetBranchAddress("quality",&quality);
0108   tree->SetBranchAddress("nhits",&nhits);
0109   tree->SetBranchAddress("nmaps",&nmaps);
0110   tree->SetBranchAddress("nintt",&nintt);
0111   tree->SetBranchAddress("ntpc",&ntpc);
0112   tree->SetBranchAddress("nmms",&nmms);
0113   tree->SetBranchAddress("quality",&quality);
0114   tree->SetBranchAddress("pcax", &pcax);
0115   tree->SetBranchAddress("pcay",&pcay);
0116   tree->SetBranchAddress("pcaz", &pcaz);
0117 
0118   tree->SetBranchAddress("clushitsetkey",&clushitsetkey);
0119   tree->SetBranchAddress("cluslx",&cluslx);
0120   tree->SetBranchAddress("cluslz",&cluslz);
0121   tree->SetBranchAddress("cluselx",&cluselx);
0122   tree->SetBranchAddress("cluselz",&cluselz);
0123   tree->SetBranchAddress("clusgx",&clusgx);
0124   tree->SetBranchAddress("clusgy",&clusgy);
0125   tree->SetBranchAddress("clusgz",&clusgz);
0126   tree->SetBranchAddress("cluslayer",&cluslayer);
0127   tree->SetBranchAddress("clussize",&clussize);
0128   tree->SetBranchAddress("idealsurfcenterx",&idealsurfcenterx);
0129   tree->SetBranchAddress("idealsurfcentery",&idealsurfcentery);
0130   tree->SetBranchAddress("idealsurfcenterz",&idealsurfcenterz);
0131   tree->SetBranchAddress("missurfcenterx",&missurfcenterx);
0132   tree->SetBranchAddress("missurfcentery",&missurfcentery);
0133   tree->SetBranchAddress("missurfcenterz",&missurfcenterz);
0134   tree->SetBranchAddress("idealsurfnormx",&idealsurfnormx);
0135   tree->SetBranchAddress("idealsurfnormy",&idealsurfnormy);
0136   tree->SetBranchAddress("idealsurfnormz",&idealsurfnormz);
0137   tree->SetBranchAddress("missurfnormx",&missurfnormx);
0138   tree->SetBranchAddress("missurfnormy",&missurfnormy);
0139   tree->SetBranchAddress("missurfnormz",&missurfnormz);
0140   tree->SetBranchAddress("clusgxideal",&clusgxideal);
0141   tree->SetBranchAddress("clusgyideal", &clusgyideal);
0142   tree->SetBranchAddress("clusgzideal",&clusgzideal);
0143   tree->SetBranchAddress("missurfalpha",&missurfalpha);
0144   tree->SetBranchAddress("missurfbeta",&missurfbeta);
0145   tree->SetBranchAddress("missurfgamma",&missurfgamma);
0146   tree->SetBranchAddress("idealsurfalpha",&idealsurfalpha);
0147   tree->SetBranchAddress("idealsurfbeta",&idealsurfbeta);
0148   tree->SetBranchAddress("idealsurfgamma",&idealsurfgamma);
0149 
0150   tree->SetBranchAddress("statelx",&statelx);
0151    tree->SetBranchAddress("statelz",&statelz);
0152   tree->SetBranchAddress("stateelx",&stateelx);
0153   tree->SetBranchAddress("stateelz",&stateelz);
0154   tree->SetBranchAddress("stategx",&stategx);
0155   tree->SetBranchAddress("stategy",&stategy);
0156   tree->SetBranchAddress("stategz",&stategz);
0157   tree->SetBranchAddress("statepx",&statepx);
0158   tree->SetBranchAddress("statepy",&statepy);
0159   tree->SetBranchAddress("statepz",&statepz);
0160   tree->SetBranchAddress("statepl",&statepl);
0161 
0162   tree->SetBranchAddress("statelxglobderivdx", &statelxglobderivdx);
0163   tree->SetBranchAddress("statelxglobderivdy", &statelxglobderivdy);
0164   tree->SetBranchAddress("statelxglobderivdz", &statelxglobderivdz); 
0165   tree->SetBranchAddress("statelxglobderivdalpha", &statelxglobderivdalpha);
0166   tree->SetBranchAddress("statelxglobderivdbeta", &statelxglobderivdbeta);
0167   tree->SetBranchAddress("statelxglobderivdgamma", &statelxglobderivdgamma);
0168 
0169   tree->SetBranchAddress("statelxlocderivd0",&statelxlocderivd0);
0170   tree->SetBranchAddress("statelxlocderivz0",&statelxlocderivz0);
0171   tree->SetBranchAddress("statelxlocderivphi",&statelxlocderivphi);
0172   tree->SetBranchAddress("statelxlocderivtheta",&statelxlocderivtheta);
0173   tree->SetBranchAddress("statelxlocderivqop",&statelxlocderivqop);
0174 
0175   tree->SetBranchAddress("statelzglobderivdx", &statelzglobderivdx);
0176   tree->SetBranchAddress("statelzglobderivdy", &statelzglobderivdy);
0177   tree->SetBranchAddress("statelzglobderivdz", &statelzglobderivdz); 
0178   tree->SetBranchAddress("statelzglobderivdalpha", &statelzglobderivdalpha);
0179   tree->SetBranchAddress("statelzglobderivdbeta", &statelzglobderivdbeta);
0180   tree->SetBranchAddress("statelzglobderivdgamma", &statelzglobderivdgamma);
0181 
0182   tree->SetBranchAddress("statelzlocderivd0",&statelzlocderivd0);
0183   tree->SetBranchAddress("statelzlocderivz0",&statelzlocderivz0);
0184   tree->SetBranchAddress("statelzlocderivphi",&statelzlocderivphi);
0185   tree->SetBranchAddress("statelzlocderivtheta",&statelzlocderivtheta);
0186   tree->SetBranchAddress("statelzlocderivqop",&statelzlocderivqop);
0187   
0188   TFile *outfile = new TFile("residualoutfile.root","recreate");
0189   
0190   TH2 *h_residuallayerx = new TH2F("residuallayerx",";x residual [mm];layer",1000,-1,1,60,0,60);
0191   TH2 *h_residuallayerz = new TH2F("residuallayerz",";z residual [mm];layer",1000,-1,1,60,0,60);
0192   TH2 *h_residualcluspulllayerx = new TH2F("residualcluspulllayerx",";x residual / clus error;layer",400,-10,10,60,0,60);
0193   TH2 *h_residualcluspulllayerz = new TH2F("residualcluspulllayerz",";z residual / clus error;layer",400,-10,10,60,0,60);
0194   TH2 *h_residualstatepulllayerx = new TH2F("residualstatepulllayerx",";x residual / state error;layer",400,-10,10,60,0,60);
0195   TH2 *h_residualstatepulllayerz = new TH2F("residualstatepulllayerz",";z residual / state error;layer",400,-10,10,60,0,60);
0196 
0197   // as a function of layer
0198   TH2 *h_residualxclusr[nlayers];
0199   TH2 *h_residualxclusphi[nlayers];
0200   TH2 *h_residualgxclusphi[nlayers];
0201   TH2 *h_residualgyclusphi[nlayers];
0202   TH2 *h_residualgzclusphi[nlayers];
0203   TH2 *h_residualxclusz[nlayers];
0204   TH2 *h_residualzclusr[nlayers];
0205   TH2 *h_residualzclusphi[nlayers];
0206   TH2 *h_residualzclusz[nlayers];
0207   TH2 *h_surfradiusdiffvsphi[nlayers];
0208   TH2 *h_surfxdiffvsphi[nlayers];
0209   TH2 *h_surfydiffvsphi[nlayers];
0210   TH2 *h_surfzdiffvsphi[nlayers];
0211   TH2 *h_surfphidiffvsphi[nlayers];
0212   TH2 *h_surfadiffvsphi[nlayers];
0213   TH2 *h_surfbdiffvsphi[nlayers];
0214   TH2 *h_surfgdiffvsphi[nlayers];
0215   TH2 *h_surfadiffvsz[nlayers];
0216   TH2 *h_surfbdiffvsz[nlayers];
0217   TH2 *h_surfgdiffvsz[nlayers];
0218   TH3 *h_residualxclusphiz[nlayers];
0219   TH3 *h_residualzclusphiz[nlayers];
0220 
0221   for(int i=0; i<nlayers; i++)
0222     {
0223       int zlow = -105;
0224       int zhigh = 105;
0225       int rlow = 30;
0226       int rhigh = 85;
0227       
0228       if(i<3){
0229     zlow = -10; zhigh = 10; rlow = 0; rhigh = 4;
0230       } else if (i < 7) {
0231     zlow = -30; zhigh = 30; rlow = 4; rhigh = 14;
0232       } 
0233       
0234       ostringstream name;
0235       name.str("");
0236       name << "surfphidiffvsphi_"<<i;
0237       h_surfphidiffvsphi[i] = new TH2F(name.str().c_str(),";Ideal #phi_{surf} [deg]; Ideal - misaligned phi [deg]",120,-180,180,1080,-2,2);
0238 
0239       name.str("");
0240       name << "surfadiffvsphi_"<<i;
0241       h_surfadiffvsphi[i] = new TH2F(name.str().c_str(),";Ideal #phi_{surf} [deg]; Ideal - misaligned angle to x axis [mrad]",120,-180,180,100,-10,10);
0242       
0243       name.str("");
0244       name << "surfbdiffvsphi_"<<i;
0245       h_surfbdiffvsphi[i] = new TH2F(name.str().c_str(),";Ideal #phi_{surf} [deg]; Ideal - misaligned angle to y axis [mrad]",120,-180,180,100,-10,10);
0246 
0247 name.str("");
0248       name << "surfgdiffvsphi_"<<i;
0249       h_surfgdiffvsphi[i] = new TH2F(name.str().c_str(),";Ideal #phi_{surf} [deg]; Ideal - misaligned angle to z axis [mrad]",120,-180,180,100,-10,10);
0250     
0251       name.str("");
0252       name << "surfadiffvsz_"<<i;
0253       h_surfadiffvsz[i] = new TH2F(name.str().c_str(),";Ideal z_{surf} [mm]; Ideal - misaligned angle to x axis [mrad]",120,-180,180,100,-10,10);
0254       
0255       name.str("");
0256       name << "surfbdiffvsz_"<<i;
0257       h_surfbdiffvsz[i] = new TH2F(name.str().c_str(),";Ideal z_{surf} [mm]; Ideal - misaligned angle to y axis [mrad]",120,-180,180,100,-10,10);
0258 
0259       name.str("");
0260       name << "surfgdiffvsz_"<<i;
0261       h_surfgdiffvsz[i] = new TH2F(name.str().c_str(),";Ideal z_{surf} [deg]; Ideal - misaligned angle to z axis [mrad]",120,-180,180,100,-10,10);
0262 
0263       name.str("");
0264       name << "surfradiusdiffvsphi_"<<i;
0265       h_surfradiusdiffvsphi[i] = new TH2F(name.str().c_str(),";Ideal #phi_{surf} [deg]; Ideal radius - misalign radius [mm]",120,-180,180,1000,-1,1);
0266 
0267       name.str("");
0268       name << "surfxdiffvsphi_"<<i;
0269       h_surfxdiffvsphi[i] = new TH2F(name.str().c_str(),";Ideal #phi_{surf} [deg]; Misalign x - ideal x [mm]",120,-180,180,1000,-1,1);
0270       
0271       name.str("");
0272       name << "surfydiffvsphi_"<<i;
0273       h_surfydiffvsphi[i] = new TH2F(name.str().c_str(),";Ideal #phi_{surf} [deg]; Misalign y - ideal y [mm]", 120,-180,180,1000,-1,1);
0274 
0275       name.str("");
0276       name << "surfzdiffvsphi_"<<i;
0277       h_surfzdiffvsphi[i] = new TH2F(name.str().c_str(), ";Ideal #phi_{surf} [deg]; Misalign z - ideal z [mm]",120,-180,180,2500,-10,10);
0278 
0279       name.str("");
0280       name << "residualxclusphiz_"<<i;
0281       //h_residualxclusphiz[i] = new TH3F(name.str().c_str(),";#phi [deg]; z [mm]; x residual [mm]",180,-180,180,100,-200,200,1000,-1,1);
0282       name.str("");
0283       name << "residualzclusphiz_"<<i;
0284       //h_residualzclusphiz[i] = new TH3F(name.str().c_str(),";#phi [deg]; z[mm]; z residual [mm]",180,-180,180,100,-200,200,1000,-1,1);
0285 
0286       name.str("");
0287       name<<"residualgxclusphi_"<<i;
0288       h_residualgxclusphi[i] = new TH2F(name.str().c_str(),";#phi [deg]; x_{glob} residual [mm]", 180,-180,180,2000,-1,1);
0289       
0290       name.str("");
0291       name << "residualgyclusphi_"<<i;
0292       h_residualgyclusphi[i] = new TH2F(name.str().c_str(),";#phi [deg]; y_{glob} residual [mm]",180,-180,180,2000,-1,1);
0293       
0294       name.str("");
0295       name << "residualgzclusphi_"<<i;
0296       h_residualgzclusphi[i] = new TH2F(name.str().c_str(),";#phi [deg]; z_{glob} residual [mm]",180,-180,180,2000,-10,10);
0297 
0298       name.str("");
0299       name << "residualxclusr_"<<i;
0300       h_residualxclusr[i] = new TH2F(name.str().c_str(),";r [cm]; x residual [mm]",
0301                      170,rlow,rhigh,2000,-1,1);
0302       name.str("");
0303       name << "residualxclusphi_"<<i;
0304       h_residualxclusphi[i] = new TH2F(name.str().c_str(),";phi [deg]; x residual [mm]",
0305                        180,-180,180,2000,-1,1);
0306       name.str("");
0307       name << "residualxclusz_"<<i;
0308       h_residualxclusz[i] = new TH2F(name.str().c_str(),";z [cm]; x residual [mm]",
0309                     210,zlow,zhigh,2000,-1,1);
0310       name.str("");
0311       name<<"residualzclusr_"<<i;
0312       h_residualzclusr[i] = new TH2F(name.str().c_str(),";r [cm]; z residual [mm]",
0313                      170,rlow,rhigh,2000,-1,1);
0314       name.str("");
0315       name << "residualzclusphi_"<<i;
0316       h_residualzclusphi[i] = new TH2F(name.str().c_str(),";phi [deg]; z residual [mm]",
0317                        180,-180,180,2000,-1,1);
0318       name.str("");
0319       name << "residualzclusz_"<<i;
0320       h_residualzclusz[i] = new TH2F(name.str().c_str(),";z [cm]; z residual [mm]",
0321                      210,zlow,zhigh,2000,-1,1);
0322     }
0323 
0324 
0325 
0326   TH2F *h_residualhitsetkeyx = new TH2F("residualhitsetkeyx",";x residual [mm];hitsetkey",1000,-1,1,1200,0,1200);
0327   TH2F *h_residualhitsetkeyz = new TH2F("residualhitsetkeyz",";z residual [mm];hitsetkey",1000,-1,1,1200,0,1200);
0328   TH2F *h_residualcluspullhitsetkeyx = new TH2F("residualcluspullhitsetkeyx",";x residual / clus error;hitsetkey",400,-10,10,1200,0,1200);
0329   TH2F *h_residualcluspullhitsetkeyz = new TH2F("residualcluspullhitsetkeyz",";z residual / clus error;hitsetkey",400,-10,10,1200,0,1200);
0330   TH2F *h_residualstatepullhitsetkeyx = new TH2F("residualstatepullhitsetkeyx",";x residual / state error;hitsetkey",400,-10,10,1200,0,1200);
0331   TH2F *h_residualstatepullhitsetkeyz = new TH2F("residualstatepullhitsetkeyz",";z residual / state error;hitsetkey",400,-10,10,1200,0,1200);
0332 
0333   TH2F *h_xresidualgdx = new TH2F("xresidualgdx",";dx_{resid}/dx_{glob};x_{resid} [mm]",1000,-1.3,1.3,1000,-1,1);
0334   TH2F *h_xresidualgdy = new TH2F("xresidualgdy",";dx_{resid}/dy_{glob};x_{resid} [mm]",1000,-1.3,1.3,1000,-1,1);
0335   TH2F *h_xresidualgdz = new TH2F("xresidualgdz",";dx_{resid}/dz_{glob};x_{resid} [mm]",1000,-0.001,0.001,1000,-1,1);
0336   TH2F *h_xresidualdalpha = new TH2F("xresidualdalpha",";dx_{resid}/d#alpha;x_{resid} [mm]",1000,-600,600,1000,-1,1);
0337   TH2F *h_xresidualdbeta = new TH2F("xresidualdbeta",";dx_{resid}/d#beta;x_{resid} [mm]",1000,-600,600,1000,-1,1);
0338   TH2F *h_xresidualdgamma = new TH2F("xresidualdgamma",";dx_{resid}/d#gamma;x_{resid} [mm]",1000,-20,20,1000,-1,1);
0339   TH2F *h_xresidualdd0 = new TH2F("xresidualdd0",";dx_{resid}/dd_{0}; x_{resid} [mm]",1000,0.9,1.1,1000,-1,1);
0340   TH2F *h_xresidualdz0 = new TH2F("xresidualdz0",";dx_{resid}/dz_{0}; x_{resid} [mm]",1000,-0.002,0.002,1000,-1,1);
0341   TH2F *h_xresidualdphi = new TH2F("xresidualdphi",";dx_{resid}/d#phi; x_{resid} [mm]", 1000,-100,100,1000,-1,1);
0342   TH2F *h_xresidualdtheta = new TH2F("xresidualdtheta",";dx_{resid}/d#theta; x_{resid} [mm]",1000,-10,10,1000,-1,1);
0343   TH2F *h_xresidualdqop = new TH2F("xresidualdqop",";dx_{resid}/dqop; x_{resid} [mm]",1000,-20,10,1000,-1,1);
0344   
0345 
0346   TH2F *h_zresidualgdx = new TH2F("zresidualgdx",";dz_{resid}/dx_{glob};z_{resid} [mm]",1000,-1.3,1.3,1000,-1,1);
0347   TH2F *h_zresidualgdy = new TH2F("zresidualgdy",";dz_{resid}/dy_{glob};z_{resid} [mm]",1000,-1.3,1.3,1000,-1,1);
0348   TH2F *h_zresidualgdz = new TH2F("zresidualgdz",";dz_{resid}/dz_{glob};z_{resid} [mm]",1000,-1.3,1.3,1000,-1,1);
0349   TH2F *h_zresidualdalpha = new TH2F("zresidualdalpha",";dz_{resid}/d#alpha;z_{resid} [mm]",1000,-600,600,1000,-1,1);
0350   TH2F *h_zresidualdbeta = new TH2F("zresidualdbeta",";dz_{resid}/d#beta;z_{resid} [mm]",1000,-600,600,1000,-1,1);
0351   TH2F *h_zresidualdgamma = new TH2F("zresidualdgamma",";dz_{resid}/d#gamma;z_{resid} [mm]",1000,-20,20,1000,-1,1);
0352   TH2F *h_zresidualdd0 = new TH2F("zresidualdd0",";dz_{resid}/dd_{0}; z_{resid} [mm]",1000,-1,1,1000,-1,1);
0353   TH2F *h_zresidualdz0 = new TH2F("zresidualdz0",";dz_{resid}/dz_{0}; z_{resid} [mm]",1000,0.9,1.1,1000,-1,1);
0354   TH2F *h_zresidualdphi = new TH2F("zresidualdphi",";dz_{resid}/d#phi; z_{resid} [mm]", 1000,-100,100,1000,-1,1);
0355   TH2F *h_zresidualdtheta = new TH2F("zresidualdtheta",";dz_{resid}/d#theta; z_{resid} [mm]",5000,-600,10,1000,-1,1);
0356   TH2F *h_zresidualdqop = new TH2F("zresidualdqop",";dz_{resid}/dqop; z_{resid} [mm]",1000,-2,2,1000,-1,1);
0357 
0358   TH2F *h_dxdxvsphi = new TH2F("dxdxvsphi",";#phi [deg];dx_{resid}/dx_{glob}",120,-180,180,1000,-1.3,1.3);
0359   TH2F *h_dxdyvsphi = new TH2F("dxdyvsphi",";#phi [deg];dx_{resid}/dy_{glob}",120,-180,180,1000,-1.3,1.3);
0360   TH2F *h_dxdzvsphi = new TH2F("dxdzvsphi",";#phi [deg];dx_{resid}/dz_{glob}",120,-180,180,1000,-0.002,0.002);
0361   TH2F *h_dxdalphavsphi = new TH2F("dxdalphavsphi",";#phi [deg];dx_{resid}/d#alpha",120,-180,180,1000,-600,600);
0362   TH2F *h_dxdbetavsphi = new TH2F("dxdbetavsphi",";#phi [deg];dx_{resid}/d#beta",120,-180,180,1000,-600,600);
0363   TH2F *h_dxdgammavsphi = new TH2F("dxdgammavsphi",";#phi [deg];dx_{resid}/d#gamma",120,-180,180,1000,-20,20);
0364   TH2F *h_dxdd0vsphi = new TH2F("dxdd0vsphi",";#phi [deg];dx_{resid}/dd_{0}",120,-180,180,1000,0.9,1.1);
0365   TH2F *h_dxdz0vsphi = new TH2F("dxdz0vsphi",";#phi [deg];dx_{resid}/dz_{0}",120,-180,180,1000,-0.002,0.002);
0366   TH2F *h_dxdphivsphi = new TH2F("dxdphivsphi",";#phi [deg];dx_{resid}/d#phi",120,-180,180,1000,-100,100);
0367   TH2F *h_dxdthetavsphi = new TH2F("dxdthetavsphi",";#phi [deg];dx_{resid}/d#theta",120,-180,180,1000,-10,10);
0368   TH2F *h_dxdqopvsphi = new TH2F("dxdqopvsphi",";#phi [deg];dx_{resid}/dqop",120,-180,180,1000,-1,1);
0369 
0370   TH2F *h_dzdxvsphi = new TH2F("dzdxvsphi",";#phi [deg];dz_{resid}/dx_{glob}",120,-180,180,1000,-1.3,1.3);
0371   TH2F *h_dzdyvsphi = new TH2F("dzdyvsphi",";#phi [deg];dz_{resid}/dy_{glob}",120,-180,180,1000,-1.3,1.3);
0372   TH2F *h_dzdzvsphi = new TH2F("dzdzvsphi",";#phi [deg];dz_{resid}/dz_{glob}",120,-180,180,1000,-1.3,1.3);
0373   TH2F *h_dzdalphavsphi = new TH2F("dzdalphavsphi",";#phi [deg];dz_{resid}/d#alpha",120,-180,180,1000,-600,600);
0374   TH2F *h_dzdbetavsphi = new TH2F("dzdbetavsphi",";#phi [deg];dz_{resid}/d#beta",120,-180,180,1000,-600,600);
0375   TH2F *h_dzdgammavsphi = new TH2F("dzdgammavsphi",";#phi [deg];dz_{resid}/d#gamma",120,-180,180,1000,-20,20);
0376   TH2F *h_dzdd0vsphi = new TH2F("dzdd0vsphi",";#phi [deg];dz_{resid}/dd_{0}",120,-180,180,1000,-1,1);
0377   TH2F *h_dzdz0vsphi = new TH2F("dzdz0vsphi",";#phi [deg];dz_{resid}/dz_{0}",120,-180,180,1000,0.9,1.1);
0378   TH2F *h_dzdphivsphi = new TH2F("dzdphivsphi",";#phi [deg];dz_{resid}/d#phi",120,-180,180,1000,-100,100);
0379   TH2F *h_dzdthetavsphi = new TH2F("dzdthetavsphi",";#phi [deg];dz_{resid}/d#theta",120,-180,180,1000,-10,10);
0380   TH2F *h_dzdqopvsphi = new TH2F("dzdqopvsphi",";#phi [deg];dz_{resid}/dqop",120,-180,180,1000,-1,1);
0381 
0382  TH2F *h_dxdxvseta = new TH2F("dxdxvseta",";#eta ;dx_{resid}/dx_{glob}",100,-1,1,1000,-1.3,1.3);
0383   TH2F *h_dxdyvseta = new TH2F("dxdyvseta",";#eta ;dx_{resid}/dy_{glob}",100,-1,1,1000,-1.3,1.3);
0384   TH2F *h_dxdzvseta = new TH2F("dxdzvseta",";#eta ;dx_{resid}/dz_{glob}",100,-1,1,1000,-1.3,1.3);
0385   TH2F *h_dxdalphavseta = new TH2F("dxdalphavseta",";#eta ;dx_{resid}/d#alpha",100,-1,1,1000,-600,600);
0386   TH2F *h_dxdbetavseta = new TH2F("dxdbetavseta",";#eta ;dx_{resid}/d#beta",100,-1,1,1000,-600,600);
0387   TH2F *h_dxdgammavseta = new TH2F("dxdgammavseta",";#eta ;dx_{resid}/d#gamma",100,-1,1,1000,-20,20);
0388   TH2F *h_dxdd0vseta = new TH2F("dxdd0vseta",";#eta ;dx_{resid}/dd_{0}",100,-1,1,1000,0.9,1.1);
0389   TH2F *h_dxdz0vseta = new TH2F("dxdz0vseta",";#eta ;dx_{resid}/dz_{0}",100,-1,1,1000,-0.002,0.002);
0390   TH2F *h_dxdphivseta = new TH2F("dxdphivseta",";#eta ;dx_{resid}/d#phi",100,-1,1,1000,-100,100);
0391   TH2F *h_dxdthetavseta = new TH2F("dxdthetavseta",";#eta ;dx_{resid}/d#theta",100,-1,1,1000,-10,10);
0392   TH2F *h_dxdqopvseta = new TH2F("dxdqopvseta",";#eta ;dx_{resid}/dqop",100,-1,1,1000,-1,1);
0393 
0394   TH2F *h_dzdxvseta = new TH2F("dzdxvseta",";#eta ;dz_{resid}/dx_{glob}",100,-1,1,1000,-1.3,1.3);
0395   TH2F *h_dzdyvseta = new TH2F("dzdyvseta",";#eta ;dz_{resid}/dy_{glob}",100,-1,1,1000,-1.3,1.3);
0396   TH2F *h_dzdzvseta = new TH2F("dzdzvseta",";#eta ;dz_{resid}/dz_{glob}",100,-1,1,1000,-1.3,1.3);
0397   TH2F *h_dzdalphavseta = new TH2F("dzdalphavseta",";#eta ;dz_{resid}/d#alpha",100,-1,1,1000,-600,600);
0398   TH2F *h_dzdbetavseta = new TH2F("dzdbetavseta",";#eta ;dz_{resid}/d#beta",100,-1,1,1000,-600,600);
0399   TH2F *h_dzdgammavseta = new TH2F("dzdgammavseta",";#eta ;dz_{resid}/d#gamma",100,-1,1,1000,-20,20);
0400   TH2F *h_dzdd0vseta = new TH2F("dzdd0vseta",";#eta ;dz_{resid}/dd_{0}",100,-1,1,1000,-1,1);
0401   TH2F *h_dzdz0vseta = new TH2F("dzdz0vseta",";#eta ;dz_{resid}/dz_{0}",100,-1,1,1000,0.9,1.1);
0402   TH2F *h_dzdphivseta = new TH2F("dzdphivseta",";#eta ;dz_{resid}/d#phi",100,-1,1,1000,-100,100);
0403   TH2F *h_dzdthetavseta = new TH2F("dzdthetavseta",";#eta ;dz_{resid}/d#theta",100,-1,1,1000,-10,10);
0404   TH2F *h_dzdqopvseta = new TH2F("dzdqopvseta",";#eta ;dz_{resid}/dqop",100,-1,1,1000,-1,1);
0405   TH2F *h_sensorlayercounts = new TH2F("sensorlayercounts",";sensor number; layer",1200,0,1200,58,0,58);
0406 
0407   TH2F *h_lowcountsxy = new TH2F("lowcountsxy",";x_{clus} [cm];y_{clus} [cm];",
0408                  10000,-20,20,10000,-20,20);
0409 
0410   TH2F *h_lowcountsrz = new TH2F("lowcountsrz",";z_{clus} [cm];r_{clus} [cm];",
0411                  10000,-40,40,100,0,20);
0412 
0413   int badent = 0;
0414   int sensornum = 0;
0415   std::map<uint32_t, int> hitsetkey_sensornum_map, hitsetkey_numcounts_map;
0416   std::cout << "iterating " << tree->GetEntries() << std::endl;
0417   for(int i=0; i<tree->GetEntries(); i++)
0418     {
0419       if(i > 25000)
0420     break;
0421       tree->GetEntry(i);
0422       for(int j=0; j<cluslx->size(); j++)
0423     {
0424       unsigned int layer = cluslayer->at(j);
0425 
0426       if(layer > 6) continue;
0427       float xresidual = cluslx->at(j) - statelx->at(j);
0428       float zresidual = cluslz->at(j) - statelz->at(j);
0429       //convert to mm
0430       xresidual *= 10;
0431       zresidual *= 10;
0432       float celx = cluselx->at(j);
0433       float celz = cluselz->at(j);
0434       float cgz = clusgz->at(j);
0435       celx *= 10;
0436       celz *= 10;
0437       cgz *= 10;
0438       uint32_t hitsetkey = clushitsetkey->at(j);
0439 
0440       auto iter = hitsetkey_sensornum_map.find(hitsetkey);
0441       if(iter == hitsetkey_sensornum_map.end())
0442         {
0443           hitsetkey_sensornum_map.insert(std::make_pair(hitsetkey,sensornum));
0444           hitsetkey_numcounts_map.insert(std::make_pair(hitsetkey, 1));
0445           sensornum++;
0446         } 
0447       else
0448         {
0449           hitsetkey_numcounts_map.find(hitsetkey)->second++;
0450         }
0451       
0452       int sensornum = hitsetkey_sensornum_map.find(hitsetkey)->second;
0453       if(sensornum > 130)
0454         {
0455           h_lowcountsxy->Fill(clusgx->at(j), clusgy->at(j));
0456           h_lowcountsrz->Fill(clusgz->at(j),sqrt(clusgx->at(j)*clusgx->at(j)+clusgy->at(j)*clusgy->at(j)));
0457         }
0458       h_sensorlayercounts->Fill(sensornum, layer);
0459       TVector3 clusvec;
0460       clusvec.SetXYZ(clusgx->at(j), clusgy->at(j), clusgz->at(j));
0461       float clusphi = clusvec.Phi() * 180 / 3.14159;
0462       float cluseta = clusvec.Eta();
0463       float statelxglobderivdxv = statelxglobderivdx->at(j);
0464       
0465       float xresidualcluspull = xresidual / celx;
0466       float zresidualcluspull = zresidual / celz;
0467       float xresidualstatepull = xresidual / (10*stateelx->at(j));
0468       float zresidualstatepull = zresidual / (10*stateelz->at(j));
0469 
0470       float statelxglobdx = statelxglobderivdx->at(j);
0471       float statelxglobdy = statelxglobderivdy->at(j);
0472       float statelxglobdz = statelxglobderivdz->at(j);
0473       float statelxglobdalpha = statelxglobderivdalpha->at(j);
0474       float statelxglobdbeta = statelxglobderivdbeta->at(j);
0475       float statelxglobdgamma = statelxglobderivdgamma->at(j);
0476       float statelzglobdx = statelxglobderivdx->at(j);
0477       float statelzglobdy = statelxglobderivdy->at(j);
0478       float statelzglobdz = statelxglobderivdz->at(j);
0479       float statelzglobdalpha = statelzglobderivdalpha->at(j);
0480       float statelzglobdbeta = statelzglobderivdbeta->at(j);
0481       float statelzglobdgamma = statelzglobderivdgamma->at(j);
0482       
0483       if(use_helical)
0484         {
0485           statelxglobdalpha *= 10;
0486           statelxglobdbeta *= 10;
0487           statelxglobdgamma *= 10;
0488           statelzglobdalpha *= 10;
0489           statelzglobdbeta *= 10;
0490           statelzglobdgamma *= 10;
0491         }
0492       
0493       Acts::Vector3 missurfnorm(missurfnormx->at(j),
0494                     missurfnormy->at(j),
0495                     missurfnormz->at(j));
0496         
0497       Acts::Vector3 idealsurfnorm(idealsurfnormx->at(j),
0498                       idealsurfnormy->at(j),
0499                       idealsurfnormz->at(j));
0500 
0501       float alpha = idealsurfalpha->at(j)-missurfalpha->at(j);
0502       float beta = idealsurfbeta->at(j)-missurfbeta->at(j);
0503       float gamma = idealsurfgamma->at(j)-missurfgamma->at(j);
0504 
0505       /// convert to millirad
0506       alpha *= 1000;
0507       beta *=1000;
0508       gamma *=1000;
0509       float idealsurfphi = 180/M_PI*atan2(idealsurfcentery->at(j), 
0510                           idealsurfcenterx->at(j));
0511       float missurfphi = 180/M_PI*atan2(missurfcentery->at(j),
0512                         missurfcenterx->at(j));
0513       h_surfphidiffvsphi[layer]->Fill(idealsurfphi, missurfphi-idealsurfphi);
0514       h_surfadiffvsphi[layer]->Fill(idealsurfphi, alpha);
0515       h_surfbdiffvsphi[layer]->Fill(idealsurfphi, beta);
0516       h_surfgdiffvsphi[layer]->Fill(idealsurfphi, gamma);
0517       h_surfadiffvsz[layer]->Fill(idealsurfcenterz->at(j)*10, alpha);
0518       h_surfbdiffvsz[layer]->Fill(idealsurfcenterz->at(j)*10, beta);
0519       h_surfgdiffvsz[layer]->Fill(idealsurfcenterz->at(j)*10, gamma);
0520 
0521       h_surfradiusdiffvsphi[layer]->Fill(idealsurfphi,
0522                          get_r(missurfcenterx->at(j),
0523                            missurfcentery->at(j))*10 -
0524                          get_r(idealsurfcenterx->at(j),
0525                            idealsurfcentery->at(j))*10);
0526       h_surfxdiffvsphi[layer]->Fill(idealsurfphi,
0527                     missurfcenterx->at(j)*10 - 
0528                     idealsurfcenterx->at(j)*10);
0529       h_surfydiffvsphi[layer]->Fill(idealsurfphi,
0530                     missurfcentery->at(j)*10 - 
0531                     idealsurfcentery->at(j)*10);
0532         
0533       h_surfzdiffvsphi[layer]->Fill(idealsurfphi,
0534                     missurfcenterz->at(j)*10 - 
0535                     idealsurfcenterz->at(j)*10);
0536       h_residualxclusr[layer]->Fill(clusvec.Perp(), xresidual);
0537       h_residualgxclusphi[layer]->Fill(clusphi, (clusgx->at(j) - stategx->at(j))*10);
0538       h_residualgyclusphi[layer]->Fill(clusphi, (clusgy->at(j) - stategy->at(j))*10);
0539       //std::cout << clusgz->at(j) << ", " << stategz->at(j) << std::endl;
0540       h_residualgzclusphi[layer]->Fill(clusphi, (clusgz->at(j) - stategz->at(j))*10);
0541         
0542       h_residualxclusphi[layer]->Fill(clusphi, xresidual);
0543       h_residualxclusz[layer]->Fill(cgz, xresidual);
0544       h_residualzclusr[layer]->Fill(clusvec.Perp(), zresidual);
0545       h_residualzclusphi[layer]->Fill(clusphi, zresidual);
0546       h_residualzclusz[layer]->Fill(cgz, zresidual);
0547       //h_residualxclusphiz[layer]->Fill(clusphi,cgz,xresidual);
0548       //h_residualzclusphiz[layer]->Fill(clusphi,cgz,zresidual);
0549 
0550       h_dxdxvsphi->Fill(clusphi, statelxglobdx);
0551       h_dxdyvsphi->Fill(clusphi, statelxglobdy);
0552       h_dxdzvsphi->Fill(clusphi, statelxglobdz);
0553       h_dxdalphavsphi->Fill(clusphi, statelxglobdalpha);
0554       h_dxdbetavsphi->Fill(clusphi, statelxglobdbeta);
0555       h_dxdgammavsphi->Fill(clusphi, statelxglobdgamma);
0556       h_dxdd0vsphi->Fill(clusphi,statelxlocderivd0->at(j));
0557       h_dxdz0vsphi->Fill(clusphi,statelxlocderivz0->at(j));
0558       h_dxdphivsphi->Fill(clusphi,statelxlocderivphi->at(j));
0559       h_dxdthetavsphi->Fill(clusphi,statelxlocderivtheta->at(j));
0560       h_dxdqopvsphi->Fill(clusphi,statelxlocderivqop->at(j));
0561 
0562       h_dzdxvsphi->Fill(clusphi, statelzglobdx);
0563       h_dzdyvsphi->Fill(clusphi, statelzglobdy);
0564       h_dzdzvsphi->Fill(clusphi, statelzglobdz);
0565       h_dzdalphavsphi->Fill(clusphi, statelzglobdalpha);
0566       h_dzdbetavsphi->Fill(clusphi, statelzglobdbeta);
0567       h_dzdgammavsphi->Fill(clusphi, statelzglobdgamma);
0568       h_dzdd0vsphi->Fill(clusphi,statelzlocderivd0->at(j));
0569       h_dzdz0vsphi->Fill(clusphi,statelzlocderivz0->at(j));
0570       h_dzdphivsphi->Fill(clusphi,statelzlocderivphi->at(j));
0571       h_dzdthetavsphi->Fill(clusphi,statelzlocderivtheta->at(j));
0572       h_dzdqopvsphi->Fill(clusphi,statelzlocderivqop->at(j));
0573 
0574       h_dxdxvseta->Fill(cluseta, statelxglobdx);
0575       h_dxdyvseta->Fill(cluseta, statelxglobdy);
0576       h_dxdzvseta->Fill(cluseta, statelxglobdz);
0577       h_dxdalphavseta->Fill(cluseta, statelxglobdalpha);
0578       h_dxdbetavseta->Fill(cluseta, statelxglobdbeta);
0579       h_dxdgammavseta->Fill(cluseta, statelxglobdgamma);
0580       h_dxdd0vseta->Fill(cluseta,statelxlocderivd0->at(j));
0581       h_dxdz0vseta->Fill(cluseta,statelxlocderivz0->at(j));
0582       h_dxdphivseta->Fill(cluseta,statelxlocderivphi->at(j));
0583       h_dxdthetavseta->Fill(cluseta,statelxlocderivtheta->at(j));
0584       h_dxdqopvseta->Fill(cluseta,statelxlocderivqop->at(j));
0585 
0586       h_dzdxvseta->Fill(cluseta, statelzglobdx);
0587       h_dzdyvseta->Fill(cluseta, statelzglobdy);
0588       h_dzdzvseta->Fill(cluseta, statelzglobdz);
0589       h_dzdalphavseta->Fill(cluseta, statelzglobdalpha);
0590       h_dzdbetavseta->Fill(cluseta, statelzglobdbeta);
0591       h_dzdgammavseta->Fill(cluseta, statelzglobdgamma);
0592       h_dzdd0vseta->Fill(cluseta,statelzlocderivd0->at(j));
0593       h_dzdz0vseta->Fill(cluseta,statelzlocderivz0->at(j));
0594       h_dzdphivseta->Fill(cluseta,statelzlocderivphi->at(j));
0595       h_dzdthetavseta->Fill(cluseta,statelzlocderivtheta->at(j));
0596       h_dzdqopvseta->Fill(cluseta,statelzlocderivqop->at(j));
0597 
0598       h_xresidualgdx->Fill(statelxglobdx,xresidual);
0599       h_xresidualgdy->Fill(statelxglobdy,xresidual);
0600       h_xresidualgdz->Fill(statelxglobdz,xresidual);
0601       h_xresidualdalpha->Fill(statelxglobdalpha,xresidual);
0602       h_xresidualdbeta->Fill(statelxglobdbeta,xresidual);
0603       h_xresidualdgamma->Fill(statelxglobdgamma,xresidual);
0604       h_xresidualdd0->Fill(statelxlocderivd0->at(j),xresidual);
0605       h_xresidualdz0->Fill(statelxlocderivz0->at(j),xresidual);
0606       h_xresidualdphi->Fill(statelxlocderivphi->at(j),xresidual);
0607       h_xresidualdtheta->Fill(statelxlocderivtheta->at(j),xresidual);
0608       h_xresidualdqop->Fill(statelxlocderivqop->at(j),xresidual);
0609       
0610       h_zresidualgdx->Fill(statelzglobdx,zresidual);
0611       h_zresidualgdy->Fill(statelzglobdy,zresidual);
0612       h_zresidualgdz->Fill(statelzglobdz,zresidual);
0613       h_zresidualdalpha->Fill(statelzglobdalpha,zresidual);
0614       h_zresidualdbeta->Fill(statelzglobdbeta,zresidual);
0615       h_zresidualdgamma->Fill(statelzglobdgamma,zresidual);
0616       h_zresidualdd0->Fill(statelzlocderivd0->at(j),zresidual);
0617       h_zresidualdz0->Fill(statelzlocderivz0->at(j),zresidual);
0618       h_zresidualdphi->Fill(statelzlocderivphi->at(j),zresidual);
0619       h_zresidualdtheta->Fill(statelzlocderivtheta->at(j),zresidual);
0620       h_zresidualdqop->Fill(statelzlocderivqop->at(j),zresidual);
0621       
0622       h_residuallayerx->Fill(xresidual, layer);
0623       h_residuallayerz->Fill(zresidual, layer);
0624       h_residualcluspulllayerx->Fill(xresidualcluspull, layer);
0625       h_residualcluspulllayerz->Fill(zresidualcluspull, layer);
0626       h_residualstatepulllayerx->Fill(xresidualstatepull, layer);
0627       h_residualstatepulllayerz->Fill(zresidualstatepull, layer);
0628         
0629       h_residualhitsetkeyx->Fill(xresidual, sensornum);
0630       h_residualhitsetkeyz->Fill(zresidual, sensornum);
0631       h_residualcluspullhitsetkeyx->Fill(xresidualcluspull, sensornum);
0632       h_residualcluspullhitsetkeyz->Fill(zresidualcluspull, sensornum);
0633       h_residualstatepullhitsetkeyx->Fill(xresidualstatepull, sensornum);
0634       h_residualstatepullhitsetkeyz->Fill(zresidualstatepull, sensornum);
0635           
0636     }
0637     }
0638   std::cout << "badent " << badent<<std::endl;
0639   for(const auto& [key, counts] : hitsetkey_numcounts_map)
0640     {
0641       std::cout << "hitsetkey " << key << " has " << counts << std::endl;
0642     }
0643 
0644   TCanvas *can1 = new TCanvas("can1","can1",300,300,1000,700);
0645   can1->Divide(3,2);
0646   can1->cd(1);
0647   h_xresidualdalpha->Draw();
0648   can1->cd(2);
0649   h_xresidualdbeta->Draw();
0650   can1->cd(3);
0651   h_xresidualdgamma->Draw();
0652   can1->cd(4);
0653   h_xresidualgdx->Draw();
0654   can1->cd(5);
0655   h_xresidualgdy->Draw();
0656   can1->cd(6);
0657   h_xresidualgdz->Draw();
0658 
0659   
0660   TCanvas *can2 = new TCanvas("can2","can2",300,300,1000,700);
0661   can2->Divide(3,2);
0662   can2->cd(1);
0663   h_xresidualdd0->Draw();
0664   can2->cd(2);
0665   h_xresidualdz0->Draw();
0666   can2->cd(3);
0667   h_xresidualdphi->Draw();
0668   can2->cd(4);
0669   h_xresidualdtheta->Draw();
0670   can2->cd(5);
0671   h_xresidualdqop->Draw();
0672   
0673   
0674   TCanvas *can3 = new TCanvas("can3","can3",300,300,1000,700);
0675   can3->Divide(3,2);
0676   can3->cd(1);
0677   h_zresidualdalpha->Draw();
0678   can3->cd(2);
0679   h_zresidualdbeta->Draw();
0680   can3->cd(3);
0681   h_zresidualdgamma->Draw();
0682   can3->cd(4);
0683   h_zresidualgdx->Draw();
0684   can3->cd(5);
0685   h_zresidualgdy->Draw();
0686   can3->cd(6);
0687   h_zresidualgdz->Draw();
0688 
0689   
0690   TCanvas *can4 = new TCanvas("can4","can4",300,300,1000,700);
0691   can4->Divide(3,2);
0692   can4->cd(1);
0693   h_zresidualdd0->Draw();
0694   can4->cd(2);
0695   h_zresidualdz0->Draw();
0696   can4->cd(3);
0697   h_zresidualdphi->Draw();
0698   can4->cd(4);
0699   h_zresidualdtheta->Draw();
0700   can4->cd(5);
0701   h_zresidualdqop->Draw();
0702 
0703   
0704   TCanvas *can5 = new TCanvas("can5","can5",300,300,1000,700);
0705   can5->Divide(3,2);
0706   can5->cd(1);
0707 
0708   h_dxdxvsphi->Draw();
0709   can5->cd(2);
0710   h_dxdyvsphi->Draw();
0711   can5->cd(3);
0712   h_dxdzvsphi->Draw();
0713   can5->cd(4);
0714   h_dxdalphavsphi->Draw();
0715   can5->cd(5);
0716   h_dxdbetavsphi->Draw();
0717   can5->cd(6);
0718   h_dxdgammavsphi->Draw();
0719   
0720   TCanvas *can6 = new TCanvas("can6","can6",300,300,1000,700);
0721   can6->Divide(3,2);
0722   can6->cd(1);
0723 
0724   h_dxdd0vsphi->Draw();
0725   can6->cd(2);
0726   h_dxdz0vsphi->Draw();
0727   can6->cd(3);
0728   h_dxdphivsphi->Draw();
0729   can6->cd(4);
0730   h_dxdthetavsphi->Draw();
0731   can6->cd(5);
0732   h_dxdqopvsphi->Draw();
0733   
0734   TCanvas *can7 = new TCanvas("can7","can7",300,300,1000,700);
0735   can7->Divide(3,2);
0736   can7->cd(1);
0737 
0738   h_dzdxvsphi->Draw();
0739   can7->cd(2);
0740   h_dzdyvsphi->Draw();
0741   can7->cd(3);
0742   h_dzdzvsphi->Draw();
0743   can7->cd(4);
0744   h_dzdalphavsphi->Draw();
0745   can7->cd(5);
0746   h_dzdbetavsphi->Draw();
0747   can7->cd(6);
0748   h_dzdgammavsphi->Draw();
0749   
0750   TCanvas *can8 = new TCanvas("can8","can8",300,300,1000,700);
0751   can8->Divide(3,2);
0752   can8->cd(1);
0753 
0754   h_dzdd0vsphi->Draw();
0755   can8->cd(2);
0756   h_dzdz0vsphi->Draw();
0757   can8->cd(3);
0758   h_dzdphivsphi->Draw();
0759   can8->cd(4);
0760   h_dzdthetavsphi->Draw();
0761   can8->cd(5);
0762   h_dzdqopvsphi->Draw();
0763 
0764   
0765   TCanvas *can9 = new TCanvas("can9","can9",300,300,1000,700);
0766   can9->Divide(3,2);
0767   can9->cd(1);
0768 
0769   h_dxdxvseta->Draw();
0770   can9->cd(2);
0771   h_dxdyvseta->Draw();
0772   can9->cd(3);
0773   h_dxdzvseta->Draw();
0774   can9->cd(4);
0775   h_dxdalphavseta->Draw();
0776   can9->cd(5);
0777   h_dxdbetavseta->Draw();
0778   can9->cd(6);
0779   h_dxdgammavseta->Draw();
0780 
0781   TCanvas *can10 = new TCanvas("can10","can10",300,300,1000,700);
0782   can10->Divide(3,2);
0783   can10->cd(1);
0784 
0785   h_dxdd0vseta->Draw();
0786   can10->cd(2);
0787   h_dxdz0vseta->Draw();
0788   can10->cd(3);
0789   h_dxdphivseta->Draw();
0790   can10->cd(4);
0791   h_dxdthetavseta->Draw();
0792   can10->cd(5);
0793   h_dxdqopvseta->Draw();
0794 
0795   TCanvas *can11 = new TCanvas("can11","can11",300,300,1000,700);
0796   can11->Divide(3,2);
0797   can11->cd(1);
0798 
0799   h_dzdxvseta->Draw();
0800   can11->cd(2);
0801   h_dzdyvseta->Draw();
0802   can11->cd(3);
0803   h_dzdzvseta->Draw();
0804   can11->cd(4);
0805   h_dzdalphavseta->Draw();
0806   can11->cd(5);
0807   h_dzdbetavseta->Draw();
0808   can11->cd(6);
0809   h_dzdgammavseta->Draw();
0810 
0811   TCanvas *can12 = new TCanvas("can12","can12",300,300,1000,700);
0812   can12->Divide(3,2);
0813   can12->cd(1);
0814 
0815   h_dzdd0vseta->Draw();
0816   can12->cd(2);
0817   h_dzdz0vseta->Draw();
0818   can12->cd(3);
0819   h_dzdphivseta->Draw();
0820   can12->cd(4);
0821   h_dzdthetavseta->Draw();
0822   can12->cd(5);
0823   h_dzdqopvseta->Draw();
0824   
0825   if(writer)
0826     {
0827   outfile->cd();
0828   h_lowcountsxy->Write();
0829   h_lowcountsrz->Write();
0830   h_residuallayerx->Write();
0831   h_residuallayerz->Write();
0832   h_residualcluspulllayerx->Write();
0833   h_residualcluspulllayerz->Write();
0834   h_residualstatepulllayerx->Write();
0835   h_residualstatepulllayerz->Write();
0836   h_sensorlayercounts->Write();
0837 
0838  h_residualhitsetkeyx->Write();
0839   h_residualhitsetkeyz->Write();
0840   h_residualcluspullhitsetkeyx->Write();
0841   h_residualcluspullhitsetkeyz->Write();
0842   h_residualstatepullhitsetkeyx->Write();
0843   h_residualstatepullhitsetkeyz->Write();
0844   
0845   h_xresidualgdx->Write();
0846   h_xresidualgdy->Write();
0847   h_xresidualgdz->Write();
0848   h_xresidualdalpha->Write();
0849   h_xresidualdbeta->Write();
0850   h_xresidualdgamma->Write();
0851   h_xresidualdd0->Write();
0852   h_xresidualdz0->Write();
0853   h_xresidualdphi->Write();
0854   h_xresidualdtheta->Write();
0855   h_xresidualdqop->Write();
0856 
0857   h_zresidualgdx->Write();
0858   h_zresidualgdy->Write();
0859   h_zresidualgdz->Write();
0860   h_zresidualdalpha->Write();
0861   h_zresidualdbeta->Write();
0862   h_zresidualdgamma->Write();
0863   h_zresidualdd0->Write();
0864   h_zresidualdz0->Write();
0865   h_zresidualdphi->Write();
0866   h_zresidualdtheta->Write();
0867   h_zresidualdqop->Write();
0868 
0869   h_dxdxvsphi->Write();
0870   h_dxdyvsphi->Write();
0871   h_dxdzvsphi->Write();
0872   h_dxdalphavsphi->Write();
0873   h_dxdbetavsphi->Write();
0874   h_dxdgammavsphi->Write();
0875   h_dxdd0vsphi->Write();
0876   h_dxdz0vsphi->Write();
0877   h_dxdphivsphi->Write();
0878   h_dxdthetavsphi->Write();
0879   h_dxdqopvsphi->Write();
0880   
0881   h_dzdxvsphi->Write();
0882   h_dzdyvsphi->Write();
0883   h_dzdzvsphi->Write();
0884   h_dzdalphavsphi->Write();
0885   h_dzdbetavsphi->Write();
0886   h_dzdgammavsphi->Write();
0887   h_dzdd0vsphi->Write();
0888   h_dzdz0vsphi->Write();
0889   h_dzdphivsphi->Write();
0890   h_dzdthetavsphi->Write();
0891   h_dzdqopvsphi->Write();
0892   
0893   h_dxdxvseta->Write();
0894   h_dxdyvseta->Write();
0895   h_dxdzvseta->Write();
0896   h_dxdalphavseta->Write();
0897   h_dxdbetavseta->Write();
0898   h_dxdgammavseta->Write();
0899   h_dxdd0vseta->Write();
0900   h_dxdz0vseta->Write();
0901   h_dxdphivseta->Write();
0902   h_dxdthetavseta->Write();
0903   h_dxdqopvseta->Write();
0904   
0905   h_dzdxvseta->Write();
0906   h_dzdyvseta->Write();
0907   h_dzdzvseta->Write();
0908   h_dzdalphavseta->Write();
0909   h_dzdbetavseta->Write();
0910   h_dzdgammavseta->Write();
0911   h_dzdd0vseta->Write();
0912   h_dzdz0vseta->Write();
0913   h_dzdphivseta->Write();
0914   h_dzdthetavseta->Write();
0915   h_dzdqopvseta->Write();
0916   
0917 
0918   for(int i=0; i<nlayers; i++)
0919     {
0920       h_residualxclusr[i]->Write();
0921       h_residualxclusz[i]->Write();
0922       h_residualgxclusphi[i]->Write();
0923       h_residualgyclusphi[i]->Write();
0924       h_residualgzclusphi[i]->Write();
0925       h_residualzclusr[i]->Write();
0926       h_residualzclusz[i]->Write();
0927       h_residualxclusphi[i]->Write();
0928       h_residualzclusphi[i]->Write();
0929       
0930       //h_residualxclusphiz[i]->Write();
0931       //h_residualzclusphiz[i]->Write();
0932       h_surfradiusdiffvsphi[i]->Write();
0933       h_surfxdiffvsphi[i]->Write();
0934       h_surfphidiffvsphi[i]->Write();
0935       h_surfydiffvsphi[i]->Write();
0936       h_surfzdiffvsphi[i]->Write();
0937       h_surfadiffvsphi[i]->Write();
0938       h_surfbdiffvsphi[i]->Write();
0939       h_surfgdiffvsphi[i]->Write();
0940 
0941       h_surfadiffvsz[i]->Write();
0942       h_surfbdiffvsz[i]->Write();
0943       h_surfgdiffvsz[i]->Write();
0944     }
0945 
0946   outfile->Write();
0947   outfile->Close();
0948 
0949   
0950     }
0951 
0952   
0953 
0954 }