CMS 3D CMS Logo

MuonStandaloneAlgorithm Class Reference

This class contains all the useful information needed by the Alignment Algorithm. More...

#include <Alignment/MuonStandaloneAlgorithm/plugins/MuonStandaloneAlgorithm.h>

Inheritance diagram for MuonStandaloneAlgorithm:

edm::EDProducer edm::ProducerBase edm::ProductRegistryHelper

List of all members.

Public Member Functions

 MuonStandaloneAlgorithm (const edm::ParameterSet &pset)
 Constructor.
virtual void produce (edm::Event &event, const edm::EventSetup &eventSetup)
virtual ~MuonStandaloneAlgorithm ()
 Destructor.

Private Member Functions

void calculateError (AlgebraicSymMatrix55, TMatrixD *)
bool calculateJacobian (TrajectoryStateOnSurface, const GeomDet *, std::vector< double >, TMatrixD *)
bool Derivative (TrajectoryStateOnSurface, const GeomDet *, int, std::vector< double >, TMatrixD *)
RecHitVector doMatching (const reco::Track &, edm::Handle< DTRecSegment4DCollection > &, edm::Handle< CSCSegmentCollection > &, intDVector *, intDVector *, edm::ESHandle< GlobalTrackingGeometry > &)
FreeTrajectoryState produceFreeTrajectoryState (TrajectoryStateOnSurface, int, double, std::vector< double >)

Private Attributes

double curvStep
double longiStep
double phiStep
PropagatorthePropagator1
std::string theRecHits2DLabelCSC
std::string theRecHits4DLabelDT
std::string theSeedCollectionLabel
int theSelectorOfFirstPoint
edm::InputTag theSTAMuonTag
double thetaStep
double transStep
int verbosity

Static Private Attributes

static const int NDOFAlign = 6
static const int NDOFChamber = 4
static const int NDOFCoor = 4
static const int NDOFTrack = 5


Detailed Description

This class contains all the useful information needed by the Alignment Algorithm.

This class produces a collection of TrackForAlignment using as input Tracks and 4DSegments from AlcaReco.

Date
2008/06/17 10:22:15
Revision
1.6

Date
2007/08/02 15:15:35
Revision
1.3
Author:
P. Martinez Ruiz del Arbol, IFCA (CSIC-UC) <Pablo.Martinez@cern.ch>

P. Martinez Ruiz del Arbol, IFCA (CSIC-UC) <Pablo.Martinez@cern.ch>

Calculation of predicted states is performed here.

Date
2008/02/15 12:26:03
Revision
1.2
Author:
P. Martinez Ruiz del Arbol, IFCA (CSIC-UC) <Pablo.Martinez@cern.ch>

Definition at line 51 of file MuonStandaloneAlgorithm.h.


Constructor & Destructor Documentation

MuonStandaloneAlgorithm::MuonStandaloneAlgorithm ( const edm::ParameterSet pset  ) 

Constructor.

Definition at line 59 of file MuonStandaloneAlgorithm.cc.

References curvStep, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), longiStep, phiStep, theRecHits2DLabelCSC, theRecHits4DLabelDT, theSeedCollectionLabel, theSelectorOfFirstPoint, theSTAMuonTag, thetaStep, transStep, and verbosity.

00059                                                                         {
00060   
00061   theSTAMuonTag = pset.getParameter<edm::InputTag>("StandAloneTrackCollectionTag");
00062   
00063   theSeedCollectionLabel = pset.getUntrackedParameter<string>("MuonSeedCollectionLabel");
00064   
00065   theRecHits4DLabelDT = pset.getParameter<string>("recHits4DLabelDT");
00066   
00067   theRecHits2DLabelCSC = pset.getParameter<string>("recHits2DLabelCSC");
00068   
00069   theSelectorOfFirstPoint = pset.getParameter<int>("SelectorOfFirstPoint");
00070   
00071   verbosity = pset.getParameter<int>("Verbosity");
00072   
00073   curvStep = pset.getParameter<double>("CurvatureStep");
00074   
00075   thetaStep = pset.getParameter<double>("ThetaStep");
00076   
00077   phiStep = pset.getParameter<double>("PhiStep");
00078   
00079   transStep = pset.getParameter<double>("TransStep");
00080 
00081   longiStep = pset.getParameter<double>("LongiStep");
00082   
00084 //  ParameterSet serviceParameters =  pset.getParameter<ParameterSet>("ServiceParameters");
00085 //  theService = new MuonServiceProxy(serviceParameters);
00086 //  ParameterSet updatorPSet = pset.getParameter<ParameterSet>("UpdatorParameters");
00087 //  theUpdator = new MuonUpdatorAtVertex(updatorPSet,theService);
00088 
00089   produces<TrackForAlignmentCollection>();
00090   
00091 }

MuonStandaloneAlgorithm::~MuonStandaloneAlgorithm (  )  [virtual]

Destructor.

Definition at line 94 of file MuonStandaloneAlgorithm.cc.

00094                                                  {
00095 }


Member Function Documentation

void MuonStandaloneAlgorithm::calculateError ( AlgebraicSymMatrix55  a,
TMatrixD *  err 
) [private]

Definition at line 492 of file MuonStandaloneAlgorithm.cc.

References a, i, index, j, and NDOFCoor.

Referenced by produce().

00492                                                                                   {
00493 
00494   int index[] = {3,4,1,2};
00495   for(int i = 0; i < NDOFCoor; ++i) {
00496     for(int j = 0; j < NDOFCoor; ++j) {
00497       (*err)(i,j) = a(index[i],index[j]);
00498     }
00499   }
00500 }

bool MuonStandaloneAlgorithm::calculateJacobian ( TrajectoryStateOnSurface  innerTSOS_orig,
const GeomDet geomDet,
std::vector< double >  param,
TMatrixD *  Jacobian 
) [private]

Definition at line 483 of file MuonStandaloneAlgorithm.cc.

References counter(), Derivative(), and NDOFTrack.

Referenced by produce().

00483                                                                                                                                                             {
00484   
00485   for(int counter = 0; counter < NDOFTrack; counter++) {
00486     if(Derivative(innerTSOS_orig, geomDet, counter, param, Jacobian)==false) return false;
00487   }
00488   return true;
00489 }

bool MuonStandaloneAlgorithm::Derivative ( TrajectoryStateOnSurface  innerTSOS_orig,
const GeomDet geomDet,
int  parameter,
std::vector< double >  param,
TMatrixD *  Jacobian 
) [private]

Definition at line 426 of file MuonStandaloneAlgorithm.cc.

References curvStep, TrajectoryStateOnSurface::isValid(), TrajectoryStateOnSurface::localDirection(), TrajectoryStateOnSurface::localPosition(), longiStep, phiStep, produceFreeTrajectoryState(), Propagator::propagate(), cmsPerfCommons::Step, GeomDet::surface(), thePropagator1, thetaStep, transStep, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by calculateJacobian().

00426                                                                                                                                                                     {
00427   
00428   double Step;
00429   switch(parameter) {
00430   case 0:
00431     Step = curvStep; 
00432     break;
00433   case 1:
00434     Step = phiStep;
00435     break;
00436   case 2:
00437     Step = thetaStep;
00438     break;
00439   case 3:
00440     Step = transStep;
00441     break;
00442   case 4:
00443     Step = longiStep;
00444     break;
00445   default:
00446     Step = curvStep;
00447     break;
00448   }
00449   
00450   FreeTrajectoryState innerTSOS_plus = produceFreeTrajectoryState(innerTSOS_orig, parameter, Step, param);
00451   TrajectoryStateOnSurface destiny_plus = thePropagator1->propagate(innerTSOS_plus, geomDet->surface());
00452   if(!destiny_plus.isValid()) return false;
00453   
00454   FreeTrajectoryState innerTSOS_minus = produceFreeTrajectoryState(innerTSOS_orig, parameter, -Step, param);
00455   TrajectoryStateOnSurface destiny_minus = thePropagator1->propagate(innerTSOS_minus, geomDet->surface());
00456   if(!destiny_minus.isValid()) return false;
00457   
00458   if(parameter == 0) {
00459     LocalVector der_(destiny_plus.localPosition()-destiny_minus.localPosition());
00460     //X
00461     (*Jacobian)(0, parameter) = der_.x()/(2.0*Step*param.at(0));
00462     //Z
00463     (*Jacobian)(1, parameter) = der_.y()/(2.0*Step*param.at(0));
00464     //PHI
00465     (*Jacobian)(2, parameter) = (TMath::ATan2(destiny_plus.localDirection().z(), destiny_plus.localDirection().x())-TMath::ATan2(destiny_minus.localDirection().z(), destiny_minus.localDirection().x()))/(2.0*Step*param.at(0)); 
00466     //THETA
00467     (*Jacobian)(3, parameter) = (TMath::ATan2(destiny_plus.localDirection().z(), destiny_plus.localDirection().y())-TMath::ATan2(destiny_minus.localDirection().z(), destiny_minus.localDirection().y()))/(2.0*Step*param.at(0));
00468   } else {
00469     LocalVector der_(destiny_plus.localPosition()-destiny_minus.localPosition());
00470     //X
00471     (*Jacobian)(0, parameter) = der_.x()/(2.0*Step);
00472     //Z
00473     (*Jacobian)(1, parameter) = der_.y()/(2.0*Step);
00474     //PHI
00475     (*Jacobian)(2, parameter) = (TMath::ATan2(destiny_plus.localDirection().z(), destiny_plus.localDirection().x())-TMath::ATan2(destiny_minus.localDirection().z(), destiny_minus.localDirection().x()))/(2.0*Step); 
00476     //THETA
00477     (*Jacobian)(3, parameter) = (TMath::ATan2(destiny_plus.localDirection().z(), destiny_plus.localDirection().y())-TMath::ATan2(destiny_minus.localDirection().z(), destiny_minus.localDirection().y()))/(2.0*Step);
00478   }
00479   return true;
00480 }

RecHitVector MuonStandaloneAlgorithm::doMatching ( const reco::Track staTrack,
edm::Handle< DTRecSegment4DCollection > &  all4DSegmentsDT,
edm::Handle< CSCSegmentCollection > &  all4DSegmentsCSC,
intDVector indexCollectionDT,
intDVector indexCollectionCSC,
edm::ESHandle< GlobalTrackingGeometry > &  theTrackingGeometry 
) [private]

Definition at line 312 of file MuonStandaloneAlgorithm.cc.

References counter(), GeomDetEnumerators::CSC, GeomDetEnumerators::DT, TrackingRecHit::geographicalId(), edm::Ref< C, T, F >::get(), DetId::rawId(), reco::Track::recHit(), reco::Track::recHitsSize(), and GeomDet::subDetector().

Referenced by produce().

00312                                                                                                                                                                                                                                                                                                          {
00313 
00314   DTRecSegment4DCollection::const_iterator segmentDT;
00315   CSCSegmentCollection::const_iterator segmentCSC;
00316   
00317   std::vector<int> positionDT;
00318   std::vector<int> positionCSC;
00319   std::vector<TrackingRecHit *> my4DTrack;
00320   
00321   //Loop over the hits of the track
00322   for(int counter = 0; counter != staTrack.recHitsSize()-1; counter++) {
00323     
00324     TrackingRecHitRef myRef = staTrack.recHit(counter);
00325     const TrackingRecHit *rechit = myRef.get();
00326     const GeomDet* geomDet = theTrackingGeometry->idToDet(rechit->geographicalId());
00327     
00328     //It's a DT Hit
00329     if(geomDet->subDetector() == GeomDetEnumerators::DT) {
00330       
00331       //Take the layer associated to this hit
00332       DTLayerId myLayer(rechit->geographicalId().rawId());
00333       
00334       int NumberOfDTSegment = 0;
00335       //Loop over segments
00336       for(segmentDT = all4DSegmentsDT->begin(); segmentDT != all4DSegmentsDT->end(); ++segmentDT) {
00337         
00338         //By default the chamber associated to this Segment is new
00339         bool isNewChamber = true;
00340         
00341         //Loop over segments already included in the vector of segments in the actual track
00342         for(std::vector<int>::iterator positionIt = positionDT.begin(); positionIt != positionDT.end(); positionIt++) {
00343           
00344           //If this segment has been used before isNewChamber = false
00345           if(NumberOfDTSegment == *positionIt) isNewChamber = false;
00346         }
00347         
00348         //Loop over vectors of segments associated to previous tracks
00349         for(std::vector<std::vector<int> >::iterator collect = indexCollectionDT->begin(); collect != indexCollectionDT->end(); ++collect) {
00350           
00351           //Loop over segments associated to a track
00352           for(std::vector<int>::iterator positionIt = (*collect).begin(); positionIt != (*collect).end(); positionIt++) {
00353             
00354             //If this segment was used in a previos track then isNewChamber = false
00355             if(NumberOfDTSegment == *positionIt) isNewChamber = false;
00356           }
00357         }
00358         
00359         //If the chamber is new
00360         if(isNewChamber) {
00361           
00362           DTChamberId myChamber((*segmentDT).geographicalId().rawId());
00363           //If the layer of the hit belongs to the chamber of the 4D Segment
00364           if(myLayer.wheel() == myChamber.wheel() && myLayer.station() == myChamber.station() && myLayer.sector() == myChamber.sector()) {
00365             
00366             //push position of the segment and tracking rechit
00367             positionDT.push_back(NumberOfDTSegment);
00368             my4DTrack.push_back((TrackingRecHit *) &(*segmentDT));
00369           }
00370         }
00371         NumberOfDTSegment++;
00372       }
00373       //In case is a CSC
00374     } else if (geomDet->subDetector() == GeomDetEnumerators::CSC) {
00375       
00376       //Take the layer associated to this hit
00377       CSCDetId myLayer(rechit->geographicalId().rawId());
00378       
00379       int NumberOfCSCSegment = 0;
00380       //Loop over 4Dsegments
00381       for(segmentCSC = all4DSegmentsCSC->begin(); segmentCSC != all4DSegmentsCSC->end(); segmentCSC++) {
00382         
00383         //By default the chamber associated to the segment is new
00384         bool isNewChamber = true;
00385         
00386         //Loop over segments in the current track
00387         for(std::vector<int>::iterator positionIt = positionCSC.begin(); positionIt != positionCSC.end(); positionIt++) {
00388           
00389           //If this segment has been used then newchamber = false
00390           if(NumberOfCSCSegment == *positionIt) isNewChamber = false;
00391         }
00392         //Loop over vectors of segments in previous tracks
00393         for(std::vector<std::vector<int> >::iterator collect = indexCollectionCSC->begin(); collect != indexCollectionCSC->end(); ++collect) {
00394           
00395           //Loop over segments in a track
00396           for(std::vector<int>::iterator positionIt = (*collect).begin(); positionIt != (*collect).end(); positionIt++) {
00397             
00398             //If the segment was used in a previous track isNewChamber = false
00399             if(NumberOfCSCSegment == *positionIt) isNewChamber = false;
00400           }
00401         }
00402         //If the chamber is new
00403         if(isNewChamber) {
00404           
00405           CSCDetId myChamber((*segmentCSC).geographicalId().rawId());
00406           //If the chambers are the same
00407           if(myLayer.chamberId() == myChamber.chamberId()) {
00408             //push
00409             positionCSC.push_back(NumberOfCSCSegment);
00410             my4DTrack.push_back((TrackingRecHit *) &(*segmentCSC));
00411           }
00412         }
00413         NumberOfCSCSegment++;
00414       }
00415     }
00416   }
00417   
00418   indexCollectionDT->push_back(positionDT);
00419   indexCollectionCSC->push_back(positionCSC);
00420   
00421   return my4DTrack;
00422 }

void MuonStandaloneAlgorithm::produce ( edm::Event event,
const edm::EventSetup eventSetup 
) [virtual]

Implements edm::EDProducer.

Definition at line 98 of file MuonStandaloneAlgorithm.cc.

References alongMomentum, calculateError(), calculateJacobian(), TrackForAlignment::CalculateMatrizes(), GenMuonPlsPt100GeV_cfg::cout, doMatching(), lat::endl(), cond::Error, TrajectoryStateOnSurface::freeState(), edm::EventSetup::get(), TrajectoryStateOnSurface::globalDirection(), TrajectoryStateOnSurface::globalParameters(), TrajectoryStateOnSurface::hasError(), reco::TransientTrack::impactPointState(), reco::TransientTrack::innermostMeasurementState(), TrackForAlignment::insert(), TrackForAlignment::isValid(), TrajectoryStateOnSurface::isValid(), TrajectoryStateOnSurface::localDirection(), TrajectoryStateOnSurface::localError(), TrajectoryStateOnSurface::localPosition(), PerigeeTrajectoryParameters::longitudinalImpactParameter(), LocalTrajectoryError::matrix(), FreeTrajectoryState::momentum(), NDOFCoor, NDOFTrack, p, phi, PerigeeTrajectoryParameters::phi(), FreeTrajectoryState::position(), GlobalTrajectoryParameters::position(), Propagator::propagate(), TrackForAlignment::setP(), TrackForAlignment::setPerigeeParameters(), SteppingHelixPropagator_cfi::SteppingHelixPropagator, GeomDet::surface(), thePropagator1, theRecHits2DLabelCSC, theRecHits4DLabelDT, theSelectorOfFirstPoint, theSTAMuonTag, PerigeeTrajectoryParameters::theta(), theta, GeomDet::toGlobal(), track, TrackForAlignment::trackValid, PerigeeTrajectoryParameters::transverseCurvature(), PerigeeTrajectoryParameters::transverseImpactParameter(), verbosity, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

00098                                                                                 {
00099   
00100   if(verbosity > 0) {
00101     cout << "<MuonStandaloneAlgorithm> Run: " << event.id().run() << " Event: " << event.id().event() << endl;
00102   }
00103   
00104   // Get the RecTrack collection from the event
00105   Handle<reco::TrackCollection> staTracks;
00106   event.getByLabel(theSTAMuonTag, staTracks);
00107   
00108   // Get the magnetic field
00109   ESHandle<MagneticField> theMGField;
00110   eventSetup.get<IdealMagneticFieldRecord>().get(theMGField);
00111 
00112   // Get the tracking geometry
00113   ESHandle<GlobalTrackingGeometry> theTrackingGeometry;
00114   eventSetup.get<GlobalTrackingGeometryRecord>().get(theTrackingGeometry);
00115 
00116   
00117   // Get the 4D DTSegments
00118   edm::Handle<DTRecSegment4DCollection> all4DSegmentsDT;
00119   event.getByLabel(theRecHits4DLabelDT, all4DSegmentsDT);
00120   DTRecSegment4DCollection::const_iterator segmentDT;
00121 
00122   // Get the 4D CSCSegments
00123   edm::Handle<CSCSegmentCollection> all4DSegmentsCSC;
00124   event.getByLabel(theRecHits2DLabelCSC, all4DSegmentsCSC);
00125   CSCSegmentCollection::const_iterator segmentCSC;
00126 
00127 
00128   if(verbosity > 1) {
00129     cout << "<MuonStandaloneAlgorithm> List of DTSegments found in Local Reconstruction" << endl;
00130     cout << "Number: " << all4DSegmentsDT->size() << endl;
00131     for (segmentDT = all4DSegmentsDT->begin(); segmentDT != all4DSegmentsDT->end(); ++segmentDT){
00132       const GeomDet* geomDet = theTrackingGeometry->idToDet((*segmentDT).geographicalId());
00133       cout << "<MuonStandaloneAlgorithm> " << geomDet->toGlobal((*segmentDT).localPosition()) << endl;
00134       cout << "<MuonStandaloneAlgorithm> Local " << (*segmentDT).localPosition() << std::endl;
00135     }
00136     cout << "<MuonStandaloneAlgorithm> List of CSCSegments found in Local Reconstruction" << endl;
00137     for (segmentCSC = all4DSegmentsCSC->begin(); segmentCSC != all4DSegmentsCSC->end(); ++segmentCSC){
00138       const GeomDet* geomDet = theTrackingGeometry->idToDet((*segmentCSC).geographicalId());
00139       cout << "<MuonStandaloneAlgorithm>" << geomDet->toGlobal((*segmentCSC).localPosition()) << endl;
00140     }
00141   }
00142   
00143   //Allocate collection of tracks
00144   auto_ptr<TrackForAlignmentCollection> aliTracks(new TrackForAlignmentCollection());
00145   
00146   //Create the propagator
00147   thePropagator1 = new SteppingHelixPropagator(&*theMGField, alongMomentum);
00148     
00149   //Vectors used to perform the matching between Segments and hits from Track
00150   intDVector indexCollectionDT;
00151   intDVector indexCollectionCSC;
00152 
00153   if(verbosity > 0) {
00154     cout << "<MuonStandaloneAlgorithm> Reconstructed tracks: " << staTracks->size() << endl;
00155   }
00156   reco::TrackCollection::const_iterator staTrack;
00157   for (staTrack = staTracks->begin(); staTrack != staTracks->end(); ++staTrack){
00158     
00159     reco::TransientTrack track(*staTrack,&*theMGField,theTrackingGeometry); 
00160     TrackForAlignment *mTrack = new TrackForAlignment();
00161     
00162     RecHitVector my4DTrack = this->doMatching(*staTrack, all4DSegmentsDT, all4DSegmentsCSC, &indexCollectionDT, &indexCollectionCSC, theTrackingGeometry);
00163 
00164     //Take the first state: impactpointstate or innerpointstate
00165     TrajectoryStateOnSurface innerTSOS = track.impactPointState();
00166     
00167     if(theSelectorOfFirstPoint == 1) {
00168       innerTSOS = track.innermostMeasurementState();
00169     }
00170     //If the state is valid
00171     if(innerTSOS.isValid()) {
00172       //Fill the Perigee Values and Pt Values
00173 
00174       TrajectoryStateOnSurface innerTSOS_orig = innerTSOS;
00175       double p = TMath::Sqrt(innerTSOS_orig.freeState()->momentum().x()*
00176                              innerTSOS_orig.freeState()->momentum().x()+
00177                              innerTSOS_orig.freeState()->momentum().y()*
00178                              innerTSOS_orig.freeState()->momentum().y()+
00179                              innerTSOS_orig.freeState()->momentum().z()*
00180                              innerTSOS_orig.freeState()->momentum().z());
00181       double pt = TMath::Sqrt(innerTSOS_orig.freeState()->momentum().x()*
00182                               innerTSOS_orig.freeState()->momentum().x()+
00183                               innerTSOS_orig.freeState()->momentum().y()*
00184                               innerTSOS_orig.freeState()->momentum().y());
00185       
00186       PerigeeConversions myPerigeeConverter;
00187       PerigeeTrajectoryParameters myParam = myPerigeeConverter.ftsToPerigeeParameters(*innerTSOS_orig.freeState(), innerTSOS_orig.globalParameters().position(), pt);
00188       double aCurv = myParam.transverseCurvature();
00189       double theta = myParam.theta();
00190       double phi = myParam.phi();
00191       double trans = myParam.transverseImpactParameter();
00192       double longi = myParam.longitudinalImpactParameter();
00193 
00194       //Insert the values into the track
00195       
00196       mTrack->setP(p, pt);
00197       mTrack->setPerigeeParameters(aCurv, theta, phi, trans, longi);
00198       std::vector<double> param;
00199       param.push_back(aCurv); param.push_back(phi); param.push_back(theta); param.push_back(trans); param.push_back(longi); param.push_back(pt);
00200       std::cout << "Values: " << pt << " " << p << " " << aCurv << " " << pt*aCurv << " " << p*aCurv << std::endl; 
00201       //Loop over Associated segments
00202       for(std::vector<TrackingRecHit *>::iterator rechit = my4DTrack.begin(); rechit != my4DTrack.end(); ++rechit) {
00203         const GeomDet* geomDet = theTrackingGeometry->idToDet((*rechit)->geographicalId());
00204         int id = (*rechit)->geographicalId().subdetId();
00205         int station;
00206         if(id == 1) {
00207           DTChamberId mCham((*rechit)->geographicalId().rawId());
00208           station = mCham.station();
00209         } else {
00210           CSCDetId mCham((*rechit)->geographicalId().rawId());
00211           station = mCham.station();
00212         }
00213         
00214         
00215         //Otherwise the propagator could throw an exception
00216         const Plane* pDest = dynamic_cast<const Plane*>(&geomDet->surface());
00217         const Cylinder* cDest = dynamic_cast<const Cylinder*>(&geomDet->surface());
00218         if(pDest != 0 || cDest != 0) {  
00219           
00220           TrajectoryStateOnSurface destiny = thePropagator1->propagate(*(innerTSOS.freeState()), geomDet->surface());
00221           if(!destiny.isValid() || !destiny.hasError()) {
00222             continue;
00223           }
00224           
00225           if(verbosity > 1) {
00226             cout << "<MuonStandaloneAlgorithm> Segment: " << geomDet->toGlobal((*rechit)->localPosition()) << endl;
00227             cout << "<MuonStandaloneAlgorithm> Segment local: " << (*rechit)->localPosition() << endl;
00228             cout << "<MuonStandaloneAlgorithm> Predicted: " << destiny.freeState()->position() << endl;
00229             cout << "<MuonStandaloneAlgorithm> Predicted local: " << destiny.localPosition() << endl;
00230           }
00231           //Calculation of derivatives
00232           TMatrixD Jacobian(NDOFCoor, NDOFTrack); 
00233           if(calculateJacobian(innerTSOS_orig, geomDet, param, &Jacobian) == false) continue;
00234           TMatrixD Error(NDOFCoor, NDOFCoor);
00235           calculateError(destiny.localError().matrix(), &Error);
00236           
00237           PointForAlignment alignP;
00238           alignP.setPointForAlignment((*rechit)->geographicalId().rawId(), id, station, 
00239                                       geomDet->toGlobal((*rechit)->localPosition()),
00240                                       geomDet->toGlobal(((RecSegment *)(*rechit))->localDirection()),
00241                                       (*rechit)->localPosition(),
00242                                       (*rechit)->localPositionError(),
00243                                       ((RecSegment *)(*rechit))->localDirection(),
00244                                       ((RecSegment *)(*rechit))->localDirectionError(),
00245                                       destiny.freeState()->position(),
00246                                       destiny.globalDirection(),
00247                                       destiny.localPosition(),
00248                                       destiny.localDirection(),
00249                                       Jacobian, Error);
00250           mTrack->insert(alignP);
00251           innerTSOS = destiny;
00252         } else {
00253           cout << "<MuonStandaloneAlgorithm> Exception in propagator catched" << endl;
00254           continue;
00255         }
00256       }
00257       mTrack->isValid();
00258       if(mTrack->trackValid == true) {
00259         mTrack->CalculateMatrizes();
00260         aliTracks->push_back(*mTrack);
00261       }
00262     }
00263   }
00264   event.put(aliTracks);
00265   delete thePropagator1;
00266 }

FreeTrajectoryState MuonStandaloneAlgorithm::produceFreeTrajectoryState ( TrajectoryStateOnSurface  state,
int  parameter,
double  step,
std::vector< double >  param 
) [private]

Definition at line 269 of file MuonStandaloneAlgorithm.cc.

References PerigeeConversions::chargeFromPerigee(), TrajectoryStateOnSurface::globalParameters(), GlobalTrajectoryParameters::magneticField(), PerigeeConversions::momentumFromPerigee(), phi, GlobalTrajectoryParameters::position(), PerigeeConversions::positionFromPerigee(), HLT_VtxMuL3::result, and theta.

Referenced by Derivative().

00269                                                                                                                                                            {
00270   
00271   double aCurv = param.at(0);
00272   double phi = param.at(1);
00273   double theta = param.at(2);
00274   double trans = param.at(3);
00275   double longi = param.at(4);
00276   double pt = param.at(5);
00277 
00278   switch(parameter) {
00279   case 0:
00280     aCurv += (step*aCurv);
00281     break;
00282   case 1:
00283     phi += step;
00284     break;
00285   case 2:
00286     theta += step;
00287     break;
00288   case 3:
00289     trans += step;
00290     break;
00291   case 4:
00292     longi += step;
00293     break;
00294   default:
00295     break;
00296   }           
00297   PerigeeTrajectoryParameters result(aCurv, theta, phi, trans, longi, true);
00298   PerigeeConversions myPerigeeConverter;
00299   GlobalTrajectoryParameters myGlobalParam(myPerigeeConverter.positionFromPerigee(result, state.globalParameters().position()), myPerigeeConverter.momentumFromPerigee(result, pt*(param.at(0)/aCurv), state.globalParameters().position()), myPerigeeConverter.chargeFromPerigee(result), &(state.globalParameters().magneticField()));
00300   
00301   FreeTrajectoryState *myFree = new FreeTrajectoryState(myGlobalParam);
00302   
00303   return *myFree; 
00304 }


Member Data Documentation

double MuonStandaloneAlgorithm::curvStep [private]

Definition at line 84 of file MuonStandaloneAlgorithm.h.

Referenced by Derivative(), and MuonStandaloneAlgorithm().

double MuonStandaloneAlgorithm::longiStep [private]

Definition at line 88 of file MuonStandaloneAlgorithm.h.

Referenced by Derivative(), and MuonStandaloneAlgorithm().

const int MuonStandaloneAlgorithm::NDOFAlign = 6 [static, private]

Definition at line 93 of file MuonStandaloneAlgorithm.h.

const int MuonStandaloneAlgorithm::NDOFChamber = 4 [static, private]

Definition at line 94 of file MuonStandaloneAlgorithm.h.

const int MuonStandaloneAlgorithm::NDOFCoor = 4 [static, private]

Definition at line 95 of file MuonStandaloneAlgorithm.h.

Referenced by calculateError(), and produce().

const int MuonStandaloneAlgorithm::NDOFTrack = 5 [static, private]

Definition at line 92 of file MuonStandaloneAlgorithm.h.

Referenced by calculateJacobian(), and produce().

double MuonStandaloneAlgorithm::phiStep [private]

Definition at line 86 of file MuonStandaloneAlgorithm.h.

Referenced by Derivative(), and MuonStandaloneAlgorithm().

Propagator* MuonStandaloneAlgorithm::thePropagator1 [private]

Definition at line 90 of file MuonStandaloneAlgorithm.h.

Referenced by Derivative(), and produce().

std::string MuonStandaloneAlgorithm::theRecHits2DLabelCSC [private]

Definition at line 81 of file MuonStandaloneAlgorithm.h.

Referenced by MuonStandaloneAlgorithm(), and produce().

std::string MuonStandaloneAlgorithm::theRecHits4DLabelDT [private]

Definition at line 80 of file MuonStandaloneAlgorithm.h.

Referenced by MuonStandaloneAlgorithm(), and produce().

std::string MuonStandaloneAlgorithm::theSeedCollectionLabel [private]

Definition at line 79 of file MuonStandaloneAlgorithm.h.

Referenced by MuonStandaloneAlgorithm().

int MuonStandaloneAlgorithm::theSelectorOfFirstPoint [private]

Definition at line 82 of file MuonStandaloneAlgorithm.h.

Referenced by MuonStandaloneAlgorithm(), and produce().

edm::InputTag MuonStandaloneAlgorithm::theSTAMuonTag [private]

Definition at line 77 of file MuonStandaloneAlgorithm.h.

Referenced by MuonStandaloneAlgorithm(), and produce().

double MuonStandaloneAlgorithm::thetaStep [private]

Definition at line 85 of file MuonStandaloneAlgorithm.h.

Referenced by Derivative(), and MuonStandaloneAlgorithm().

double MuonStandaloneAlgorithm::transStep [private]

Definition at line 87 of file MuonStandaloneAlgorithm.h.

Referenced by Derivative(), and MuonStandaloneAlgorithm().

int MuonStandaloneAlgorithm::verbosity [private]

Definition at line 83 of file MuonStandaloneAlgorithm.h.

Referenced by MuonStandaloneAlgorithm(), and produce().


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:28:51 2009 for CMSSW by  doxygen 1.5.4