Go to the documentation of this file.00001 #include "Alignment/TrackerAlignment/plugins/AlignmentPrescaler.h"
00002
00003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00004 #include "DataFormats/Common/interface/View.h"
00005 #include "DataFormats/SiPixelDetId/interface/PXBDetId.h"
00006 #include "DataFormats/SiPixelDetId/interface/PXFDetId.h"
00007 #include "DataFormats/SiStripDetId/interface/TIBDetId.h"
00008 #include "DataFormats/SiStripDetId/interface/TIDDetId.h"
00009 #include "DataFormats/SiStripDetId/interface/TOBDetId.h"
00010 #include "DataFormats/SiStripDetId/interface/TECDetId.h"
00011 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00012 #include "Alignment/TrackerAlignment/interface/AlignableTracker.h"
00013 #include "Alignment/CommonAlignment/interface/Alignable.h"
00014 #include "Alignment/CommonAlignment/interface/Utilities.h"
00015 #include "Utilities/General/interface/ClassName.h"
00016
00017 #include "DataFormats/TrackReco/interface/Track.h"
00018 #include "AnalysisDataFormats/TrackInfo/interface/TrackInfo.h"
00019
00020 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2D.h"
00021 #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHit.h"
00022 #include "RecoTracker/TransientTrackingRecHit/interface/TSiStripRecHit2DLocalPos.h"
00023 #include "RecoTracker/TransientTrackingRecHit/interface/TSiPixelRecHit.h"
00024 #include "DataFormats/Alignment/interface/AlignmentClusterFlag.h"
00025 #include "DataFormats/Alignment/interface/AliClusterValueMap.h"
00026
00027 #include "Riostream.h"
00028
00029 AlignmentPrescaler::AlignmentPrescaler(const edm::ParameterSet &iConfig):
00030 src_(iConfig.getParameter<edm::InputTag>("src")),
00031 srcQualityMap_(iConfig.getParameter<edm::InputTag>("assomap")),
00032 prescfilename_(iConfig.getParameter<std::string>("PrescFileName")),
00033 presctreename_(iConfig.getParameter<std::string>("PrescTreeName"))
00034 {
00035
00036 produces<AliClusterValueMap>();
00037 produces<AliTrackTakenClusterValueMap>();
00038
00039 }
00040
00041 AlignmentPrescaler::~AlignmentPrescaler(){
00042
00043 }
00044
00045 void AlignmentPrescaler::beginJob(){
00046
00047 std::cout<<"in AlignmentPrescaler::beginJob"<<std::flush;
00048 fpresc_=new TFile(prescfilename_.c_str(),"READ");
00049 tpresc_=(TTree*)fpresc_->Get(presctreename_.c_str());
00050 tpresc_->BuildIndex("DetId");
00051 tpresc_->SetBranchStatus("*",0);
00052 tpresc_->SetBranchStatus("DetId",1);
00053 tpresc_->SetBranchStatus("PrescaleFactor",1);
00054 tpresc_->SetBranchStatus("PrescaleFactorOverlap",1);
00055 cout<<" Branches activated "<<std::flush;
00056 detid_=0;
00057 hitPrescFactor_=99.0;
00058 overlapPrescFactor_=88.0;
00059
00060 tpresc_->SetBranchAddress("DetId",&detid_);
00061 tpresc_->SetBranchAddress("PrescaleFactor",&hitPrescFactor_);
00062 tpresc_->SetBranchAddress("PrescaleFactorOverlap",&overlapPrescFactor_);
00063 cout<<" addressed "<<std::flush;
00064 myrand_=new TRandom3();
00065
00066 cout<<" ok "<<std::endl;
00067
00068 }
00069
00070 void AlignmentPrescaler::endJob( ){
00071
00072 delete tpresc_;
00073 fpresc_->Close();
00074 delete fpresc_;
00075 delete myrand_;
00076 }
00077
00078 void AlignmentPrescaler::produce(edm::Event &iEvent, const edm::EventSetup &iSetup){
00079
00080 edm::Handle<reco::TrackCollection> Tracks;
00081 iEvent.getByLabel(src_, Tracks);
00082
00083
00084 edm::Handle<AliClusterValueMap> hMap;
00085 iEvent.getByLabel(srcQualityMap_, hMap);
00086 AliClusterValueMap InValMap=*hMap;
00087
00088
00089 std::vector<int> trackflags(Tracks->size(),0);
00090
00091
00092
00093
00094
00095 for(std::vector<reco::Track>::const_iterator ittrk = Tracks->begin(), edtrk = Tracks->end(); ittrk != edtrk; ++ittrk){
00096
00097
00098 int nhit=0;
00099 int ntakenhits=0;
00100 bool firstTakenHit=false;
00101
00102 for (trackingRecHit_iterator ith = ittrk->recHitsBegin(), edh = ittrk->recHitsEnd(); ith != edh; ++ith) {
00103 const TrackingRecHit *hit = ith->get();
00104 if(! hit->isValid()){
00105 nhit++;
00106 continue;
00107 }
00108 uint32_t tmpdetid = hit->geographicalId().rawId();
00109 tpresc_->GetEntryWithIndex(tmpdetid);
00110
00111
00112
00113
00114 bool takeit=false;
00115 int subdetId=hit->geographicalId().subdetId();
00116
00117
00118
00119 bool isOverlapHit=false;
00120
00121
00122 const SiPixelRecHit* pixelhit= dynamic_cast<const SiPixelRecHit*>(hit);
00123 const SiStripRecHit1D* stripHit1D = dynamic_cast<const SiStripRecHit1D*>(hit);
00124 const SiStripRecHit2D* stripHit2D = dynamic_cast<const SiStripRecHit2D*>(hit);
00125
00126 AlignmentClusterFlag tmpflag(hit->geographicalId());
00127 int stripType=0;
00128 if(subdetId>2){
00129 const std::type_info &type = typeid(*hit);
00130 if (type == typeid(SiStripRecHit1D)) stripType=1;
00131 else if (type == typeid(SiStripRecHit2D)) stripType=2;
00132 else stripType=3;
00133
00134 if(stripType==1) {
00135
00136
00137 if(stripHit1D!=0){
00138 SiStripRecHit1D::ClusterRef stripclust(stripHit1D->cluster());
00139 tmpflag=InValMap[stripclust];
00140 tmpflag.SetDetId(hit->geographicalId());
00141 if(tmpflag.isOverlap())isOverlapHit=true;
00142
00143
00144
00145
00146 }
00147 }
00148 else if (stripType==2) {
00149
00150 if(stripHit2D!=0){
00151 SiStripRecHit2D::ClusterRef stripclust(stripHit2D->cluster());
00152 tmpflag=InValMap[stripclust];
00153 tmpflag.SetDetId(hit->geographicalId());
00154 if(tmpflag.isOverlap())isOverlapHit=true;
00155
00156
00157
00158
00159 }
00160 }
00161 }
00162 else{
00163
00164 if(pixelhit!=0){
00165
00166 SiPixelClusterRefNew pixclust(pixelhit->cluster());
00167 tmpflag=InValMap[pixclust];
00168 tmpflag.SetDetId(hit->geographicalId());
00169 if(tmpflag.isOverlap())isOverlapHit=true;
00170 }
00171 }
00172
00173
00174 if( isOverlapHit ){
00175
00176 takeit=(float(myrand_->Rndm())<=overlapPrescFactor_);
00177 }
00178 if( !takeit ){
00179 float rr=float(myrand_->Rndm());
00180 takeit=(rr<=hitPrescFactor_);
00181 }
00182 if(takeit){
00183
00184 tmpflag.SetTakenFlag();
00185
00186 if(subdetId>2){
00187 if(stripType==1){
00188 SiStripRecHit1D::ClusterRef stripclust(stripHit1D->cluster());
00189 InValMap[stripclust]=tmpflag;
00190 }
00191 else if(stripType==2){
00192 SiStripRecHit1D::ClusterRef stripclust(stripHit2D->cluster());
00193 InValMap[stripclust]=tmpflag;
00194 }
00195 else std::cout<<"Unknown type of strip hit"<<std::endl;
00196 }
00197 else{
00198 SiPixelClusterRefNew pixclust(pixelhit->cluster());
00199 InValMap[pixclust]=tmpflag;
00200 }
00201
00202 if(!firstTakenHit){
00203 firstTakenHit=true;
00204
00205
00206 }
00207 ntakenhits++;
00208 }
00209
00210
00211 nhit++;
00212
00213 }
00214 trackflags[ittrk-Tracks->begin()]=ntakenhits;
00215
00216 }
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227 std::auto_ptr<AliClusterValueMap> OutVM( new AliClusterValueMap);
00228 *OutVM=InValMap;
00229
00230 iEvent.put(OutVM);
00231
00232
00233 std::auto_ptr<AliTrackTakenClusterValueMap> trkVM( new AliTrackTakenClusterValueMap);
00234 AliTrackTakenClusterValueMap::Filler trkmapfiller(*trkVM);
00235 trkmapfiller.insert(Tracks,trackflags.begin(),trackflags.end() );
00236 trkmapfiller.fill();
00237 iEvent.put(trkVM);
00238
00239
00240 }
00241
00242
00243 int AlignmentPrescaler::layerFromId (const DetId& id) const
00244 {
00245 if ( uint32_t(id.subdetId())==PixelSubdetector::PixelBarrel ) {
00246 PXBDetId tobId(id);
00247 return tobId.layer();
00248 }
00249 else if ( uint32_t(id.subdetId())==PixelSubdetector::PixelEndcap ) {
00250 PXFDetId tobId(id);
00251 return tobId.disk() + (3*(tobId.side()-1));
00252 }
00253 else if ( id.subdetId()==StripSubdetector::TIB ) {
00254 TIBDetId tibId(id);
00255 return tibId.layer();
00256 }
00257 else if ( id.subdetId()==StripSubdetector::TOB ) {
00258 TOBDetId tobId(id);
00259 return tobId.layer();
00260 }
00261 else if ( id.subdetId()==StripSubdetector::TEC ) {
00262 TECDetId tobId(id);
00263 return tobId.wheel() + (9*(tobId.side()-1));
00264 }
00265 else if ( id.subdetId()==StripSubdetector::TID ) {
00266 TIDDetId tobId(id);
00267 return tobId.wheel() + (3*(tobId.side()-1));
00268 }
00269 return -1;
00270
00271 }
00272
00273
00274 #include "FWCore/PluginManager/interface/ModuleDef.h"
00275 #include "FWCore/Framework/interface/MakerMacros.h"
00276 DEFINE_FWK_MODULE(AlignmentPrescaler);