CMS 3D CMS Logo

SiStripRecHitsValid.cc

Go to the documentation of this file.
00001 // File: SiStripRecHitsValid.cc
00002 // Description:  see SiStripRecHitsValid.h
00003 // Author:  P. Azzi
00004 // Creation Date:  PA May 2006 Initial version.
00005 //
00006 //--------------------------------------------
00007 #include "Validation/TrackerRecHits/interface/SiStripRecHitsValid.h"
00008 #include "SimTracker/TrackerHitAssociation/interface/TrackerHitAssociator.h" 
00009 
00010 //needed for the geometry: 
00011 #include "DataFormats/DetId/interface/DetId.h" 
00012 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h" 
00013 #include "DataFormats/SiStripDetId/interface/TECDetId.h" 
00014 #include "DataFormats/SiStripDetId/interface/TIBDetId.h" 
00015 #include "DataFormats/SiStripDetId/interface/TIDDetId.h"
00016 #include "DataFormats/SiStripDetId/interface/TOBDetId.h" 
00017 #include "DataFormats/GeometryVector/interface/LocalPoint.h"
00018 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00019 
00020 
00021 //--- for RecHit
00022 #include "DataFormats/SiStripCluster/interface/SiStripCluster.h" 
00023 #include "DataFormats/SiStripCluster/interface/SiStripClusterCollection.h" 
00024 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2DCollection.h" 
00025 #include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2DCollection.h" 
00026 #include "DataFormats/Common/interface/OwnVector.h" 
00027 #include "DQMServices/Core/interface/DQMStore.h"
00028 
00029 using namespace std;
00030 using namespace edm;
00031 
00032 //Constructor
00033 SiStripRecHitsValid::SiStripRecHitsValid(const ParameterSet& ps) :
00034   dbe_(0),      
00035   conf_(ps),
00036   matchedRecHits_( ps.getParameter<edm::InputTag>("matchedRecHits") ),
00037   rphiRecHits_( ps.getParameter<edm::InputTag>("rphiRecHits") ),
00038   stereoRecHits_( ps.getParameter<edm::InputTag>("stereoRecHits") ) {
00039 
00040   outputFile_ = ps.getUntrackedParameter<string>("outputFile", "sistriprechitshisto.root");
00041   dbe_ = Service<DQMStore>().operator->();
00042   //  dbe_->showDirStructure();
00043   dbe_->setCurrentFolder("TrackerRecHitsV/TrackerRecHits/Strip/SISTRIP");
00044 
00045   meNumTotRphi = dbe_->book1D("NumTotRphi","Num of RecHits rphi",100, 0, 10000);
00046   meNumTotSas = dbe_->book1D("NumTotSas","Num of RecHits sas",100, 0, 10000);
00047   meNumTotMatched = dbe_->book1D("NumTotMatched","Num of RecHits rmatched",100, 0, 10000);
00048 
00049   dbe_->setCurrentFolder("TrackerRecHitsV/TrackerRecHits/Strip/TIB");
00050   meNumRphiTIB = dbe_->book1D("NumRphiTIB","Num of RecHits rphi", 100, 0, 1000.);
00051   meNumSasTIB = dbe_->book1D("NumSasTIB","Num of RecHits sas", 100, 0, 1000.);
00052   meNumMatchedTIB = dbe_->book1D("NumMatchedTIB","Num of RecHits matched", 100, 0, 1000.);
00053 
00054   //one histo per Layer rphi hits
00055   for(int i = 0 ;i<4 ; i++) {
00056     Char_t histo[200];
00057     sprintf(histo,"Nstp_rphi_layer%dtib",i+1);
00058     meNstpRphiTIB[i] = dbe_->book1D(histo,"RecHit Cluster Size",10,0.5,10.5);  
00059     sprintf(histo,"Adc_rphi_layer%dtib",i+1);
00060     meAdcRphiTIB[i] = dbe_->book1D(histo,"RecHit Cluster Charge",100,0.,300.);  
00061     sprintf(histo,"Posx_rphi_layer%dtib",i+1);
00062     mePosxRphiTIB[i] = dbe_->book1D(histo,"RecHit x coord.",100,-6.0,+6.0);  
00063     sprintf(histo,"Errx_rphi_layer%dtib",i+1);
00064     meErrxRphiTIB[i] = dbe_->book1D(histo,"RecHit err(x) coord.",100,0,0.01); //<error>~20micron  
00065     sprintf(histo,"Res_rphi_layer%dtib",i+1);
00066     meResRphiTIB[i] = dbe_->book1D(histo,"RecHit Residual",100,-0.02,+0.02);  
00067     sprintf(histo,"Pull_LF_rphi_layer%dtib",i+1);
00068     mePullLFRphiTIB[i] = dbe_->book1D(histo,"Pull",100,-5.,5.);  
00069     sprintf(histo,"Pull_MF_rphi_layer%dtib",i+1);
00070     mePullMFRphiTIB[i] = dbe_->book1D(histo,"Pull",100,-5.,5.);  
00071     sprintf(histo,"Chi2_rphi_layer%dtib",i+1);
00072     meChi2RphiTIB[i] = dbe_->book1D(histo,"RecHit Chi2 test",100,0., 50);  
00073   }
00074 
00075   //one histo per Layer stereo and matched hits
00076   for(int i = 0 ;i<2 ; i++) {
00077     Char_t histo[200];
00078     sprintf(histo,"Nstp_sas_layer%dtib",i+1);
00079     meNstpSasTIB[i] = dbe_->book1D(histo,"RecHit Cluster Size",10,0.5,10.5);  
00080     sprintf(histo,"Adc_sas_layer%dtib",i+1);
00081     meAdcSasTIB[i] = dbe_->book1D(histo,"RecHit Cluster Charge",100,0.,300.);  
00082     sprintf(histo,"Posx_sas_layer%dtib",i+1);
00083     mePosxSasTIB[i] = dbe_->book1D(histo,"RecHit x coord.",100,-6.0,+6.0);  
00084     sprintf(histo,"Errx_sas_layer%dtib",i+1);
00085     meErrxSasTIB[i] = dbe_->book1D(histo,"RecHit err(x) coord.",100,0.,0.01);  
00086     sprintf(histo,"Res_sas_layer%dtib",i+1);
00087     meResSasTIB[i] = dbe_->book1D(histo,"RecHit Residual",100,-0.02,+0.02);  
00088     sprintf(histo,"Pull_LF_sas_layer%dtib",i+1);
00089     mePullLFSasTIB[i] = dbe_->book1D(histo,"Pull",100,-4.,4.);  
00090     sprintf(histo,"Pull_MF_sas_layer%dtib",i+1);
00091     mePullMFSasTIB[i] = dbe_->book1D(histo,"Pull",100,-4.,4.);  
00092     sprintf(histo,"Chi2_sas_layer%dtib",i+1);
00093     meChi2SasTIB[i] = dbe_->book1D(histo,"RecHit Chi2 test",100,0., 50);  
00094 
00095     sprintf(histo,"Posx_matched_layer%dtib",i+1);
00096     mePosxMatchedTIB[i] = dbe_->book1D(histo,"RecHit x coord.",100,-6.0, +6.0);  
00097     sprintf(histo,"Posy_matched_layer%dtib",i+1);
00098     mePosyMatchedTIB[i] = dbe_->book1D(histo,"RecHit y coord.",100,-6.0, +6.0);  
00099     sprintf(histo,"Errx_matched_layer%dtib",i+1);
00100     meErrxMatchedTIB[i] = dbe_->book1D(histo,"RecHit err(x) coord.",100,0., 0.01);  
00101     sprintf(histo,"Erry_matched_layer%dtib",i+1);
00102     meErryMatchedTIB[i] = dbe_->book1D(histo,"RecHit err(y) coord.",100,0., 0.05);  
00103     sprintf(histo,"Resx_matched_layer%dtib",i+1);
00104     meResxMatchedTIB[i] = dbe_->book1D(histo,"RecHit Res(x) coord.",100,-0.02, +0.02);  
00105     sprintf(histo,"Resy_matched_layer%dtib",i+1);
00106     meResyMatchedTIB[i] = dbe_->book1D(histo,"RecHit Res(y) coord.",100,-1., +1.);  
00107     sprintf(histo,"Chi2_matched_layer%dtib",i+1);
00108     meChi2MatchedTIB[i] = dbe_->book1D(histo,"RecHit Chi2 test",100,0., 50);  
00109   }
00110 
00111   dbe_->setCurrentFolder("TrackerRecHitsV/TrackerRecHits/Strip/TOB");
00112   meNumRphiTOB = dbe_->book1D("NumRphiTOB","Num of RecHits rphi", 100, 0, 1000.);
00113   meNumSasTOB = dbe_->book1D("NumSasTOB","Num of RecHits sas", 100, 0, 1000.);
00114   meNumMatchedTOB = dbe_->book1D("NumMatchedTOB","Num of RecHits matched", 100, 0, 1000.);
00115   //one histo per Layer rphi hits
00116   for(int i = 0 ;i<6 ; i++) {
00117     Char_t histo[200];
00118     sprintf(histo,"Nstp_rphi_layer%dtob",i+1);
00119     meNstpRphiTOB[i] = dbe_->book1D(histo,"RecHit Cluster Size",10,0.5,10.5);  
00120     sprintf(histo,"Adc_rphi_layer%dtob",i+1);
00121     meAdcRphiTOB[i] = dbe_->book1D(histo,"RecHit Cluster Charge",100,0.,300.);  
00122     sprintf(histo,"Posx_rphi_layer%dtob",i+1);
00123     mePosxRphiTOB[i] = dbe_->book1D(histo,"RecHit x coord.",100,-6.0,+6.0);  
00124     sprintf(histo,"Errx_rphi_layer%dtob",i+1);
00125     meErrxRphiTOB[i] = dbe_->book1D(histo,"RecHit err(x) coord.",100,0,0.01);  
00126     sprintf(histo,"Res_rphi_layer%dtob",i+1);
00127     meResRphiTOB[i] = dbe_->book1D(histo,"RecHit Residual",100,-0.02,+0.02);  
00128     sprintf(histo,"Pull_LF_rphi_layer%dtob",i+1);
00129     mePullLFRphiTOB[i] = dbe_->book1D(histo,"Pull",100,-5.,5.);  
00130     sprintf(histo,"Pull_MF_rphi_layer%dtob",i+1);
00131     mePullMFRphiTOB[i] = dbe_->book1D(histo,"Pull",100,-5.,5.);  
00132     sprintf(histo,"Chi2_rphi_layer%dtob",i+1);
00133     meChi2RphiTOB[i] = dbe_->book1D(histo,"RecHit Chi2 test",100,0., 50);  
00134   }
00135 
00136   //one histo per Layer stereo and matched hits
00137   for(int i = 0 ;i<2 ; i++) {
00138     Char_t histo[200];
00139     sprintf(histo,"Nstp_sas_layer%dtob",i+1);
00140     meNstpSasTOB[i] = dbe_->book1D(histo,"RecHit Cluster Size",10,0.5,10.5);  
00141     sprintf(histo,"Adc_sas_layer%dtob",i+1);
00142     meAdcSasTOB[i] = dbe_->book1D(histo,"RecHit Cluster Charge",100,0.,300.);  
00143     sprintf(histo,"Posx_sas_layer%dtob",i+1);
00144     mePosxSasTOB[i] = dbe_->book1D(histo,"RecHit x coord.",100,-6.0,+6.0);  
00145     sprintf(histo,"Errx_sas_layer%dtob",i+1);
00146     meErrxSasTOB[i] = dbe_->book1D(histo,"RecHit err(x) coord.",100,0.,0.01);  
00147     sprintf(histo,"Res_sas_layer%dtob",i+1);
00148     meResSasTOB[i] = dbe_->book1D(histo,"RecHit Residual",100,-0.02,+0.02);  
00149     sprintf(histo,"Pull_LF_sas_layer%dtob",i+1);
00150     mePullLFSasTOB[i] = dbe_->book1D(histo,"Pull",100,-5.,5.);  
00151     sprintf(histo,"Pull_MF_sas_layer%dtob",i+1);
00152     mePullMFSasTOB[i] = dbe_->book1D(histo,"Pull",100,-5.,5.);  
00153     sprintf(histo,"Chi2_sas_layer%dtob",i+1);
00154     meChi2SasTOB[i] = dbe_->book1D(histo,"RecHit Chi2 test",100,0., 50);  
00155 
00156     sprintf(histo,"Posx_matched_layer%dtob",i+1);
00157     mePosxMatchedTOB[i] = dbe_->book1D(histo,"RecHit x coord.",100,-6.0, +6.0);  
00158     sprintf(histo,"Posy_matched_layer%dtob",i+1);
00159     mePosyMatchedTOB[i] = dbe_->book1D(histo,"RecHit y coord.",100,-10.0, +10.0);  
00160     sprintf(histo,"Errx_matched_layer%dtob",i+1);
00161     meErrxMatchedTOB[i] = dbe_->book1D(histo,"RecHit err(x) coord.",100,0., 0.01);  
00162     sprintf(histo,"Erry_matched_layer%dtob",i+1);
00163     meErryMatchedTOB[i] = dbe_->book1D(histo,"RecHit err(y) coord.",100,0., 0.1);  
00164     sprintf(histo,"Resx_matched_layer%dtob",i+1);
00165     meResxMatchedTOB[i] = dbe_->book1D(histo,"RecHit Res(x) coord.",100,-0.02, +0.02);  
00166     sprintf(histo,"Resy_matched_layer%dtob",i+1);
00167     meResyMatchedTOB[i] = dbe_->book1D(histo,"RecHit Res(y) coord.",100,-1., +1.);  
00168     sprintf(histo,"Chi2_matched_layer%dtob",i+1);
00169     meChi2MatchedTOB[i] = dbe_->book1D(histo,"RecHit Chi2 test",100,0., 50);  
00170   }
00171 
00172   dbe_->setCurrentFolder("TrackerRecHitsV/TrackerRecHits/Strip/TID");
00173   meNumRphiTID = dbe_->book1D("NumRphiTID","Num of RecHits rphi", 100, 0, 1000.);
00174   meNumSasTID = dbe_->book1D("NumSasTID","Num of RecHits sas", 100, 0, 1000.);
00175   meNumMatchedTID = dbe_->book1D("NumMatchedTID","Num of RecHits matched", 100, 0, 1000.);
00176 
00177   //one histo per Ring rphi hits: 3 rings, 6 disks, 2 inner rings are glued 
00178   for(int i = 0 ;i<3 ; i++) {
00179     Char_t histo[200];
00180     sprintf(histo,"Nstp_rphi_layer%dtid",i+1);
00181     meNstpRphiTID[i] = dbe_->book1D(histo,"RecHit Cluster Size",10,0.5,10.5);  
00182     sprintf(histo,"Adc_rphi_layer%dtid",i+1);
00183     meAdcRphiTID[i] = dbe_->book1D(histo,"RecHit Cluster Charge",100,0.,300.);  
00184     sprintf(histo,"Posx_rphi_layer%dtid",i+1);
00185     mePosxRphiTID[i] = dbe_->book1D(histo,"RecHit x coord.",100,-6.0,+6.0);  
00186     sprintf(histo,"Errx_rphi_layer%dtid",i+1);
00187     meErrxRphiTID[i] = dbe_->book1D(histo,"RecHit err(x) coord.",100,0,0.5);  
00188     sprintf(histo,"Res_rphi_layer%dtid",i+1);
00189     meResRphiTID[i] = dbe_->book1D(histo,"RecHit Residual",100,-0.5,+0.5);  
00190     sprintf(histo,"Pull_LF_rphi_layer%dtid",i+1);
00191     mePullLFRphiTID[i] = dbe_->book1D(histo,"Pull",100,-5.,5.);  
00192     sprintf(histo,"Pull_MF_rphi_layer%dtid",i+1);
00193     mePullMFRphiTID[i] = dbe_->book1D(histo,"Pull",100,-5.,5.);  
00194     sprintf(histo,"Chi2_rphi_layer%dtid",i+1);
00195     meChi2RphiTID[i] = dbe_->book1D(histo,"RecHit Chi2 test",100,0., 50);  
00196   }
00197 
00198   //one histo per Ring stereo and matched hits
00199   for(int i = 0 ;i<2 ; i++) {
00200     Char_t histo[200];
00201     sprintf(histo,"Nstp_sas_layer%dtid",i+1);
00202     meNstpSasTID[i] = dbe_->book1D(histo,"RecHit Cluster Size",10,0.5,10.5);  
00203     sprintf(histo,"Adc_sas_layer%dtid",i+1);
00204     meAdcSasTID[i] = dbe_->book1D(histo,"RecHit Cluster Charge",100,0.,300.);  
00205     sprintf(histo,"Posx_sas_layer%dtid",i+1);
00206     mePosxSasTID[i] = dbe_->book1D(histo,"RecHit x coord.",100,-6.0,+6.0);  
00207     sprintf(histo,"Errx_sas_layer%dtid",i+1);
00208     meErrxSasTID[i] = dbe_->book1D(histo,"RecHit err(x) coord.",100,0.,0.5);  
00209     sprintf(histo,"Res_sas_layer%dtid",i+1);
00210     meResSasTID[i] = dbe_->book1D(histo,"RecHit Residual",100,-0.5,+0.5);  
00211     sprintf(histo,"Pull_LF_sas_layer%dtid",i+1);
00212     mePullLFSasTID[i] = dbe_->book1D(histo,"Pull",100,-5.,5.);  
00213     sprintf(histo,"Pull_MF_sas_layer%dtid",i+1);
00214     mePullMFSasTID[i] = dbe_->book1D(histo,"Pull",100,-5.,5.);  
00215     sprintf(histo,"Chi2_sas_layer%dtid",i+1);
00216     meChi2SasTID[i] = dbe_->book1D(histo,"RecHit Chi2 test",100,0., 50);  
00217 
00218     sprintf(histo,"Posx_matched_layer%dtid",i+1);
00219     mePosxMatchedTID[i] = dbe_->book1D(histo,"RecHit x coord.",100,-6.0, +6.0);  
00220     sprintf(histo,"Posy_matched_layer%dtid",i+1);
00221     mePosyMatchedTID[i] = dbe_->book1D(histo,"RecHit y coord.",100,-6.0, +6.0);  
00222     sprintf(histo,"Errx_matched_layer%dtid",i+1);
00223     meErrxMatchedTID[i] = dbe_->book1D(histo,"RecHit err(x) coord.",100,0., 0.05);  
00224     sprintf(histo,"Erry_matched_layer%dtid",i+1);
00225     meErryMatchedTID[i] = dbe_->book1D(histo,"RecHit err(y) coord.",100,0., 0.1);  
00226     sprintf(histo,"Resx_matched_layer%dtid",i+1);
00227     meResxMatchedTID[i] = dbe_->book1D(histo,"RecHit Res(x) coord.",100,-0.2, +0.2);  
00228     sprintf(histo,"Resy_matched_layer%dtid",i+1);
00229     meResyMatchedTID[i] = dbe_->book1D(histo,"RecHit Res(y) coord.",100,-1., +1.);  
00230     sprintf(histo,"Chi2_matched_layer%dtid",i+1);
00231     meChi2MatchedTID[i] = dbe_->book1D(histo,"RecHit Chi2 test",100,0., 50);  
00232   }
00233 
00234   dbe_->setCurrentFolder("TrackerRecHitsV/TrackerRecHits/Strip/TEC");
00235   meNumRphiTEC = dbe_->book1D("NumRphiTEC","Num of RecHits rphi", 100, 0, 1000.);
00236   meNumSasTEC = dbe_->book1D("NumSasTEC","Num of RecHits sas", 100, 0, 1000.);
00237   meNumMatchedTEC = dbe_->book1D("NumMatchedTEC","Num of RecHits matched", 100, 0, 1000.);
00238 
00239   //one histo per Ring rphi hits: 7 rings, 18 disks. Innermost 3 rings are same as TID above.  
00240   for(int i = 0 ;i<7 ; i++) {
00241     Char_t histo[200];
00242     sprintf(histo,"Nstp_rphi_layer%dtec",i+1);
00243     meNstpRphiTEC[i] = dbe_->book1D(histo,"RecHit Cluster Size",10,0.5,10.5);  
00244     sprintf(histo,"Adc_rphi_layer%dtec",i+1);
00245     meAdcRphiTEC[i] = dbe_->book1D(histo,"RecHit Cluster Charge",100,0.,300.);  
00246     sprintf(histo,"Posx_rphi_layer%dtec",i+1);
00247     mePosxRphiTEC[i] = dbe_->book1D(histo,"RecHit x coord.",100,-6.0,+6.0);  
00248     sprintf(histo,"Errx_rphi_layer%dtec",i+1);
00249     meErrxRphiTEC[i] = dbe_->book1D(histo,"RecHit err(x) coord.",100,0,0.5);  
00250     sprintf(histo,"Res_rphi_layer%dtec",i+1);
00251     meResRphiTEC[i] = dbe_->book1D(histo,"RecHit Residual",100,-0.5,+0.5);  
00252     sprintf(histo,"Pull_LF_rphi_layer%dtec",i+1);
00253     mePullLFRphiTEC[i] = dbe_->book1D(histo,"Pull",100,-5.,5.);  
00254     sprintf(histo,"Pull_MF_rphi_layer%dtec",i+1);
00255     mePullMFRphiTEC[i] = dbe_->book1D(histo,"Pull",100,-5.,5.);  
00256     sprintf(histo,"Chi2_rphi_layer%dtec",i+1);
00257     meChi2RphiTEC[i] = dbe_->book1D(histo,"RecHit Chi2 test",100,0., 50);  
00258   }
00259 
00260   //one histo per Layer stereo and matched hits: rings 1,2,5 are double sided
00261   for(int i = 0 ;i<5 ; i++) {
00262     if(i == 0 || i == 1 || i == 4) {
00263       Char_t histo[200];
00264       sprintf(histo,"Nstp_sas_layer%dtec",i+1);
00265       meNstpSasTEC[i] = dbe_->book1D(histo,"RecHit Cluster Size",10,0.5,10.5);  
00266       sprintf(histo,"Adc_sas_layer%dtec",i+1);
00267       meAdcSasTEC[i] = dbe_->book1D(histo,"RecHit Cluster Charge",100,0.,300.);  
00268       sprintf(histo,"Posx_sas_layer%dtec",i+1);
00269       mePosxSasTEC[i] = dbe_->book1D(histo,"RecHit x coord.",100,-6.0,+6.0);  
00270       sprintf(histo,"Errx_sas_layer%dtec",i+1);
00271       meErrxSasTEC[i] = dbe_->book1D(histo,"RecHit err(x) coord.",100,0.,0.5);  
00272       sprintf(histo,"Res_sas_layer%dtec",i+1);
00273       meResSasTEC[i] = dbe_->book1D(histo,"RecHit Residual",100,-0.5,+0.5);  
00274       sprintf(histo,"Pull_LF_sas_layer%dtec",i+1);
00275       mePullLFSasTEC[i] = dbe_->book1D(histo,"Pull",100,-5.,5.);
00276       sprintf(histo,"Pull_MF_sas_layer%dtec",i+1);
00277       mePullMFSasTEC[i] = dbe_->book1D(histo,"Pull",100,-5.,5.);
00278       sprintf(histo,"Chi2_sas_layer%dtec",i+1);
00279       meChi2SasTEC[i] = dbe_->book1D(histo,"RecHit Chi2 test",100,0., 50);  
00280       
00281       sprintf(histo,"Posx_matched_layer%dtec",i+1);
00282       mePosxMatchedTEC[i] = dbe_->book1D(histo,"RecHit x coord.",100,-6.0, +6.0);  
00283       sprintf(histo,"Posy_matched_layer%dtec",i+1);
00284       mePosyMatchedTEC[i] = dbe_->book1D(histo,"RecHit y coord.",100,-8.0, +8.0);  
00285       sprintf(histo,"Errx_matched_layer%dtec",i+1);
00286       meErrxMatchedTEC[i] = dbe_->book1D(histo,"RecHit err(x) coord.",100,0., 0.05);  
00287       sprintf(histo,"Erry_matched_layer%dtec",i+1);
00288       meErryMatchedTEC[i] = dbe_->book1D(histo,"RecHit err(y) coord.",100,0., 0.1);  
00289       sprintf(histo,"Resx_matched_layer%dtec",i+1);
00290       meResxMatchedTEC[i] = dbe_->book1D(histo,"RecHit Res(x) coord.",100,-0.2, +0.2);  
00291       sprintf(histo,"Resy_matched_layer%dtec",i+1);
00292       meResyMatchedTEC[i] = dbe_->book1D(histo,"RecHit Res(y) coord.",100,-1., +1.);  
00293       sprintf(histo,"Chi2_matched_layer%dtec",i+1);
00294       meChi2MatchedTEC[i] = dbe_->book1D(histo,"RecHit Chi2 test",100,0., 50);  
00295     }
00296   }
00297 }
00298 
00299 
00300 SiStripRecHitsValid::~SiStripRecHitsValid(){
00301  //if ( outputFile_.size() != 0 && dbe_ ) dbe_->save(outputFile_);
00302 }
00303 
00304 void SiStripRecHitsValid::beginJob(const EventSetup& c){
00305 
00306 }
00307 
00308 void SiStripRecHitsValid::endJob() {
00309  if ( outputFile_.size() != 0 && dbe_ ) dbe_->save(outputFile_);
00310 }
00311 
00312 
00313 void SiStripRecHitsValid::analyze(const edm::Event& e, const edm::EventSetup& es) {
00314 
00315   LogInfo("EventInfo") << " Run = " << e.id().run() << " Event = " << e.id().event();  
00316   //cout  << " Run = " << e.id().run() << " Event = " << e.id().event() << endl;  
00317   
00318   //--- get RecHits
00319   
00320   std::string rechitProducer = "SiStripRecHits2D";
00321   
00322   // Step A: Get Inputs 
00323   edm::Handle<SiStripMatchedRecHit2DCollection> rechitsmatched;
00324   edm::Handle<SiStripRecHit2DCollection> rechitsrphi;
00325   edm::Handle<SiStripRecHit2DCollection> rechitsstereo;
00326   e.getByLabel(matchedRecHits_, rechitsmatched);
00327   e.getByLabel(rphiRecHits_, rechitsrphi);
00328   e.getByLabel(stereoRecHits_, rechitsstereo);
00329 
00330   int numrechitrphi   =0;
00331   int numrechitsas    =0;
00332   int numrechitmatched=0;
00333 
00334   int totTibnumrechitrphi=0;
00335   int totTibnumrechitsas=0;
00336   int totTibnumrechitmatched=0;
00337   int totTobnumrechitrphi=0;
00338   int totTobnumrechitsas=0;
00339   int totTobnumrechitmatched=0;
00340   int totTidnumrechitrphi=0;
00341   int totTidnumrechitsas=0;
00342   int totTidnumrechitmatched=0;
00343   int totTecnumrechitrphi=0;
00344   int totTecnumrechitsas=0;
00345   int totTecnumrechitmatched=0;
00346   int totrechitrphi =0;
00347   int totrechitsas =0;
00348   int totrechitmatched =0;
00349   
00350   TrackerHitAssociator associate(e, conf_);
00351   
00352   edm::ESHandle<TrackerGeometry> pDD;
00353   es.get<TrackerDigiGeometryRecord> ().get (pDD);
00354   const TrackerGeometry &tracker(*pDD);
00355   //  std::vector<DetId> rphidetIDs = rechitsrphi->ids();
00356   std::vector<DetId> stereodetIDs = rechitsstereo->ids();
00357   std::vector<DetId> matcheddetIDs = rechitsmatched->ids();
00358   std::vector<DetId> IDs=rechitsrphi->ids();
00359   IDs.insert(IDs.end(),stereodetIDs.begin(),stereodetIDs.end());
00360   IDs.insert(IDs.end(),matcheddetIDs.begin(),matcheddetIDs.end());
00361   // loop over detunits
00362   //  for(TrackerGeometry::DetContainer::const_iterator it = pDD->dets().begin(); it != pDD->dets().end(); it++){
00363   for(std::vector<DetId>::const_iterator it = IDs.begin(); it != IDs.end(); ++it ){//loop on rphi detector with hits
00364     uint32_t myid=((*it).rawId());       
00365     DetId detid = ((*it));
00366     
00367     // initialize here
00368     for(int i=0; i<MAXHIT; i++){
00369       rechitrphix[i] =0;
00370       rechitrphierrx[i] =0;
00371       rechitrphiy[i] =0;
00372       rechitrphiz[i] =0;
00373       rechitsasx[i] =0;
00374       rechitsaserrx[i] =0;
00375       rechitsasy[i] =0;
00376       rechitsasz[i] =0;
00377       clusizrphi[i] =0;
00378       clusizsas[i] =0;
00379       cluchgrphi[i] =0;
00380       cluchgsas[i] =0;
00381       rechitrphires[i]=-999.;
00382       rechitsasres[i]=-999.;
00383       rechitrphipullMF[i]=-999.;
00384       rechitsaspullMF[i]=-999.;
00385       chi2rphi[i] =0;
00386       chi2sas[i]=0;
00387       rechitmatchedx[i] =0;
00388       rechitmatchedy[i] =0;
00389       rechitmatchedz[i] =0;
00390       rechitmatchederrxx[i] =0;
00391       rechitmatchederrxy[i] =0;
00392       rechitmatchederryy[i] =0;
00393       rechitmatchedresx[i]=-999;
00394       rechitmatchedresy[i]=-999;
00395       chi2matched[i]=0;
00396     }
00397     
00398     numrechitrphi =0;
00399     //loop over rechits-rphi in the same subdetector
00400     SiStripRecHit2DCollection::range          rechitrphiRange = rechitsrphi->get(detid);
00401     SiStripRecHit2DCollection::const_iterator rechitrphiRangeIteratorBegin = rechitrphiRange.first;
00402     SiStripRecHit2DCollection::const_iterator rechitrphiRangeIteratorEnd   = rechitrphiRange.second;
00403     SiStripRecHit2DCollection::const_iterator iterrphi=rechitrphiRangeIteratorBegin;
00404     
00405     numrechitrphi = rechitrphiRangeIteratorEnd - rechitrphiRangeIteratorBegin;   
00406          
00407 
00408     int i=0;
00409     int i2=0;
00410 
00411     if(numrechitrphi > 0 ){
00412       totrechitrphi+=numrechitrphi;
00413       for(iterrphi=rechitrphiRangeIteratorBegin; iterrphi!=rechitrphiRangeIteratorEnd;++iterrphi){
00414         const GeomDetUnit *  det = tracker.idToDetUnit(detid);
00415         const StripGeomDetUnit * stripdet=(const StripGeomDetUnit*)(det);
00416         const StripTopology &topol=(StripTopology&)stripdet->topology();
00417         SiStripRecHit2D const rechit=*iterrphi;
00418         LocalPoint position=rechit.localPosition();
00419         LocalError error=rechit.localPositionError();
00420         MeasurementPoint Mposition;
00421         MeasurementError Merror;
00422         Mposition = topol.measurementPosition(position);
00423         Merror = topol.measurementError(position,error);
00424         SiStripRecHit2D::ClusterRef clust=rechit.cluster();
00425         int clusiz=0;
00426         int totcharge=0;
00427         clusiz = clust->amplitudes().size();
00428         const std::vector<uint8_t> amplitudes=clust->amplitudes();
00429           for(size_t ia=0; ia<amplitudes.size();ia++){
00430             totcharge+=amplitudes[ia];
00431           }
00432         rechitrphix[i] = position.x();
00433         rechitrphiy[i] = position.y();
00434         rechitrphiz[i] = position.z();
00435         rechitrphierrx[i] = error.xx();
00436         clusizrphi[i] = clusiz;
00437         cluchgrphi[i] = totcharge;
00438 
00439         matched.clear();
00440         matched = associate.associateHit(rechit);
00441         float mindist = 999999;
00442         float dist = 999999;
00443         PSimHit closest;
00444         if(!matched.empty()){
00445           for(vector<PSimHit>::const_iterator m=matched.begin(); m<matched.end(); m++){
00446             dist = fabs(rechitrphix[i] - (*m).localPosition().x());
00447             if(dist<mindist){
00448               mindist = dist;
00449               closest = (*m);
00450             }
00451             rechitrphires[i] = rechitrphix[i] - closest.localPosition().x();
00452           }  
00453           rechitrphipullMF[i] = (Mposition.x() - (topol.measurementPosition(closest.localPosition())).x())/sqrt(Merror.uu());
00454 
00455           //chi2test compare rechit errors with the simhit position ( using null matrix for the simhit). 
00456           //Can spot problems in the geometry better than a simple residual. (thanks to BorisM)
00457           AlgebraicVector rhparameters = rechit.parameters();
00458           AlgebraicVector shparameters(2);
00459           shparameters[0] = closest.localPosition().x();
00460           shparameters[1] = closest.localPosition().y();
00461           AlgebraicVector r(rhparameters - shparameters);
00462           AlgebraicSymMatrix R  = rechit.parametersError();
00463           int ierr; 
00464           R.invert(ierr); // if (ierr != 0) throw exception;
00465           double est = R.similarity(r);
00466           //      std::cout << " ====== Chi2 test rphi hits ====== " << std::endl;
00467           //      std::cout << "RecHit param. = " << rhparameters << std::endl;
00468           //      std::cout << "RecHit errors = " << R << std::endl;
00469           //      std::cout << "SimHit param. = " << shparameters << std::endl;
00470           //      std::cout << " chi2  = " << est << std::endl;
00471           //      std::cout << "DEBUG BORIS,filling chi2rphi[i],i: " << i << std::endl;
00472           chi2rphi[i2] = est;
00473           i2++;
00474         }
00475         i++;
00476       }
00477     }
00478     
00479     //loop over rechits-sas in the same subdetector
00480     int j=0;
00481     int j2=0;
00482     numrechitsas=0;
00483     SiStripRecHit2DCollection::range rechitsasRange = rechitsstereo->get(detid);
00484     SiStripRecHit2DCollection::const_iterator rechitsasRangeIteratorBegin = rechitsasRange.first;
00485     SiStripRecHit2DCollection::const_iterator rechitsasRangeIteratorEnd   = rechitsasRange.second;
00486     SiStripRecHit2DCollection::const_iterator itersas=rechitsasRangeIteratorBegin;
00487     numrechitsas = rechitsasRangeIteratorEnd - rechitsasRangeIteratorBegin;   
00488     if(numrechitsas > 0){
00489       totrechitsas+=numrechitsas;
00490       for(itersas=rechitsasRangeIteratorBegin; itersas!=rechitsasRangeIteratorEnd;++itersas){
00491         const GeomDetUnit *  det = tracker.idToDetUnit(detid);
00492         const StripGeomDetUnit * stripdet=(const StripGeomDetUnit*)(det);
00493         const StripTopology &topol=(StripTopology&)stripdet->topology();
00494         SiStripRecHit2D const rechit=*itersas;
00495         LocalPoint position=rechit.localPosition();
00496         LocalError error=rechit.localPositionError();
00497         MeasurementPoint Mposition;
00498         MeasurementError Merror;
00499         Mposition = topol.measurementPosition(position);
00500         Merror = topol.measurementError(position,error);
00501         SiStripRecHit2D::ClusterRef clust=rechit.cluster();     int clusiz=0;
00502         int totcharge=0;
00503         clusiz = clust->amplitudes().size();
00504         const std::vector<uint8_t> amplitudes=clust->amplitudes();
00505         for(size_t ia=0; ia<amplitudes.size();ia++){
00506           totcharge+=amplitudes[ia];
00507         }
00508         
00509         rechitsasx[j] = position.x();
00510         rechitsasy[j] = position.y();
00511         rechitsasz[j] = position.z();
00512         rechitsaserrx[j] = error.xx();
00513         clusizsas[j] = clusiz;
00514         cluchgsas[j] = totcharge;
00515         
00516         float mindist = 999999;
00517         float dist = 999999;
00518         PSimHit closest;
00519         matched.clear();
00520         matched = associate.associateHit(rechit);
00521         if(!matched.empty()){
00522           for(vector<PSimHit>::const_iterator m=matched.begin(); m<matched.end(); m++){
00523             dist = fabs(rechitsasx[j] - (*m).localPosition().x());
00524             if(dist<mindist){
00525               mindist = dist;
00526               closest = (*m);
00527             }
00528             rechitsasres[j] = rechitsasx[j] - closest.localPosition().x();
00529           }  
00530           rechitsaspullMF[j] = (Mposition.x() - (topol.measurementPosition(closest.localPosition())).x())/sqrt(Merror.uu());
00531           //chi2test compare rechit errors with the simhit position ( using null matrix for the simhit). 
00532           //Can spot problems in the geometry better than a simple residual. (thanks to BorisM)
00533           AlgebraicVector rhparameters = rechit.parameters();
00534           AlgebraicVector shparameters(2);
00535           shparameters[0] = closest.localPosition().x();
00536           shparameters[1] = closest.localPosition().y();
00537           AlgebraicVector r(rhparameters - shparameters);
00538           AlgebraicSymMatrix R  = rechit.parametersError();
00539           int ierr; 
00540           R.invert(ierr); // if (ierr != 0) throw exception;
00541           double est = R.similarity(r);
00542           //      std::cout << " ====== Chi2 test sas hits ====== " << std::endl;
00543           //      std::cout << "RecHit param. = " << rhparameters << std::endl;
00544           //      std::cout << "RecHit errors = " << R << std::endl;
00545           //      std::cout << "SimHit param. = " << shparameters << std::endl;
00546           //      std::cout << " chi2  = " << est << std::endl;
00547           //      std::cout << "DEBUG BORIS,filling chi2sas[j],j: " << i << std::endl;
00548           chi2sas[j2] = est;
00549           j2++;
00550         }
00551         j++;
00552       }
00553     }
00554     
00555     //now matched hits
00556 
00557     int k=0;
00558     int k2=0;
00559     
00560     //loop over rechits-matched in the same subdetector
00561     numrechitmatched=0;
00562     SiStripMatchedRecHit2DCollection::range rechitmatchedRange = rechitsmatched->get(detid);
00563     SiStripMatchedRecHit2DCollection::const_iterator rechitmatchedRangeIteratorBegin = rechitmatchedRange.first;
00564     SiStripMatchedRecHit2DCollection::const_iterator rechitmatchedRangeIteratorEnd   = rechitmatchedRange.second;
00565     SiStripMatchedRecHit2DCollection::const_iterator itermatched=rechitmatchedRangeIteratorBegin;
00566     numrechitmatched = rechitmatchedRangeIteratorEnd - rechitmatchedRangeIteratorBegin;   
00567     if(numrechitmatched > 0){
00568       totrechitmatched +=numrechitmatched;
00569 
00570       for(itermatched=rechitmatchedRangeIteratorBegin; itermatched!=rechitmatchedRangeIteratorEnd;++itermatched){
00571         SiStripMatchedRecHit2D const rechit=*itermatched;
00572         LocalPoint position=rechit.localPosition();
00573         LocalError error=rechit.localPositionError();
00574         
00575         float mindist = 999999;
00576         float distx = 999999;
00577         float disty = 999999;
00578         float dist = 999999;
00579         std::pair<LocalPoint,LocalVector> closestPair;
00580         matched.clear();
00581         //      const SiStripRecHit2D *mono = rechit.monoHit();
00582         //      const SiStripRecHit2D *st = rechit.stereoHit();
00583         //      LocalPoint monopos = mono->localPosition();
00584         //      LocalPoint stpos   = st->localPosition();
00585         
00586         rechitmatchedx[k] = position.x();
00587         rechitmatchedy[k] = position.y();
00588         rechitmatchedz[k] = position.z();
00589         rechitmatchederrxx[k] = error.xx();
00590         rechitmatchederrxy[k] = error.xy();
00591         rechitmatchederryy[k] = error.yy();
00592 
00593         //      std::cout << " before association " << std::endl;
00594         matched = associate.associateHit(rechit);
00595         //std::cout << " after association size = " << matched.size() << std::endl;
00596 
00597         if(!matched.empty()){
00598           //project simhit;
00599           const GluedGeomDet* gluedDet = (const GluedGeomDet*)tracker.idToDet(rechit.geographicalId());
00600           const StripGeomDetUnit* partnerstripdet =(StripGeomDetUnit*) gluedDet->stereoDet();
00601           std::pair<LocalPoint,LocalVector> hitPair;
00602 
00603           //std::cout << " RECHIT position = " << position << std::endl;          
00604           
00605           for(vector<PSimHit>::const_iterator m=matched.begin(); m<matched.end(); m++){
00606             //project simhit;
00607             hitPair= projectHit((*m),partnerstripdet,gluedDet->surface());
00608             distx = fabs(rechitmatchedx[k] - hitPair.first.x());
00609             disty = fabs(rechitmatchedy[k] - hitPair.first.y());
00610             dist = sqrt(distx*distx+disty*disty);
00611             // std::cout << " Simhit position x = " << hitPair.first.x() 
00612             //      << " y = " << hitPair.first.y() << " dist = " << dist << std::endl;   
00613             if(dist<mindist){
00614               mindist = dist;
00615               closestPair = hitPair;
00616             }
00617           }
00618           //std::cout << " Closest position x = " << closestPair.first.x() 
00619           //      << " y = " << closestPair.first.y() << " dist = " << dist << std::endl;         
00620           rechitmatchedresx[k] = rechitmatchedx[k] - closestPair.first.x();
00621           rechitmatchedresy[k] = rechitmatchedy[k] - closestPair.first.y();
00622 
00623           //chi2test compare rechit errors with the simhit position ( using null matrix for the simhit). 
00624           //Can spot problems in the geometry better than a simple residual. (thanks to BorisM)
00625 
00626           AlgebraicVector rhparameters = rechit.parameters();
00627           LocalPoint sh = closestPair.first;
00628           AlgebraicVector shparameters(2);
00629           shparameters[0] = sh.x();
00630           shparameters[1] = sh.y();
00631           AlgebraicVector r(rhparameters - shparameters);
00632           AlgebraicSymMatrix R  = rechit.parametersError();
00633           int ierr; 
00634           R.invert(ierr); // if (ierr != 0) throw exception;
00635           double est = R.similarity(r);
00636           //      std::cout << " ====== Chi2 test matched ====== " << std::endl;
00637           //      std::cout << "RecHit param. = " << rhparameters << std::endl;
00638           //      std::cout << "RecHit errors = " << R << std::endl;
00639           //      std::cout << "SimHit param. = " << shparameters << std::endl;
00640           //      std::cout << " chi2  = " << est << std::endl;
00641           chi2matched[k2] = est;
00642           k2++;
00643         }
00644         
00645         k++;
00646       }
00647     }
00648     
00649     //for each detid
00650     if(numrechitrphi>0 || numrechitsas>0 || numrechitmatched){
00651       if (detid.subdetId() == int(StripSubdetector::TIB)){
00652         TIBDetId tibid(myid);
00653         int Tibnumrechitrphi    = numrechitrphi;
00654         int Tibnumrechitsas     = numrechitsas;
00655         int Tibnumrechitmatched = numrechitmatched;
00656 
00657         int Tibnumrechitrphi2    = i2;
00658         int Tibnumrechitsas2     = j2;
00659         int Tibnumrechitmatched2 = k2;
00660 
00661         totTibnumrechitrphi +=numrechitrphi;
00662         totTibnumrechitsas +=numrechitsas;
00663         totTibnumrechitmatched +=numrechitmatched;
00664 
00665         int ilay = tibid.layer() - 1; //for histogram filling
00666         
00667         if(tibid.stereo()==0){
00668           for(int k = 0; k<Tibnumrechitrphi; k++){
00669             meNstpRphiTIB[ilay]->Fill(clusizrphi[k]);
00670             meAdcRphiTIB[ilay]->Fill(cluchgrphi[k]);
00671             mePosxRphiTIB[ilay]->Fill(rechitrphix[k]);
00672             meErrxRphiTIB[ilay]->Fill(sqrt(rechitrphierrx[k]));
00673             meResRphiTIB[ilay]->Fill(rechitrphires[k]);
00674             mePullLFRphiTIB[ilay]->Fill(rechitrphires[k]/sqrt(rechitrphierrx[k]));
00675             mePullMFRphiTIB[ilay]->Fill(rechitrphipullMF[k]);
00676 
00677           }
00678 
00679           for(int k = 0; k<Tibnumrechitrphi2; k++){
00680             meChi2RphiTIB[ilay]->Fill(chi2rphi[k]);
00681           }
00682 
00683         } else  if(tibid.stereo()==1){
00684           for(int kk = 0; kk < Tibnumrechitsas; kk++)       
00685             {
00686               meNstpSasTIB[ilay]->Fill(clusizsas[kk]);
00687               meAdcSasTIB[ilay]->Fill(cluchgsas[kk]);
00688               mePosxSasTIB[ilay]->Fill(rechitsasx[kk]);
00689               meErrxSasTIB[ilay]->Fill(sqrt(rechitsaserrx[kk]));
00690               meResSasTIB[ilay]->Fill(rechitsasres[kk]);
00691               mePullLFSasTIB[ilay]->Fill(rechitsasres[kk]/sqrt(rechitsaserrx[kk]));
00692               mePullMFSasTIB[ilay]->Fill(rechitsaspullMF[kk]);
00693             }     
00694           for(int l = 0; l<Tibnumrechitsas2; l++){
00695             meChi2SasTIB[ilay]->Fill(chi2sas[l]);
00696           }
00697 
00698         }
00699         if(Tibnumrechitmatched>0){
00700           for(int kkk = 0; kkk<Tibnumrechitmatched; kkk++)
00701             {
00702               mePosxMatchedTIB[ilay]->Fill(rechitmatchedx[kkk]);
00703               mePosyMatchedTIB[ilay]->Fill(rechitmatchedy[kkk]);
00704               meErrxMatchedTIB[ilay]->Fill(sqrt(rechitmatchederrxx[kkk]));
00705               meErryMatchedTIB[ilay]->Fill(sqrt(rechitmatchederryy[kkk]));
00706               meResxMatchedTIB[ilay]->Fill(rechitmatchedresx[kkk]);
00707               meResyMatchedTIB[ilay]->Fill(rechitmatchedresy[kkk]);
00708             }     
00709           for(int l = 0; l<Tibnumrechitmatched2; l++){
00710             meChi2MatchedTIB[ilay]->Fill(chi2matched[l]);
00711           }
00712 
00713         }
00714       }
00715 
00716 
00717       if (detid.subdetId() == int(StripSubdetector::TOB)){
00718         TOBDetId tobid(myid);
00719         int Tobnumrechitrphi    = numrechitrphi;
00720         int Tobnumrechitsas     = numrechitsas;
00721         int Tobnumrechitmatched = numrechitmatched;
00722         totTobnumrechitrphi +=numrechitrphi;
00723         totTobnumrechitsas +=numrechitsas;
00724         totTobnumrechitmatched +=numrechitmatched;
00725 
00726         int Tobnumrechitrphi2    = i2;
00727         int Tobnumrechitsas2     = j2;
00728         int Tobnumrechitmatched2 = k2;
00729 
00730         int ilay = tobid.layer() - 1; //for histogram filling
00731         
00732         if(tobid.stereo()==0){
00733           for(int k = 0; k<Tobnumrechitrphi; k++){
00734             meNstpRphiTOB[ilay]->Fill(clusizrphi[k]);
00735             meAdcRphiTOB[ilay]->Fill(cluchgrphi[k]);
00736             mePosxRphiTOB[ilay]->Fill(rechitrphix[k]);
00737             meErrxRphiTOB[ilay]->Fill(sqrt(rechitrphierrx[k]));
00738             meResRphiTOB[ilay]->Fill(rechitrphires[k]);
00739             mePullLFRphiTOB[ilay]->Fill(rechitrphires[k]/sqrt(rechitrphierrx[k]));
00740             mePullMFRphiTOB[ilay]->Fill(rechitrphipullMF[k]);
00741           }
00742           for(int l = 0; l<Tobnumrechitrphi2; l++){
00743             meChi2RphiTOB[ilay]->Fill(chi2rphi[l]);
00744           }
00745         } else  if(tobid.stereo()==1){
00746           for(int kk = 0; kk < Tobnumrechitsas; kk++)       
00747             {
00748               meNstpSasTOB[ilay]->Fill(clusizsas[kk]);
00749               meAdcSasTOB[ilay]->Fill(cluchgsas[kk]);
00750               mePosxSasTOB[ilay]->Fill(rechitsasx[kk]);
00751               meErrxSasTOB[ilay]->Fill(sqrt(rechitsaserrx[kk]));
00752               meResSasTOB[ilay]->Fill(rechitsasres[kk]);
00753               mePullLFSasTOB[ilay]->Fill(rechitsasres[kk]/sqrt(rechitsaserrx[kk]));
00754               mePullMFSasTOB[ilay]->Fill(rechitsaspullMF[kk]);
00755             }
00756           for(int l = 0; l<Tobnumrechitsas2; l++){
00757             meChi2SasTOB[ilay]->Fill(chi2sas[l]);
00758           }
00759           
00760         }
00761         if(Tobnumrechitmatched>0){
00762           for(int kkk = 0; kkk<Tobnumrechitmatched; kkk++)
00763             {
00764               mePosxMatchedTOB[ilay]->Fill(rechitmatchedx[kkk]);
00765               mePosyMatchedTOB[ilay]->Fill(rechitmatchedy[kkk]);
00766               meErrxMatchedTOB[ilay]->Fill(sqrt(rechitmatchederrxx[kkk]));
00767               meErryMatchedTOB[ilay]->Fill(sqrt(rechitmatchederryy[kkk]));
00768               meResxMatchedTOB[ilay]->Fill(rechitmatchedresx[kkk]);
00769               meResyMatchedTOB[ilay]->Fill(rechitmatchedresy[kkk]);
00770             }     
00771           for(int l = 0; l<Tobnumrechitmatched2; l++){
00772             meChi2MatchedTOB[ilay]->Fill(chi2matched[l]);
00773           }
00774 
00775         }
00776       }
00777       if (detid.subdetId() == int(StripSubdetector::TID)){
00778         TIDDetId tidid(myid);
00779         int Tidnumrechitrphi    = numrechitrphi;
00780         int Tidnumrechitsas     = numrechitsas;
00781         int Tidnumrechitmatched = numrechitmatched;
00782         totTidnumrechitrphi +=numrechitrphi;
00783         totTidnumrechitsas +=numrechitsas;
00784         totTidnumrechitmatched +=numrechitmatched;
00785 
00786         int Tidnumrechitrphi2    = i2;
00787         int Tidnumrechitsas2     = j2;
00788         int Tidnumrechitmatched2 = k2;
00789 
00790         int ilay = tidid.ring() - 1; //for histogram filling
00791         
00792         if(tidid.stereo()==0){
00793           for(int k = 0; k<Tidnumrechitrphi; k++){
00794             meNstpRphiTID[ilay]->Fill(clusizrphi[k]);
00795             meAdcRphiTID[ilay]->Fill(cluchgrphi[k]);
00796             mePosxRphiTID[ilay]->Fill(rechitrphix[k]);
00797             meErrxRphiTID[ilay]->Fill(sqrt(rechitrphierrx[k]));
00798             meResRphiTID[ilay]->Fill(rechitrphires[k]);
00799             mePullLFRphiTID[ilay]->Fill(rechitrphires[k]/sqrt(rechitrphierrx[k]));
00800             mePullMFRphiTID[ilay]->Fill(rechitrphipullMF[k]);
00801           }
00802           for(int l = 0; l<Tidnumrechitrphi2; l++){
00803             meChi2RphiTID[ilay]->Fill(chi2rphi[l]);
00804           }
00805 
00806         } else  if(tidid.stereo()==1){
00807           for(int kk = 0; kk < Tidnumrechitsas; kk++)       
00808             {
00809               meNstpSasTID[ilay]->Fill(clusizsas[kk]);
00810               meAdcSasTID[ilay]->Fill(cluchgsas[kk]);
00811               mePosxSasTID[ilay]->Fill(rechitsasx[kk]);
00812               meErrxSasTID[ilay]->Fill(sqrt(rechitsaserrx[kk]));
00813               meResSasTID[ilay]->Fill(rechitsasres[kk]);
00814               mePullLFSasTID[ilay]->Fill(rechitsasres[kk]/sqrt(rechitsaserrx[kk]));
00815               mePullMFSasTID[ilay]->Fill(rechitsaspullMF[kk]);
00816             }     
00817           for(int l = 0; l<Tidnumrechitsas2; l++){
00818             meChi2SasTID[ilay]->Fill(chi2sas[l]);
00819           }
00820 
00821         }
00822         if(Tidnumrechitmatched>0){
00823           for(int kkk = 0; kkk<Tidnumrechitmatched; kkk++)
00824             {
00825               mePosxMatchedTID[ilay]->Fill(rechitmatchedx[kkk]);
00826               mePosyMatchedTID[ilay]->Fill(rechitmatchedy[kkk]);
00827               meErrxMatchedTID[ilay]->Fill(sqrt(rechitmatchederrxx[kkk]));
00828               meErryMatchedTID[ilay]->Fill(sqrt(rechitmatchederryy[kkk]));
00829               meResxMatchedTID[ilay]->Fill(rechitmatchedresx[kkk]);
00830               meResyMatchedTID[ilay]->Fill(rechitmatchedresy[kkk]);
00831             }
00832           for(int l = 0; l<Tidnumrechitmatched2; l++){
00833             meChi2MatchedTID[ilay]->Fill(chi2matched[l]);
00834           }
00835           
00836         }
00837       }
00838       if (detid.subdetId() == int(StripSubdetector::TEC)){
00839         TECDetId tecid(myid);
00840         int Tecnumrechitrphi    = numrechitrphi;
00841         int Tecnumrechitsas     = numrechitsas;
00842         int Tecnumrechitmatched = numrechitmatched;
00843         totTecnumrechitrphi +=numrechitrphi;
00844         totTecnumrechitsas +=numrechitsas;
00845         totTecnumrechitmatched +=numrechitmatched;
00846 
00847         int Tecnumrechitrphi2    = i2;
00848         int Tecnumrechitsas2     = j2;
00849         int Tecnumrechitmatched2 = k2;
00850 
00851         int ilay = tecid.ring() - 1; //for histogram filling
00852         
00853         if(tecid.stereo()==0){
00854           for(int k = 0; k<Tecnumrechitrphi; k++){
00855             meNstpRphiTEC[ilay]->Fill(clusizrphi[k]);
00856             meAdcRphiTEC[ilay]->Fill(cluchgrphi[k]);
00857             mePosxRphiTEC[ilay]->Fill(rechitrphix[k]);
00858             meErrxRphiTEC[ilay]->Fill(sqrt(rechitrphierrx[k]));
00859             meResRphiTEC[ilay]->Fill(rechitrphires[k]);
00860             mePullLFRphiTEC[ilay]->Fill(rechitrphires[k]/sqrt(rechitrphierrx[k]));
00861             mePullMFRphiTEC[ilay]->Fill(rechitrphipullMF[k]);
00862           }
00863           for(int l = 0; l<Tecnumrechitrphi2; l++){
00864             meChi2RphiTEC[ilay]->Fill(chi2rphi[l]);
00865           }
00866 
00867         } else  if(tecid.stereo()==1){
00868           for(int kk = 0; kk < Tecnumrechitsas; kk++)       
00869             {
00870               meNstpSasTEC[ilay]->Fill(clusizsas[kk]);
00871               meAdcSasTEC[ilay]->Fill(cluchgsas[kk]);
00872               mePosxSasTEC[ilay]->Fill(rechitsasx[kk]);
00873               meErrxSasTEC[ilay]->Fill(sqrt(rechitsaserrx[kk]));
00874               meResSasTEC[ilay]->Fill(rechitsasres[kk]);
00875               mePullLFSasTEC[ilay]->Fill(rechitsasres[kk]/sqrt(rechitsaserrx[kk]));
00876               mePullMFSasTEC[ilay]->Fill(rechitsaspullMF[kk]);
00877             }     
00878           for(int l = 0; l<Tecnumrechitsas2; l++){
00879             meChi2SasTEC[ilay]->Fill(chi2sas[l]);
00880           }
00881 
00882         }
00883         if(Tecnumrechitmatched>0){
00884           for(int kkk = 0; kkk<Tecnumrechitmatched; kkk++)
00885             {
00886               mePosxMatchedTEC[ilay]->Fill(rechitmatchedx[kkk]);
00887               mePosyMatchedTEC[ilay]->Fill(rechitmatchedy[kkk]);
00888               meErrxMatchedTEC[ilay]->Fill(sqrt(rechitmatchederrxx[kkk]));
00889               meErryMatchedTEC[ilay]->Fill(sqrt(rechitmatchederryy[kkk]));
00890               meResxMatchedTEC[ilay]->Fill(rechitmatchedresx[kkk]);
00891               meResyMatchedTEC[ilay]->Fill(rechitmatchedresy[kkk]);
00892             }     
00893           for(int l = 0; l<Tecnumrechitmatched2; l++){
00894             meChi2MatchedTEC[ilay]->Fill(chi2matched[l]);
00895           }
00896 
00897         }
00898       }
00899 
00900     }
00901   }
00902 
00903   //now fill the cumulative histograms of the hits
00904 
00905   meNumRphiTIB->Fill(totTibnumrechitrphi);
00906   meNumSasTIB->Fill(totTibnumrechitsas);
00907   meNumMatchedTIB->Fill(totTibnumrechitmatched);
00908   meNumRphiTOB->Fill(totTobnumrechitrphi);
00909   meNumSasTOB->Fill(totTobnumrechitsas);
00910   meNumMatchedTOB->Fill(totTobnumrechitmatched);
00911   meNumRphiTID->Fill(totTidnumrechitrphi);
00912   meNumSasTID->Fill(totTidnumrechitsas);
00913   meNumMatchedTID->Fill(totTidnumrechitmatched);
00914   meNumRphiTEC->Fill(totTecnumrechitrphi);
00915   meNumSasTEC->Fill(totTecnumrechitsas);
00916   meNumMatchedTEC->Fill(totTecnumrechitmatched);
00917 
00918   meNumTotRphi->Fill(totrechitrphi);
00919   meNumTotSas->Fill(totrechitsas);
00920   meNumTotMatched->Fill(totrechitmatched);
00921 
00922  
00923 }
00924 
00925   
00926 //needed by to do the residual for matched hits
00927 std::pair<LocalPoint,LocalVector> SiStripRecHitsValid::projectHit( const PSimHit& hit, const StripGeomDetUnit* stripDet,
00928                                                                    const BoundPlane& plane) 
00929 {
00930   //  const StripGeomDetUnit* stripDet = dynamic_cast<const StripGeomDetUnit*>(hit.det());
00931   //if (stripDet == 0) throw MeasurementDetException("HitMatcher hit is not on StripGeomDetUnit");
00932   
00933   const StripTopology& topol = stripDet->specificTopology();
00934   GlobalPoint globalpos= stripDet->surface().toGlobal(hit.localPosition());
00935   LocalPoint localHit = plane.toLocal(globalpos);
00936   //track direction
00937   LocalVector locdir=hit.localDirection();
00938   //rotate track in new frame
00939   
00940   GlobalVector globaldir= stripDet->surface().toGlobal(locdir);
00941   LocalVector dir=plane.toLocal(globaldir);
00942   float scale = -localHit.z() / dir.z();
00943   
00944   LocalPoint projectedPos = localHit + scale*dir;
00945   
00946   //  std::cout << "projectedPos " << projectedPos << std::endl;
00947   
00948   float selfAngle = topol.stripAngle( topol.strip( hit.localPosition()));
00949   
00950   LocalVector stripDir( sin(selfAngle), cos(selfAngle), 0); // vector along strip in hit frame
00951   
00952   LocalVector localStripDir( plane.toLocal(stripDet->surface().toGlobal( stripDir)));
00953   
00954   return std::pair<LocalPoint,LocalVector>( projectedPos, localStripDir);
00955 }
00956 
00957 

Generated on Tue Jun 9 17:49:45 2009 for CMSSW by  doxygen 1.5.4