CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_6/src/Alignment/SurveyAnalysis/plugins/SurveyInputTrackerFromDB.cc

Go to the documentation of this file.
00001 #include "Alignment/CommonAlignment/interface/SurveyDet.h"
00002 #include "Alignment/TrackerAlignment/interface/AlignableTracker.h"
00003 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00004 #include "FWCore/Framework/interface/EventSetup.h"
00005 #include "FWCore/Framework/interface/ESHandle.h"
00006 #include "Geometry/Records/interface/IdealGeometryRecord.h"
00007 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeomBuilderFromGeometricDet.h"
00008 
00009 // Database
00010 #include "CondCore/DBOutputService/interface/PoolDBOutputService.h"
00011 #include "FWCore/ServiceRegistry/interface/Service.h"
00012 #include "CondFormats/AlignmentRecord/interface/TrackerAlignmentRcd.h"
00013 #include "CondFormats/AlignmentRecord/interface/TrackerAlignmentErrorRcd.h"
00014 #include "CondFormats/Alignment/interface/Alignments.h"
00015 #include "CondFormats/Alignment/interface/AlignmentErrors.h"
00016 
00017 
00018 #include "Alignment/SurveyAnalysis/plugins/SurveyInputTrackerFromDB.h"
00019 
00020 SurveyInputTrackerFromDB::SurveyInputTrackerFromDB(const edm::ParameterSet& cfg):
00021 textFileName( cfg.getParameter<std::string>("textFileName") )
00022 {
00023 }
00024 
00025 void SurveyInputTrackerFromDB::analyze(const edm::Event&, const edm::EventSetup& setup)
00026 {
00027   if (theFirstEvent) {
00028 
00029         //  std::cout << "***************ENTERING INITIALIZATION******************" << std::endl;
00030         
00031         //Get map from textreader
00032         SurveyInputTextReader dataReader;
00033         dataReader.readFile( textFileName );
00034         uIdMap = dataReader.UniqueIdMap();
00035         
00036         edm::ESHandle<GeometricDet>  geom;
00037         setup.get<IdealGeometryRecord>().get(geom);      
00038         TrackerGeometry* tracker = TrackerGeomBuilderFromGeometricDet().build(&*geom);
00039         
00040         addComponent( new AlignableTracker( tracker ) );
00041         addSurveyInfo( detector() );
00042         
00043         //write out to a DB ...
00044         Alignments* myAlignments = detector()->alignments();
00045         AlignmentErrors* myAlignmentErrors = detector()->alignmentErrors();
00046         
00047         // 2. Store alignment[Error]s to DB
00048         edm::Service<cond::service::PoolDBOutputService> poolDbService;
00049         // Call service
00050         
00051         if( !poolDbService.isAvailable() ) // Die if not available
00052                 throw cms::Exception("NotAvailable") << "PoolDBOutputService not available";
00053         
00054         poolDbService->writeOne<Alignments>( myAlignments, poolDbService->beginOfTime(), "TrackerAlignmentRcd" );
00055         poolDbService->writeOne<AlignmentErrors>( myAlignmentErrors, poolDbService->beginOfTime(), "TrackerAlignmentErrorRcd" );
00056         
00057         theFirstEvent = false;
00058   }
00059 }
00060 
00061 void SurveyInputTrackerFromDB::addSurveyInfo(Alignable* ali)
00062 {
00063         const align::Alignables& comp = ali->components();
00064         unsigned int nComp = comp.size();
00065         
00066         for (unsigned int i = 0; i < nComp; ++i) addSurveyInfo(comp[i]);
00067         
00068         align::ErrorMatrix error;
00069 
00070         SurveyInputTextReader::MapType::const_iterator it
00071           = uIdMap.find(std::make_pair(ali->id(), ali->alignableObjectId()));
00072 
00073         if (it != uIdMap.end()){
00074                 
00075                 const align::Scalars& parameters = (it)->second;
00076                 
00077                 //move the surface
00078                 //displacement
00079                 align::LocalVector lvector (parameters[0], parameters[1], parameters[2]);
00080                 align::GlobalVector gvector = ali->surface().toGlobal(lvector);
00081                 ali->move(gvector);
00082                 //rotation
00083                 Basic3DVector<align::Scalar> rot_aa(parameters[3], parameters[4], parameters[5]);
00084                 align::RotationType rotation(rot_aa, rot_aa.mag());
00085                 ali->rotateInLocalFrame(rotation);
00086                 
00087                 //sets the errors for the hierarchy level
00088                 double* errorData = error.Array();
00089                 for (unsigned int i = 0; i < 21; ++i){errorData[i] = parameters[i+6];}
00090                 
00091                 ali->setSurvey( new SurveyDet(ali->surface(), error*(1e-6)) );
00092         }
00093         else {
00094                 error = ROOT::Math::SMatrixIdentity();
00095                 ali->setSurvey( new SurveyDet(ali->surface(), error * 1e-6) );
00096         }
00097         
00098 }
00099 // Plug in to framework
00100 
00101 #include "FWCore/Framework/interface/MakerMacros.h"
00102 
00103 
00104 DEFINE_FWK_MODULE(SurveyInputTrackerFromDB);