90 produces<edm::DetSetVector<SiStripRawDigi> >(
"FineDelaySelection");
121 uint32_t rootDetId = 0;
122 uint32_t maskDetId = 0;
132 rootDetId =
TIDDetId(substructure>0 ? 2 : 1,
abs(substructure),0,0,0,0).
rawId();
144 rootDetId =
TECDetId(substructure>0 ? 2 : 1,
abs(substructure),0,0,0,0,0).
rawId();
149 return std::make_pair(maskDetId,rootDetId);
154 if(substructure==0xff)
return detId(tracker,tk,trajVec,0,0);
156 std::pair<uint32_t, uint32_t> mask =
deviceMask(subdet,substructure);
158 return detId(tracker,tk,trajVec,mask.first,mask.second);
163 bool onDisk = ((maskDetId==
TIDDetId(3,15,0,0,0,0).
rawId())||(maskDetId==
TECDetId(3,15,0,0,0,0,0).
rawId())) ;
164 std::vector< std::pair<uint32_t,std::pair<double, double> > >
result;
165 std::vector<uint32_t> usedDetids;
167 std::vector<std::pair< std::pair<DetId, LocalPoint> ,
float> > hitangle;
171 for(std::vector<Trajectory>::const_iterator traj = trajVec.begin(); traj< trajVec.end(); ++traj) {
173 ((traj->lastMeasurement().recHit()->geographicalId().rawId() == (*(tk->
recHitsEnd()-1))->geographicalId().rawId()) &&
174 ( traj->lastMeasurement().recHit()->localPosition().x() == (*(tk->
recHitsEnd()-1))->localPosition().x()) ) ||
175 ((traj->firstMeasurement().recHit()->geographicalId().rawId() == (*(tk->
recHitsEnd()-1))->geographicalId().rawId()) &&
176 ( traj->firstMeasurement().recHit()->localPosition().x() == (*(tk->
recHitsEnd()-1))->localPosition().x()) ) ) {
187 LogDebug(
"DetId") <<
"number of hits for the track: " << hitangle.size();
188 std::vector<std::pair< std::pair<DetId, LocalPoint> ,
float> >::iterator iter;
190 for(iter=hitangle.begin();iter!=hitangle.end();iter++){
195 LogDebug(
"DetId") <<
"check the detid: " << std::hex << (iter->first.first.rawId()) <<
" vs " << rootDetId
196 <<
" with a mask of " << maskDetId << std::dec << std::endl;
198 if(((iter->first.first.rawId() & maskDetId) != rootDetId))
continue;
199 if(
std::find(usedDetids.begin(),usedDetids.end(),iter->first.first.rawId())!=usedDetids.end())
continue;
201 LogDebug(
"DetId") <<
"check the angle: " << fabs((iter->second));
204 std::pair<uint32_t,std::pair<double, double> > el;
205 std::pair<double, double> subel;
206 el.first = iter->first.first.rawId();
211 double trackParameters[5];
225 subel.second = iter->second;
228 result.push_back(el);
229 usedDetids.push_back(el.first);
237 if((*it)->geographicalId().rawId() == det_id) {
238 return (*it)->isValid();
248 std::pair<const SiStripCluster*,double>
result(
NULL,0.);
249 double hitStrip = -1;
253 LogDebug(
"closestCluster") <<
"(*it)->geographicalId().rawId() vs det_id" << (*it)->geographicalId().rawId() <<
" " << det_id;
255 if((*it)->geographicalId().rawId() == det_id) {
256 if(!(*it)->isValid())
continue;
257 LogDebug(
"closestCluster") <<
" using the single mono hit";
300 LogDebug(
"closestCluster") <<
" hit strip = " << hitStrip;
301 if(hitStrip<0)
return result;
305 if(DSViter->id==det_id) {
308 minStrip = minStrip<0 ? 0 : minStrip;
310 maxStrip = maxStrip>=nstrips ? nstrips-1 : maxStrip;
314 if(digiIt->strip()>=minStrip && rangeStart == DSViter->
end()) rangeStart = digiIt;
315 if(digiIt->strip()<=maxStrip) rangeStop = digiIt;
317 if(rangeStart != DSViter->
end()) {
318 if(rangeStop !=DSViter->
end()) ++rangeStop;
320 LogDebug(
"closestCluster") <<
"build a fake cluster ";
322 result.first = newCluster;
323 result.second = fabs(newCluster->
barycenter()-hitStrip);
331 if(DSViter->id()==det_id) {
332 LogDebug(
"closestCluster") <<
" detset with the right detid. ";
336 result.second = 1000.;
338 double dist = fabs(iter->barycenter()-hitStrip);
339 if(dist<result.second) { result.second = dist; result.first = &(*iter); }
368 std::vector< edm::DetSet<SiStripRawDigi> >
output;
391 std::vector<Trajectory> trajVec;
394 trajVec = *(TrajectoryCollection.
product());
396 for(reco::TrackCollection::const_iterator itrack =
tracks->begin(); itrack<
tracks->end(); itrack++) {
398 if((itrack->px()*itrack->px()+itrack->py()*itrack->py()+itrack->pz()*itrack->pz())<
minTrackP2_)
continue;
400 std::vector< std::pair<uint32_t,std::pair<double,double> > > intersections;
411 int32_t layerIdx = (layerCode&0xF)*(((layerCode>>4)&0x3) ? -1 : 1);
412 intersections =
detId(*
tracker,&(*itrack),trajVec,subdet,layerIdx);
417 LogDebug(
"produce") <<
" Found " << intersections.size() <<
" interesting intersections." << std::endl;
418 for(std::vector< std::pair<uint32_t,std::pair<double,double> > >::iterator it = intersections.begin();it<intersections.end();it++) {
419 std::pair<const SiStripCluster*,double> candidateCluster =
closestCluster(*
tracker,&(*itrack),it->first,*clusterSet,*hitSet);
420 if(candidateCluster.first) {
421 LogDebug(
"produce") <<
" Found a cluster."<< std::endl;
424 LogDebug(
"produce") <<
" The cluster is close enough."<< std::endl;
427 const std::vector< uint8_t >& amplitudes = candidateCluster.first->amplitudes();
428 uint8_t leadingCharge = 0;
429 uint8_t leadingStrip = candidateCluster.first->firstStrip();
430 uint8_t leadingPosition = 0;
431 for(std::vector< uint8_t >::const_iterator amplit = amplitudes.begin();amplit<amplitudes.end();amplit++,leadingStrip++) {
432 if(leadingCharge<*amplit) {
433 leadingCharge = *amplit;
434 leadingPosition = leadingStrip;
439 std::vector< edm::DetSet<SiStripRawDigi> >::iterator newdsit =
output.begin();
442 if(newdsit==
output.end()) {
448 LogDebug(
"produce") <<
" New Hit... TOF:" << it->second.first <<
", charge: " << int(leadingCharge)
449 <<
" at " << int(leadingPosition) <<
"." << std::endl
450 <<
"Angular correction: " << it->second.second
451 <<
" giving a final value of " << int(leadingCharge*fabs(it->second.second))
452 <<
" for fed key = " <<
connectionMap_[it->first] <<
" (detid=" << it->first <<
")" ;
454 if(leadingCharge<255) {
456 leadingCharge = uint8_t(leadingCharge*fabs(it->second.second));
458 if((((it->first>>25)&0x7f)==0xd) ||
459 ((((it->first>>25)&0x7f)==0xe) && (((it->first>>5)&0x7)>4)))
460 leadingCharge = uint8_t((leadingCharge*0.64));
463 unsigned int tof =
abs(
int(round(it->second.first*10)));
464 tof = tof>255 ? 255 : tof;
466 newdsit->push_back(newSiStrip);
467 LogDebug(
"produce") <<
"New edm::DetSet<SiStripRawDigi> added.";
474 LogDebug(
"produce") <<
"Putting " <<
output.size() <<
" new hits in the event.";
476 iEvent.
put(formatedOutput,
"FineDelaySelection");
485 std::vector< edm::DetSet<SiStripRawDigi> >
output;
496 int32_t layerIdx = (layerCode&0xF)*(((layerCode>>4)&0x3) ? -1 : 1);
497 std::pair<uint32_t, uint32_t> mask =
deviceMask(subdet,layerIdx);
503 if(
mode_==1 && ((DSViter->id() & mask.first) != mask.second) )
continue;
511 const std::vector< uint8_t >& amplitudes = iter->amplitudes();
512 uint8_t leadingCharge = 0;
513 uint8_t leadingStrip = iter->firstStrip();
514 uint8_t leadingPosition = 0;
515 for(std::vector< uint8_t >::const_iterator amplit = amplitudes.begin();amplit<amplitudes.end();amplit++,leadingStrip++) {
516 if(leadingCharge<*amplit) {
517 leadingCharge = *amplit;
518 leadingPosition = leadingStrip;
528 float noise=noiseHandle_->getNoise(leadingPosition, detNoiseRange);
529 if( noise<1.5 )
continue;
530 if( leadingCharge>=250 || noise>=8 || leadingCharge/noise>50 || leadingCharge/noise<10 )
continue;
532 if(leadingCharge<255) {
534 if((((((DSViter->id())>>25)&0x7f)==0xd)||((((DSViter->id())>>25)&0x7f)==0xe))&&((((DSViter->id())>>5)&0x7)>4))
535 leadingCharge = uint8_t((leadingCharge*0.64));
539 newds.push_back(newSiStrip);
542 output.push_back(newds);
543 LogDebug(
"produce") <<
"New edm::DetSet<SiStripRawDigi> added with fedkey = "
544 << std::hex << std::setfill(
'0') << std::setw(8)
548 LogDebug(
"produce") <<
"Putting " << output.size() <<
" new hits in the event.";
550 iEvent.
put(formatedOutput,
"FineDelaySelection");
560 const std::vector< uint16_t > & feds = cabling->feds() ;
561 for(std::vector< uint16_t >::const_iterator fedid = feds.begin();fedid<feds.end();++fedid) {
562 const std::vector< FedChannelConnection > & connections = cabling->connections(*fedid);
563 for(std::vector< FedChannelConnection >::const_iterator
conn=connections.begin();
conn<connections.end();++
conn) {
T getParameter(std::string const &) const
std::vector< std::pair< uint32_t, std::pair< double, double > > > detId(const TrackerGeometry &tracker, const reco::Track *tk, const std::vector< Trajectory > &trajVec, const StripSubdetector::SubDetector subdet=StripSubdetector::TIB, const int substructure=0xff)
virtual void produceNoTracking(edm::Event &, const edm::EventSetup &)
boost::transform_iterator< IterHelp, const_IdIter > const_iterator
const_iterator begin() const
virtual ~SiStripFineDelayHit()
const Vector & momentum() const
track momentum vector
std::pair< SiStripDigiIter, SiStripDigiIter > SiStripDigiRange
std::vector< Track > TrackCollection
collection of Tracks
void init(const edm::Event &e, const edm::EventSetup &c)
Constants and enumerated type for sistrip::RunType.
data_type const * const_iterator
edm::InputTag clusterLabel_
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
std::pair< uint32_t, uint32_t > deviceMask(const StripSubdetector::SubDetector subdet, const int substructure)
std::map< uint32_t, uint32_t > connectionMap_
virtual void beginRun(edm::Run &, const edm::EventSetup &)
uint32_t rawId() const
get the raw id
virtual const Topology & topology() const =0
SiStripFineDelayHit(const edm::ParameterSet &)
std::vector< std::pair< std::pair< DetId, LocalPoint >,float > > findtrackangle(const std::vector< Trajectory > &traj)
std::pair< const SiStripCluster *, double > closestCluster(const TrackerGeometry &tracker, const reco::Track *tk, const uint32_t &detId, const edmNew::DetSetVector< SiStripCluster > &clusters, const edm::DetSetVector< SiStripDigi > &hits)
ParameterVector parameters() const
Track parameters with one-to-one correspondence to the covariance matrix.
static double timeOfFlight(bool cosmics, bool field, double *trackParameters, double *hit, double *phit, bool onDisk)
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
SiStripFineDelayTLA * anglefinder_
Cos< T >::type cos(const T &t)
virtual void produce(edm::Event &, const edm::EventSetup &)
edm::InputTag inputModuleLabel_
virtual MeasurementPoint measurementPosition(const LocalPoint &) const =0
static void trackParameters(const reco::Track &tk, double *trackParameters)
const_iterator end() const
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
virtual const GeomDet * idToDet(DetId) const
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
iterator end()
Return the off-the-end iterator.
static const uint16_t invalid_
bool rechit(reco::Track *tk, uint32_t detId)
T const * product() const
std::vector< Trajectory > TrajectoryCollection
virtual const GeomDetUnit * idToDetUnit(DetId) const
Return the pointer to the GeomDetUnit corresponding to a given DetId.
const edm::Event * event_
iterator begin()
Return an iterator to the first DetSet.
std::pair< ContainerIterator, ContainerIterator > Range
collection_type::const_iterator const_iterator
collection_type::const_iterator const_iterator
A Digi for the silicon strip detector, containing only adc information, and suitable for storing raw ...
double maxClusterDistance_
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.
edm::InputTag trackLabel_