86 if (isCollector)
edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm] Collector mode";
106 edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm] Initializing...";
112 if (
iov.first().eventID().run()!=1 ||
iov.last().eventID().run()!=
MAX_VAL) {
114 <<
"@SUB=AlignmentProducer::applyDB"
116 <<
" with multiple IOVs in tag.\n"
117 <<
"Validity range is "
118 <<
iov.first().eventID().run() <<
" - " <<
iov.last().eventID().run();
141 for (std::vector<edm::ParameterSet>::const_iterator setiter =
theAPEParameterSet.begin();
144 std::vector<Alignable*> alignables;
149 if (alignParams.size() == 1 && alignParams[0] ==
std::string(
"selected")) {
157 std::vector<double> apeSPar = setiter->getParameter<std::vector<double> >(
"apeSPar");
158 std::vector<double> apeRPar = setiter->getParameter<std::vector<double> >(
"apeRPar");
159 std::string function = setiter->getParameter<std::string>(
"function");
161 if (apeSPar.size() != 3 || apeRPar.size() != 3)
162 throw cms::Exception(
"BadConfig") <<
"apeSPar and apeRPar must have 3 values each" << std::endl;
164 for (std::vector<double>::const_iterator
i = apeRPar.begin();
i != apeRPar.end(); ++
i) {
165 apeSPar.push_back(*
i);
168 if (
function == std::string(
"linear")) {
169 apeSPar.push_back(0.);
171 else if (
function == std::string(
"exponential")) {
172 apeSPar.push_back(1.);
174 else if (
function == std::string(
"step")) {
175 apeSPar.push_back(2.);
178 throw cms::Exception(
"BadConfig") <<
"APE function must be \"linear\" or \"exponential\"." << std::endl;
181 theAPEParameters.push_back(std::pair<std::vector<Alignable*>, std::vector<double> >(alignables, apeSPar));
191 for( std::vector<Alignable*>::const_iterator it=
theAlignables.begin();
205 int numAlignablesFromFile = theAlignablePositionsFromFile.size();
207 if (numAlignablesFromFile==0) {
228 edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm] Alignables Read "
229 << numAlignablesFromFile;
236 edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm] Iteration increased by one!";
239 edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm] Apply positions from file ...";
241 theAlignablePositionsFromFile,
ioerr);
245 edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm] Current Iteration number: "
330 edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm] Using survey constraint";
334 for (
unsigned int i = 0;
i < nAlignable; ++
i)
358 uservar->
jtvj += invCov;
359 uservar->
jtve += invCov * sensResid;
393 for(std::vector<Alignable*>::const_iterator
413 edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm::terminate] Aligned units: " << ialigned;
458 static const unsigned int hitDim = 1;
477 covmat = covmat + ipcovmat;
481 if (covmat[0][0] != 0.) xpull = (pos[0] - coor[0])/
sqrt(fabs(covmat[0][0]));
488 int npar = derivs2D.num_row();
492 for (
int ipar=0;ipar<npar;ipar++) {
493 for (
unsigned int idim=0;idim<hitDim;idim++) {
494 derivs[ipar][idim] = derivs2D[ipar][idim];
513 if (!useThisHit)
return false;
528 thisjtvj.assign(jtvjtmp);
530 thisjtve=derivs * covmat * (pos-coor);
533 hitresidual[0] = (pos[0] - coor[0]);
536 hitresidualT = hitresidual.T();
541 uservar->
jtvj += thisjtvj;
542 uservar->
jtve += thisjtve;
550 thischi2 = (hitresidualT *covmat *hitresidual)[0];
552 if (
verbose && ((thischi2/ static_cast<float>(uservar->
nhit)) >10.0) ) {
553 edm::LogWarning(
"Alignment") <<
"Added to Chi2 the number " << thischi2 <<
" having "
554 << uservar->
nhit <<
" dof " << std::endl <<
"X-resid "
555 << hitresidual[0] <<
" Y-resid "
556 << hitresidual[1] << std::endl <<
" Cov^-1 matr (covmat): [0][0]= "
557 << covmat[0][0] <<
" [0][1]= "
558 << covmat[0][1] <<
" [1][0]= "
559 << covmat[1][0] <<
" [1][1]= "
560 << covmat[1][1] << std::endl;
574 static const unsigned int hitDim = 2;
599 covmat = covmat + ipcovmat;
604 if (covmat[0][0] != 0.) xpull = (pos[0] - coor[0])/
sqrt(fabs(covmat[0][0]));
605 if (covmat[1][1] != 0.) ypull = (pos[1] - coor[1])/
sqrt(fabs(covmat[1][1]));
612 int npar = derivs2D.num_row();
616 for (
int ipar=0;ipar<npar;ipar++) {
617 for (
unsigned int idim=0;idim<hitDim;idim++) {
618 derivs[ipar][idim] = derivs2D[ipar][idim];
637 if (!useThisHit)
return false;
652 thisjtvj.assign(jtvjtmp);
654 thisjtve=derivs * covmat * (pos-coor);
657 hitresidual[0] = (pos[0] - coor[0]);
658 hitresidual[1] = (pos[1] - coor[1]);
665 hitresidualT = hitresidual.T();
669 uservar->
jtvj += thisjtvj;
670 uservar->
jtve += thisjtve;
678 thischi2 = (hitresidualT *covmat *hitresidual)[0];
680 if (
verbose && ((thischi2/ static_cast<float>(uservar->
nhit)) >10.0) ) {
681 edm::LogWarning(
"Alignment") <<
"Added to Chi2 the number " << thischi2 <<
" having "
682 << uservar->
nhit <<
" dof " << std::endl <<
"X-resid "
683 << hitresidual[0] <<
" Y-resid "
684 << hitresidual[1] << std::endl <<
" Cov^-1 matr (covmat): [0][0]= "
685 << covmat[0][0] <<
" [0][1]= "
686 << covmat[0][1] <<
" [1][0]= "
687 << covmat[1][0] <<
" [1][1]= "
688 << covmat[1][1] << std::endl;
708 for(itr=0;itr<
MAXREC;++itr){
731 for (ConstTrajTrackPairCollection::const_iterator it=tracks.begin();
738 float pt = track->
pt();
741 float p = track->
p();
744 float d0 = track->
d0();
745 float dz = track->
dz();
788 std::vector<const TransientTrackingRecHit*> hitvec;
789 std::vector<TrajectoryStateOnSurface> tsosvec;
792 std::vector<TrajectoryMeasurement> measurements = traj->
measurements();
793 for (std::vector<TrajectoryMeasurement>::iterator im=measurements.begin();
794 im!=measurements.end();
811 bool skiphit =
false;
822 const std::type_info &
type =
typeid(*rechit);
833 <<
"ERROR in <HIPAlignmentAlgorithm::run>: Dynamic cast of Strip RecHit failed! "
834 <<
"TypeId of the RecHit: " <<
className(*hit) <<std::endl;
847 <<
"ERROR in <HIPAlignmentAlgorithm::run>: Dynamic cast of Strip RecHit failed! "
849 <<
"TypeId of the TTRH: " <<
className(*hit) << std::endl;
862 <<
"ERROR in <HIPAlignmentAlgorithm::run>: Dynamic cast of Pixel RecHit failed! "
864 <<
"TypeId of the TTRH: " <<
className(*hit) << std::endl;
877 <<
"ERROR in <HIPAlignmentAlgorithm::run>: this hit should have been skipped!"
886 hitvec.push_back(hit);
887 tsosvec.push_back(tsos);
899 std::vector<TrajectoryStateOnSurface>::const_iterator itsos=tsosvec.begin();
900 std::vector<const TransientTrackingRecHit*>::const_iterator ihit=hitvec.begin();
903 while (itsos != tsosvec.end()) {
906 const GeomDet* det = (*ihit)->det();
908 uint32_t nhitDim = (*ihit)->dimension();
918 }
else if (nhitDim==2) {
944 std::ifstream inIterFile(filename.c_str(),
std::ios::in);
946 edm::LogError(
"Alignment") <<
"[HIPAlignmentAlgorithm::readIterationFile] ERROR! "
947 <<
"Unable to open Iteration file";
952 edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm::readIterationFile] "
953 <<
"Read last iteration number from file: " <<
result;
964 std::ofstream outIterFile((filename.c_str()),
std::ios::out);
966 edm::LogError(
"Alignment") <<
"[HIPAlignmentAlgorithm::writeIterationFile] ERROR: Unable to write Iteration file";
970 edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm::writeIterationFile] writing iteration number to file: " <<
iter;
986 edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm::setAlignmentPositionError] No APE applied";
991 edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm::setAlignmentPositionError] Apply APE!";
993 double apeSPar[3], apeRPar[3];
994 for (std::vector<std::pair<std::vector<Alignable*>, std::vector<double> > >::const_iterator alipars =
theAPEParameters.begin();
997 const std::vector<Alignable*> &alignables = alipars->first;
998 const std::vector<double> &pars = alipars->second;
1000 apeSPar[0] = pars[0];
1001 apeSPar[1] = pars[1];
1002 apeSPar[2] = pars[2];
1003 apeRPar[0] = pars[3];
1004 apeRPar[1] = pars[4];
1005 apeRPar[2] = pars[5];
1007 double function = pars[6];
1010 printf(
"APE: %u alignables\n", (
unsigned int)alignables.size());
1011 for (
int i=0;
i<21; ++
i ) {
1012 double apelinstest=
calcAPE(apeSPar,
i,0.);
1013 double apeexpstest=
calcAPE(apeSPar,
i,1.);
1014 double apelinrtest=
calcAPE(apeRPar,
i,0.);
1015 double apeexprtest=
calcAPE(apeRPar,
i,1.);
1016 printf(
"APE: iter slin sexp rlin rexp: %5d %12.5f %12.5f %12.5f %12.5f\n",
1017 i,apelinstest,apeexpstest,apelinrtest,apeexprtest);
1034 double diter=(double)iter;
1041 if (
function == 0.) {
1042 return std::max(par[1],par[0]+((par[1]-par[0])/par[2])*diter);
1044 else if (
function == 1.) {
1047 else if (
function == 2.) {
1048 int ipar2 = (int) par[2];
1049 int step = iter/ipar2;
1050 double dstep = (double) step;
1051 return std::max(0.0, par[0] - par[1]*dstep);
1070 snprintf(iterString,
sizeof(iterString),
"%i",
theIteration);
1072 tname.Append(iterString);
1074 theTree =
new TTree(tname,
"Eventwise tree");
1099 theTree2 =
new TTree(
"T2",
"Alignablewise tree");
1115 edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm::bookRoot] Survey trees booked.";
1118 theTree3 =
new TTree(tname,
"Survey Tree");
1124 edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm::bookRoot] Root trees booked.";
1143 for (std::vector<Alignable*>::const_iterator it=
theAlignables.begin();
1177 <<
"------------------------------------------------------------------------\n"
1178 <<
" ALIGNABLE: " << setw(6) << naligned
1180 <<
"hits: " << setw(4) <<
m2_Nhit
1181 <<
" type: " << setw(4) <<
m2_Type
1182 <<
" layer: " << setw(4) <<
m2_Layer
1183 <<
" id: " << setw(4) <<
m2_Id
1184 <<
" objId: " << setw(4) <<
m2_ObjId
1186 << std::fixed << std::setprecision(5)
1196 << setw(12) << pars[0]
1197 << setw(12) << pars[1]
1198 << setw(12) << pars[2]
1199 << setw(12) << pars[3]
1200 << setw(12) << pars[4]
1201 << setw(12) << pars[5];
1218 int nhit = uservar->
nhit;
1276 int npar = params.num_row();
1279 for (
int i=0;
i<npar;
i++) {
1281 else paramerr[
i] = params[
i];
1282 relerr[
i] =
abs(paramerr[i]/params[i]);
1331 edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm::collector] called for iteration "
1340 std::stringstream
ss;
1346 std::vector<AlignmentUserVariables*> uvarvec =
1351 edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm::collector] could not read user variable files for job "
1357 std::vector<AlignmentUserVariables*> uvarvecadd;
1358 std::vector<AlignmentUserVariables*>::const_iterator iuvarnew=uvarvec.begin();
1359 for (std::vector<Alignable*>::const_iterator it=
theAlignables.begin();
1378 uvarvecadd.push_back(uvar);
1401 snprintf(treeName,
sizeof(treeName),
"T1_%d", iter);
1403 TFile *jobfile =
new TFile(filename,
"READ");
1405 TTree *jobtree = (TTree*)jobfile->Get(treeName);
1407 static const int nmaxtrackperevent = 1000;
1408 int jobNtracks, jobNhitspertrack[nmaxtrackperevent], jobnhPXB[nmaxtrackperevent], jobnhPXF[nmaxtrackperevent],jobnhTIB[nmaxtrackperevent], jobnhTOB[nmaxtrackperevent],jobnhTID[nmaxtrackperevent], jobnhTEC[nmaxtrackperevent];
1409 float jobP[nmaxtrackperevent], jobPt[nmaxtrackperevent], jobEta[nmaxtrackperevent] , jobPhi[nmaxtrackperevent];
1410 float jobd0[nmaxtrackperevent], jobdz[nmaxtrackperevent] , jobChi2n[nmaxtrackperevent];
1412 jobtree->SetBranchAddress(
"Ntracks", &jobNtracks);
1413 jobtree->SetBranchAddress(
"Nhits", jobNhitspertrack);
1414 jobtree->SetBranchAddress(
"nhPXB", jobnhPXB);
1415 jobtree->SetBranchAddress(
"nhPXF", jobnhPXF);
1416 jobtree->SetBranchAddress(
"nhTIB", jobnhTIB);
1417 jobtree->SetBranchAddress(
"nhTOB", jobnhTOB);
1418 jobtree->SetBranchAddress(
"nhTID", jobnhTID);
1419 jobtree->SetBranchAddress(
"nhTEC", jobnhTEC);
1420 jobtree->SetBranchAddress(
"Pt", jobPt);
1421 jobtree->SetBranchAddress(
"P", jobP);
1422 jobtree->SetBranchAddress(
"d0", jobd0);
1423 jobtree->SetBranchAddress(
"dz", jobdz);
1424 jobtree->SetBranchAddress(
"Eta", jobEta);
1425 jobtree->SetBranchAddress(
"Phi", jobPhi);
1426 jobtree->SetBranchAddress(
"Chi2n", jobChi2n);
1428 for (ievent=0;ievent<jobtree->GetEntries();++ievent) {
1429 jobtree->GetEntry(ievent);
1439 m_Nhits[ntrk] = jobNhitspertrack[ntrk];
1440 m_Pt[ntrk] = jobPt[ntrk];
1441 m_P[ntrk] = jobP[ntrk];
1442 m_nhPXB[ntrk] = jobnhPXB[ntrk];
1443 m_nhPXF[ntrk] = jobnhPXF[ntrk];
1444 m_nhTIB[ntrk] = jobnhTIB[ntrk];
1445 m_nhTOB[ntrk] = jobnhTOB[ntrk];
1446 m_nhTID[ntrk] = jobnhTID[ntrk];
1447 m_nhTEC[ntrk] = jobnhTEC[ntrk];
1448 m_Eta[ntrk] = jobEta[ntrk];
1449 m_Phi[ntrk] = jobPhi[ntrk];
1450 m_Chi2n[ntrk] = jobChi2n[ntrk];
1451 m_d0[ntrk] = jobd0[ntrk];
1452 m_dz[ntrk] = jobdz[ntrk];
1455 edm::LogWarning(
"Alignment") <<
"[HIPAlignmentAlgorithm::fillEventwiseTree] Number of tracks in Eventwise tree exceeds MAXREC: "
1456 <<
m_Ntracks <<
" Skipping exceeding tracks.";
ClusterRef cluster() const
void attachUserVariables(const align::Alignables &alivec, const std::vector< AlignmentUserVariables * > &uvarvec, int &ierr)
Attach User Variables to given alignables.
double p() const
momentum vector magnitude
T getParameter(std::string const &) const
align::ID id() const
Return the ID of Alignable, i.e. DetId of 'first' component GeomDet(Unit).
T getUntrackedParameter(std::string const &, T const &) const
void terminate(const edm::EventSetup &setup)
Call at end of job.
ConstRecHitPointer const & recHit() const
double d0() const
dxy parameter in perigee convention (d0 = -dxy)
AlignableDetOrUnitPtr alignableFromGeomDet(const GeomDet *geomDet)
Returns AlignableDetOrUnitPtr corresponding to given GeomDet.
AlignmentParameterStore * theAlignmentParameterStore
std::pair< int, int > typeAndLayer(const Alignable *ali, const TrackerTopology *tTopo) const
Obtain type and layer from Alignable.
bool calcParameters(Alignable *ali)
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
TSOS combine(const TSOS &pTsos1, const TSOS &pTsos2) const
int fillEventwiseTree(const char *filename, int iter, int ierr)
void setAlignmentPositionError(const align::Alignables &alivec, double valshift, double valrot)
Set Alignment position error.
LocalPoint localPosition() const
static char const * tname
void writeAlignableOriginalPositions(const align::Alignables &alivec, const char *filename, int iter, bool validCheck, int &ierr)
write Alignable original (before misalignment) absolute positions
align::StructureType m2_ObjId
Geom::Phi< T > phi() const
double phi() const
azimuthal angle of momentum vector
void writeIterationFile(std::string filename, int iter)
void applyParameters(void)
Obsolete: Use AlignableNavigator::alignableDetFromDetId and alignableFromAlignableDet.
Alignable * alignableFromAlignableDet(const AlignableDetOrUnitPtr &adet) const
Get relevant Alignable from AlignableDet.
HIPUserVariables * clone(void) const
void applyAlignableAbsolutePositions(const align::Alignables &alis, const AlignablePositions &newpos, int &ierr)
apply absolute positions to alignables
LocalError positionError() const
int numberOfValidStripTOBHits() const
AlignmentParameters * alignmentParameters() const
Get the AlignmentParameters.
const ConstTrajTrackPairCollection & trajTrackPairs() const
define event information passed to algorithms
void writeHIPUserVariables(const Alignables &alivec, const char *filename, int iter, bool validCheck, int &ierr)
static align::StructureType stringToId(const char *)
std::vector< std::pair< std::vector< Alignable * >, std::vector< double > > > theAPEParameters
const AlgebraicVector & parameters(void) const
Get alignment parameters.
DataContainer const & measurements() const
AlignmentUserVariables * userVariables(void) const
Get pointer to user variables.
AlignablePositions readAlignableAbsolutePositions(const align::Alignables &alivec, const char *filename, int iter, int &ierr)
read Alignable current absolute positions
void clear()
remove all selected Alignables and geometrical restrictions
double eta() const
pseudorapidity of momentum vector
double calcAPE(double *par, int iter, double function)
void startNewLoop(void)
Called at start of new loop.
int numberOfValidPixelBarrelHits() const
std::vector< AlignmentUserVariables * > readHIPUserVariables(const Alignables &alivec, const char *filename, int iter, int &ierr)
void setAlignmentParameters(AlignmentParameters *dap)
Set the AlignmentParameters.
CLHEP::HepMatrix AlgebraicMatrix
HIPAlignmentAlgorithm(const edm::ParameterSet &cfg)
Constructor.
void setValid(bool v)
Set validity flag.
double pt() const
track transverse momentum
void initialize(const edm::EventSetup &setup, AlignableTracker *tracker, AlignableMuon *muon, AlignableExtras *extras, AlignmentParameterStore *store)
Call at beginning of job.
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
std::string siterationfile
Abs< T >::type abs(const T &t)
bool processHit2D(const AlignableDetOrUnitPtr &alidet, const Alignable *ali, const TrajectoryStateOnSurface &tsos, const TrackingRecHit *hit)
AlignableNavigator * theAlignableDetAccessor
int numberOfValidStripTIDHits() const
ClusterRef cluster() const
void fillRoot(const edm::EventSetup &setup)
int readIterationFile(std::string filename)
unsigned short numberOfValidHits() const
number of valid hits found
int numberOfValidStripTECHits() const
bool processHit1D(const AlignableDetOrUnitPtr &alidet, const Alignable *ali, const TrajectoryStateOnSurface &tsos, const TrackingRecHit *hit)
const LocalTrajectoryError & localError() const
void setAlignmentPositionError(void)
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
const AlignableSurface & surface() const
Return the Surface (global position and orientation) of the object.
TrajectoryStateOnSurface const & forwardPredictedState() const
Access to forward predicted state (from fitter or builder)
double dz() const
dz parameter (= dsz/cos(lambda)). This is the track z0 w.r.t (0,0,0) only if the refPoint is close to...
const align::Alignables & selectedAlignables() const
vector of alignables selected so far
int numSelected(void) const
Get number of selected parameters.
virtual TrackingRecHit const * hit() const
CLHEP::HepVector AlgebraicVector
void setUserVariables(AlignmentUserVariables *auv)
Set pointer to user variables.
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
virtual LocalError localPositionError() const =0
ClusterRef cluster() const
void writeAlignmentParameters(const align::Alignables &alivec, const char *filename, int iter, bool validCheck, int &ierr)
write AlignmentParameters
CompositeAlignmentParameters selectParameters(const std::vector< AlignableDet * > &alignabledets) const
T const * product() const
AlgebraicSymMatrix inverseCovariance() const
Get inverse of survey covariance wrt given structure type in constructor.
std::string smisalignedfile
int numberOfValidStripTIBHits() const
std::vector< edm::ParameterSet > theAPEParameterSet
align::StructureType m3_ObjId
int numberOfValidPixelEndcapHits() const
AlgebraicVector sensorResidual() const
std::vector< AlignableDetOrUnitPtr > alignablesFromHits(const std::vector< const TransientTrackingRecHit * > &hitvec)
Returns vector AlignableDetOrUnitPtr for given vector of Hits.
const AliClusterValueMap * clusterValueMap() const
bool isValid(void) const
Get validity flag.
CLHEP::HepSymMatrix AlgebraicSymMatrix
unsigned int addSelections(const edm::ParameterSet &pSet)
bool theFillTrackMonitoring
std::vector< AlignableAbsData > AlignablePositions
void writeAlignableAbsolutePositions(const align::Alignables &alivec, const char *filename, int iter, bool validCheck, int &ierr)
write Alignable current absolute positions
DetId geographicalId() const
virtual AlignmentParameters * cloneFromSelected(const AlgebraicVector &par, const AlgebraicSymMatrix &cov) const =0
bool detAndSubdetInMap(const DetId &detid) const
Given a DetId, returns true if DetIds with this detector and subdetector id are in the map (not neces...
Constructor of the full muon geometry.
ValidityInterval const & validityInterval() const
virtual LocalPoint localPosition() const =0
double theMaxRelParameterError
const PositionType & position() const
std::vector< align::StructureType > theLevels
double theMaxAllowedHitPull
const Time_t MAX_VAL(std::numeric_limits< Time_t >::max())
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
std::vector< Alignable * > theAlignables
Power< A, B >::type pow(const A &a, const B &b)
const align::Alignables & alignables(void) const
get all alignables
std::vector< ConstTrajTrackPair > ConstTrajTrackPairCollection
std::string className(const T &t)
TrajectoryStateOnSurface const & backwardPredictedState() const
Access to backward predicted state (from smoother)
int theMinimumNumberOfHits
std::string theCollectorPath
void run(const edm::EventSetup &setup, const EventInfo &eventInfo)
Run the algorithm.
virtual AlgebraicMatrix selectedDerivatives(const TrajectoryStateOnSurface &tsos, const AlignableDetOrUnitPtr &alidet) const
std::string sparameterfile