diff --git a/Alignment/CommonAlignmentProducer/plugins/PCLTrackerAlProducer.cc b/Alignment/CommonAlignmentProducer/plugins/PCLTrackerAlProducer.cc index 1f067b1c303ea..40d82ac34ef07 100644 --- a/Alignment/CommonAlignmentProducer/plugins/PCLTrackerAlProducer.cc +++ b/Alignment/CommonAlignmentProducer/plugins/PCLTrackerAlProducer.cc @@ -38,6 +38,7 @@ #include "Alignment/LaserAlignment/interface/TsosVectorCollection.h" #include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h" #include "DataFormats/BeamSpot/interface/BeamSpot.h" +#include "Alignment/MillePedeAlignmentAlgorithm/interface/MillePedeFileReader.h" /*** Geometry ***/ #include "Geometry/TrackingGeometryAligner/interface/GeometryAligner.h" @@ -985,7 +986,18 @@ ::finish() << "Terminating algorithm."; theAlignmentAlgo->terminate(); - storeAlignmentsToDB(); + if (saveToDB_ || saveApeToDB_ || saveDeformationsToDB_) { + // if this is not the harvesting step there is no reason to look for the PEDE log and res files and to call the storeAlignmentsToDB method + MillePedeFileReader mpReader(theParameterSet.getParameter("MillePedeFileReader")); + mpReader.read(); + if (mpReader.storeAlignments()) { + storeAlignmentsToDB(); + } + } else { + edm::LogInfo("Alignment") << "@SUB=PCLTrackerAlProducer::finish" + << "no payload to be stored!"; + + } } //_____________________________________________________________________________ diff --git a/Alignment/CommonAlignmentProducer/plugins/PCLTrackerAlProducer.h b/Alignment/CommonAlignmentProducer/plugins/PCLTrackerAlProducer.h index 1dd239b897b9f..37b1faa40c8eb 100644 --- a/Alignment/CommonAlignmentProducer/plugins/PCLTrackerAlProducer.h +++ b/Alignment/CommonAlignmentProducer/plugins/PCLTrackerAlProducer.h @@ -262,7 +262,12 @@ class PCLTrackerAlProducer : public edm::EDAnalyzer { edm::EDGetTokenT tkLasBeamToken; edm::EDGetTokenT tsosVectorToken; edm::EDGetTokenT clusterValueMapToken; - + cond::Time_t theFirstRun; + + // file-names + //std::string millePedeLogFile_ = "millepede.log"; + //std::string millePedeResFile_ = "millepede.res"; + /*** ESWatcher ***/ @@ -286,7 +291,6 @@ class PCLTrackerAlProducer : public edm::EDAnalyzer { edm::ESWatcher watchCSCSurveyErrExtRcd; - cond::Time_t theFirstRun; /*** Survey stuff ***/ diff --git a/Alignment/CommonAlignmentProducer/python/AlcaSiPixelAliHarvester_cff.py b/Alignment/CommonAlignmentProducer/python/AlcaSiPixelAliHarvester_cff.py index 66e5afffffc61..ba76b2fe57ebc 100644 --- a/Alignment/CommonAlignmentProducer/python/AlcaSiPixelAliHarvester_cff.py +++ b/Alignment/CommonAlignmentProducer/python/AlcaSiPixelAliHarvester_cff.py @@ -13,6 +13,9 @@ from Alignment.CommonAlignmentProducer.TrackerAlignmentProducerForPCL_cff import AlignmentProducer SiPixelAliPedeAlignmentProducer = copy.deepcopy(AlignmentProducer) +from Alignment.MillePedeAlignmentAlgorithm.MillePedeDQMModule_cff import * + + SiPixelAliPedeAlignmentProducer.ParameterBuilder.Selector = cms.PSet( alignParams = cms.vstring( 'TrackerTPBHalfBarrel,111111', @@ -56,4 +59,5 @@ ALCAHARVESTSiPixelAli = cms.Sequence(SiPixelAliMilleFileExtractor* - SiPixelAliPedeAlignmentProducer) + SiPixelAliPedeAlignmentProducer* + SiPixelAliDQMModule) diff --git a/Alignment/CommonAlignmentProducer/python/TrackerAlignmentProducerForPCL_cff.py b/Alignment/CommonAlignmentProducer/python/TrackerAlignmentProducerForPCL_cff.py index f3bbb521a9cf1..22ba4a8bcff7c 100644 --- a/Alignment/CommonAlignmentProducer/python/TrackerAlignmentProducerForPCL_cff.py +++ b/Alignment/CommonAlignmentProducer/python/TrackerAlignmentProducerForPCL_cff.py @@ -10,6 +10,7 @@ #from Alignment.KalmanAlignmentAlgorithm.KalmanAlignmentAlgorithm_cfi import * # parameters from Alignment.CommonAlignmentAlgorithm.AlignmentParameterStore_cfi import * +from Alignment.MillePedeAlignmentAlgorithm.MillePedeFileReader_cfi import * #looper = cms.Looper("AlignmentProducer", AlignmentProducer = cms.EDAnalyzer("PCLTrackerAlProducer", @@ -76,5 +77,8 @@ # Save alignment to DB: true requires configuration of PoolDBOutputService saveToDB = cms.bool(False), # save alignment? saveApeToDB = cms.bool(False), # save APE? - saveDeformationsToDB = cms.bool(False) # save surface deformations (bows, etc.)? + saveDeformationsToDB = cms.bool(False), # save surface deformations (bows, etc.)? + + #parameters used to read the pede files back for DQM and check on parameters + MillePedeFileReader = cms.PSet(MillePedeFileReader) ) diff --git a/Alignment/MillePedeAlignmentAlgorithm/interface/MillePedeFileReader.h b/Alignment/MillePedeAlignmentAlgorithm/interface/MillePedeFileReader.h new file mode 100644 index 0000000000000..1f1ccf42d5f70 --- /dev/null +++ b/Alignment/MillePedeAlignmentAlgorithm/interface/MillePedeFileReader.h @@ -0,0 +1,286 @@ +#ifndef ALIGNMENT_MILLEPEDEALIGNMENTALGORITHM_INTERFACE_MILLEPEDEFILEREADER_H_ +#define ALIGNMENT_MILLEPEDEALIGNMENTALGORITHM_INTERFACE_MILLEPEDEFILEREADER_H_ + +/*** system includes ***/ +#include +#include +#include +#include + +/*** core framework functionality ***/ +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" + + + +class MillePedeFileReader { + + //========================== PUBLIC METHODS ================================== + public: //==================================================================== + + explicit MillePedeFileReader(const edm::ParameterSet&); + ~MillePedeFileReader() {} + + void read(); + bool storeAlignments(); + + std::array const& getXobs() const { return Xobs; } + std::array const& getXobsErr() const { return XobsErr; } + std::array const& getTXobs() const { return tXobs; } + std::array const& getTXobsErr() const { return tXobsErr; } + + std::array const& getYobs() const { return Yobs; } + std::array const& getYobsErr() const { return YobsErr; } + std::array const& getTYobs() const { return tYobs; } + std::array const& getTYobsErr() const { return tYobsErr; } + + std::array const& getZobs() const { return Zobs; } + std::array const& getZobsErr() const { return ZobsErr; } + std::array const& getTZobs() const { return tZobs; } + std::array const& getTZobsErr() const { return tZobsErr; } + + //========================= PRIVATE METHODS ================================== + private: //=================================================================== + + void readMillePedeLogFile(); + void readMillePedeResultFile(); + + //========================== PRIVATE DATA ==================================== + //============================================================================ + + // file-names + std::string millePedeLogFile_; + std::string millePedeResFile_; + + // signifiance of movement must be above + double sigCut_; + // cutoff in micro-meter & micro-rad + double Xcut_, tXcut_; + double Ycut_, tYcut_; + double Zcut_, tZcut_; + // maximum movement in micro-meter/rad + double maxMoveCut_, maxErrorCut_; + + double Cutoffs[6] = { Xcut_, Ycut_, Zcut_, + tXcut_, tYcut_, tZcut_}; + + bool PedeSuccess = false; + bool Movements = false; + bool Error = false; + bool Significant = false; + bool updateDB = false; + bool HitMax = false; + bool HitErrorMax = false; + + int Nrec = 0; + + + + std::array Xobs = {{0.,0.,0.,0.,0.,0.}}; + std::array XobsErr = {{0.,0.,0.,0.,0.,0.}}; + std::array tXobs = {{0.,0.,0.,0.,0.,0.}}; + std::array tXobsErr = {{0.,0.,0.,0.,0.,0.}}; + + std::array Yobs = {{0.,0.,0.,0.,0.,0.}}; + std::array YobsErr = {{0.,0.,0.,0.,0.,0.}}; + std::array tYobs = {{0.,0.,0.,0.,0.,0.}}; + std::array tYobsErr = {{0.,0.,0.,0.,0.,0.}}; + + std::array Zobs = {{0.,0.,0.,0.,0.,0.}}; + std::array ZobsErr = {{0.,0.,0.,0.,0.,0.}}; + std::array tZobs = {{0.,0.,0.,0.,0.,0.}}; + std::array tZobsErr = {{0.,0.,0.,0.,0.,0.}}; + +}; + + + +//============================================================================= +//=== PUBLIC METHOD IMPLEMENTATION === +//============================================================================= + +MillePedeFileReader +::MillePedeFileReader(const edm::ParameterSet& config) : + millePedeLogFile_(config.getParameter("millePedeLogFile")), + millePedeResFile_(config.getParameter("millePedeResFile")), + + sigCut_ (config.getParameter("sigCut")), + Xcut_ (config.getParameter("Xcut")), + tXcut_ (config.getParameter("tXcut")), + Ycut_ (config.getParameter("Ycut")), + tYcut_ (config.getParameter("tYcut")), + Zcut_ (config.getParameter("Zcut")), + tZcut_ (config.getParameter("tZcut")), + maxMoveCut_ (config.getParameter("maxMoveCut")), + maxErrorCut_(config.getParameter("maxErrorCut")) +{ +} + +void MillePedeFileReader +::read() { + readMillePedeLogFile(); + readMillePedeResultFile(); +} + +bool MillePedeFileReader +::storeAlignments() { + return updateDB; +} + + + +//============================================================================= +//=== PRIVATE METHOD IMPLEMENTATION === +//============================================================================= + +void MillePedeFileReader +::readMillePedeLogFile() +{ + std::ifstream logFile; + logFile.open(millePedeLogFile_.c_str()); + + if (logFile.is_open()) { + edm::LogInfo("MillePedeFileReader") << "Reading millepede log-file"; + std::string line; + + while (getline(logFile, line)) { + std::string Nrec_string = "NREC ="; + + if (line.find(Nrec_string) != std::string::npos) { + std::istringstream iss(line); + std::string trash; + iss >> trash >> trash >> Nrec; + + if (Nrec < 25000) { + PedeSuccess = false; + Movements = false; + Error = false; + Significant = false; + updateDB = false; + } + } + } + + } else { + edm::LogError("MillePedeFileReader") << "Could not read millepede log-file."; + + PedeSuccess = false; + Movements = false; + Error = false; + Significant = false; + updateDB = false; + Nrec = 0; + } +} + +void MillePedeFileReader +::readMillePedeResultFile() +{ + std::ifstream resFile; + resFile.open(millePedeResFile_.c_str()); + + if (resFile.is_open()) { + edm::LogInfo("MillePedeFileReader") << "Reading millepede result-file"; + double Multiplier[6] = {10000.,10000.,10000.,1000000.,1000000.,1000000.}; + + std::string line; + getline(resFile, line); // drop first line + + while (getline(resFile, line)) { + std::istringstream iss(line); + + std::vector tokens; + std::string token; + while (iss >> token) { + tokens.push_back(token); + } + + if (tokens.size() > 4 /*3*/) { + PedeSuccess = true; + + int alignable = std::stoi(tokens[0]); + int alignableIndex = alignable % 10 - 1; + + double ObsMove = std::stof(tokens[3]) * Multiplier[alignableIndex]; + double ObsErr = std::stof(tokens[4]) * Multiplier[alignableIndex]; + + int det = -1; + + if (alignable >= 60 && alignable <= 69) { + det = 2; // TPBHalfBarrel (x+) + } else if (alignable >= 8780 && alignable <= 8789) { + det = 3; // TPBHalfBarrel (x-) + } else if (alignable >= 17520 && alignable <= 17529) { + det = 4; // TPEHalfCylinder (x+,z+) + } else if (alignable >= 22380 && alignable <= 22389) { + det = 5; // TPEHalfCylinder (x-,z+) + } else if (alignable >= 27260 && alignable <= 27269) { + det = 0; // TPEHalfCylinder (x+,z-) + } else if (alignable >= 32120 && alignable <= 32129) { + det = 1; //TPEHalfCylinder (x-,z-) + } else { + continue; + } + + if (alignableIndex == 0 && det >= 0 && det <= 5) { + Xobs[det] = ObsMove; + XobsErr[det] = ObsErr; + } else if (alignableIndex == 1 && det >= 0 && det <= 5) { + Yobs[det] = ObsMove; + YobsErr[det] = ObsErr; + } else if (alignableIndex == 2 && det >= 0 && det <= 5) { + Zobs[det] = ObsMove; + ZobsErr[det] = ObsErr; + } else if (alignableIndex == 3 && det >= 0 && det <= 5) { + tXobs[det] = ObsMove; + tXobsErr[det] = ObsErr; + } else if (alignableIndex == 4 && det >= 0 && det <= 5) { + tYobs[det] = ObsMove; + tYobsErr[det] = ObsErr; + } else if (alignableIndex == 5 && det >= 0 && det <= 5) { + tZobs[det] = ObsMove; + tZobsErr[det] = ObsErr; + } + + if (abs(ObsMove) > maxMoveCut_) { + Movements = false; + Error = false; + Significant = false; + updateDB = false; + HitMax = false; + continue; + + } else if (abs(ObsMove) > Cutoffs[alignableIndex]) { + Movements = true; + + if (abs(ObsErr) > maxErrorCut_) { + Error = false; + Significant = false; + updateDB = false; + HitErrorMax = true; + continue; + } else { + Error = true; + if (abs(ObsMove/ObsErr) > sigCut_) { + Significant = true; + } + } + } + updateDB = true; + } + } + } else { + edm::LogError("MillePedeFileReader") << "Could not read millepede result-file."; + + PedeSuccess = false; + Movements = false; + Error = false; + Significant = false; + updateDB = false; + Nrec = 0; + } +} + + + +#endif /* ALIGNMENT_MILLEPEDEALIGNMENTALGORITHM_INTERFACE_MILLEPEDEFILEREADER_H_ */ diff --git a/Alignment/MillePedeAlignmentAlgorithm/plugins/BuildFile.xml b/Alignment/MillePedeAlignmentAlgorithm/plugins/BuildFile.xml index 19cece5899f65..0a8101693b540 100644 --- a/Alignment/MillePedeAlignmentAlgorithm/plugins/BuildFile.xml +++ b/Alignment/MillePedeAlignmentAlgorithm/plugins/BuildFile.xml @@ -2,5 +2,6 @@ + + - diff --git a/Alignment/MillePedeAlignmentAlgorithm/plugins/MillePedeDQMModule.cc b/Alignment/MillePedeAlignmentAlgorithm/plugins/MillePedeDQMModule.cc new file mode 100644 index 0000000000000..1980b4371aab7 --- /dev/null +++ b/Alignment/MillePedeAlignmentAlgorithm/plugins/MillePedeDQMModule.cc @@ -0,0 +1,113 @@ +/** + * @package Alignment/MillePedeAlignmentAlgorithm + * @file MillePedeDQMModule.cc + * + * @author Max Stark (max.stark@cern.ch) + * @date Feb 19, 2016 + */ + + +/*** header-file ***/ +#include "Alignment/MillePedeAlignmentAlgorithm/plugins/MillePedeDQMModule.h" + +/*** ROOT objects ***/ +#include "TH1F.h" + + + +MillePedeDQMModule +::MillePedeDQMModule(const edm::ParameterSet& config) : + mpReaderConfig_( + config.getParameter("MillePedeFileReader") + ), + mpReader(mpReaderConfig_), + + sigCut_ (mpReaderConfig_.getParameter("sigCut")), + Xcut_ (mpReaderConfig_.getParameter("Xcut")), + tXcut_ (mpReaderConfig_.getParameter("tXcut")), + Ycut_ (mpReaderConfig_.getParameter("Ycut")), + tYcut_ (mpReaderConfig_.getParameter("tYcut")), + Zcut_ (mpReaderConfig_.getParameter("Zcut")), + tZcut_ (mpReaderConfig_.getParameter("tZcut")), + maxMoveCut_ (mpReaderConfig_.getParameter("maxMoveCut")), + maxErrorCut_ (mpReaderConfig_.getParameter("maxErrorCut")) +{ +} + +MillePedeDQMModule +::~MillePedeDQMModule() +{ +} + +//============================================================================= +//=== INTERFACE IMPLEMENTATION === +//============================================================================= + +void MillePedeDQMModule +::bookHistograms(DQMStore::IBooker& booker) +{ + edm::LogInfo("MillePedeDQMModule") << "Booking histograms"; + + booker.cd(); + booker.setCurrentFolder("AlCaReco/SiPixelAli/"); + + h_xPos = booker.book1D("Xpos", "#Delta X;;#mu m", 10, 0, 10.); + h_xRot = booker.book1D("Xrot", "#Delta #theta_{X};;#mu rad", 10, 0, 10.); + h_yPos = booker.book1D("Ypos", "#Delta Y;;#mu m", 10, 0., 10.); + h_yRot = booker.book1D("Yrot", "#Delta #theta_{Y};;#mu rad", 10, 0, 10.); + h_zPos = booker.book1D("Zpos", "#Delta Z;;#mu m", 10, 0., 10.); + h_zRot = booker.book1D("Zrot", "#Delta #theta_{Z};;#mu rad", 10, 0, 10.); + + booker.cd(); +} + + +void MillePedeDQMModule +::dqmEndJob(DQMStore::IBooker & booker, DQMStore::IGetter &) +{ + + bookHistograms(booker); + mpReader.read(); + fillExpertHistos(); +} + + + +//============================================================================= +//=== PRIVATE METHOD IMPLEMENTATION === +//============================================================================= + +void MillePedeDQMModule +::fillExpertHistos() +{ + + fillExpertHisto(h_xPos, Xcut_, sigCut_, maxMoveCut_, maxErrorCut_, mpReader.getXobs(), mpReader.getXobsErr()); + fillExpertHisto(h_xRot, tXcut_, sigCut_, maxMoveCut_, maxErrorCut_, mpReader.getTXobs(), mpReader.getTXobsErr()); + + fillExpertHisto(h_yPos, Ycut_, sigCut_, maxMoveCut_, maxErrorCut_, mpReader.getYobs(), mpReader.getYobsErr()); + fillExpertHisto(h_yRot, tYcut_, sigCut_, maxMoveCut_, maxErrorCut_, mpReader.getTYobs(), mpReader.getTYobsErr()); + + fillExpertHisto(h_zPos, Zcut_, sigCut_, maxMoveCut_, maxErrorCut_, mpReader.getZobs(), mpReader.getZobsErr()); + fillExpertHisto(h_zRot, tZcut_, sigCut_, maxMoveCut_, maxErrorCut_, mpReader.getTZobs(), mpReader.getTZobsErr()); + +} + +void MillePedeDQMModule +::fillExpertHisto(MonitorElement* histo, const double cut, const double sigCut, const double maxMoveCut, const double maxErrorCut, + std::array obs, std::array obsErr) +{ + TH1F* histo_0 = histo->getTH1F(); + + histo_0->SetMinimum(-(maxMoveCut_)); + histo_0->SetMaximum( maxMoveCut_); + + for (size_t i = 0; i < obs.size(); ++i) { + histo_0->SetBinContent(i+1, obs[i]); + histo_0->SetBinError(i+1, obsErr[i]); + } + histo_0->SetBinContent(8,cut); + histo_0->SetBinContent(9,sigCut); + histo_0->SetBinContent(10,maxMoveCut); + histo_0->SetBinContent(11,maxErrorCut); + +} diff --git a/Alignment/MillePedeAlignmentAlgorithm/plugins/MillePedeDQMModule.h b/Alignment/MillePedeAlignmentAlgorithm/plugins/MillePedeDQMModule.h new file mode 100644 index 0000000000000..c23fccd5f9b7e --- /dev/null +++ b/Alignment/MillePedeAlignmentAlgorithm/plugins/MillePedeDQMModule.h @@ -0,0 +1,97 @@ +#ifndef Alignment_MillePedeAlignmentAlgorithm_MillePedeDQMModule_h +#define Alignment_MillePedeAlignmentAlgorithm_MillePedeDQMModule_h + +/** + * @package Alignment/MillePedeAlignmentAlgorithm + * @file MillePedeDQMModule.h + * + * @author Max Stark (max.stark@cern.ch) + * @date Oct 26, 2015 + * + * @brief DQM Plotter for PCL-Alignment + */ + + + +/*** system includes ***/ +#include + +/*** core framework functionality ***/ +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/ServiceRegistry/interface/Service.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/EventSetup.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" + +/*** DQM ***/ + +#include "DQMServices/Core/interface/DQMEDHarvester.h" +#include "DQMServices/Core/interface/MonitorElement.h" + +/*** MillePede ***/ +#include "Alignment/MillePedeAlignmentAlgorithm/interface/MillePedeFileReader.h" + + + + +class MillePedeDQMModule : public DQMEDHarvester { + + //========================== PUBLIC METHODS ================================== + public: //==================================================================== + + MillePedeDQMModule(const edm::ParameterSet&); + virtual ~MillePedeDQMModule(); + + + + + + virtual void dqmEndJob(DQMStore::IBooker &, DQMStore::IGetter &) override; + //virtual void endRun(edm::Run const&, edm::EventSetup const&) override; + + //========================= PRIVATE METHODS ================================== + private: //=================================================================== + + void bookHistograms(DQMStore::IBooker&); + + void fillExpertHistos(); + + void fillExpertHisto(MonitorElement* histo, + const double cut, + const double sigCut, + const double maxMoveCut, + const double maxErrorCut, + std::array obs, + std::array obsErr); + + //========================== PRIVATE DATA ==================================== + //============================================================================ + + const edm::ParameterSet& mpReaderConfig_; + MillePedeFileReader mpReader; + + // Signifiance of movement must be above + double sigCut_; + // Cutoff in micro-meter & micro-rad + double Xcut_, tXcut_; + double Ycut_, tYcut_; + double Zcut_, tZcut_; + // maximum movement in micro-meter/rad + double maxMoveCut_; + double maxErrorCut_; + + // Histograms + MonitorElement* h_xPos; + MonitorElement* h_xRot; + MonitorElement* h_yPos; + MonitorElement* h_yRot; + MonitorElement* h_zPos; + MonitorElement* h_zRot; + +}; + +// define this as a plug-in +DEFINE_FWK_MODULE(MillePedeDQMModule); + +#endif /* Alignment_MillePedeAlignmentAlgorithm_MillePedeDQMModule_h */ diff --git a/Alignment/MillePedeAlignmentAlgorithm/python/MillePedeDQMModule_cff.py b/Alignment/MillePedeAlignmentAlgorithm/python/MillePedeDQMModule_cff.py new file mode 100644 index 0000000000000..0f9e16e2c136f --- /dev/null +++ b/Alignment/MillePedeAlignmentAlgorithm/python/MillePedeDQMModule_cff.py @@ -0,0 +1,7 @@ +import FWCore.ParameterSet.Config as cms + +import Alignment.MillePedeAlignmentAlgorithm.MillePedeFileReader_cfi as MillePedeFileReader_cfi + +SiPixelAliDQMModule = cms.EDAnalyzer("MillePedeDQMModule", + MillePedeFileReader = cms.PSet(MillePedeFileReader_cfi.MillePedeFileReader.clone()) + ) diff --git a/Alignment/MillePedeAlignmentAlgorithm/python/MillePedeFileReader_cfi.py b/Alignment/MillePedeAlignmentAlgorithm/python/MillePedeFileReader_cfi.py new file mode 100644 index 0000000000000..ccc747996eb32 --- /dev/null +++ b/Alignment/MillePedeAlignmentAlgorithm/python/MillePedeFileReader_cfi.py @@ -0,0 +1,21 @@ +import FWCore.ParameterSet.Config as cms + +MillePedeFileReader = cms.PSet( + millePedeLogFile = cms.string('millepede.log'), + millePedeResFile = cms.string('millepede.res'), + + # signifiance of movement must be above + sigCut = cms.double(2.5), + + # cutoff in micro-meter & micro-rad + Xcut = cms.double( 5.0), + tXcut = cms.double(30.0), # thetaX + Ycut = cms.double(10.0), + tYcut = cms.double(30.0), # thetaY + Zcut = cms.double(15.0), + tZcut = cms.double(30.0), # thetaZ + + # maximum movement in micro-meter/rad + maxMoveCut = cms.double(200.0), + maxErrorCut = cms.double( 10.0) +)