00001
00002
00003
00004
00005
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <memory>
00025 #include "DataFormats/Common/interface/ValueMap.h"
00026 #include "DataFormats/TrackReco/interface/DeDxData.h"
00027
00028 #include "RecoTracker/DeDx/plugins/DeDxDiscriminatorProducer.h"
00029 #include "DataFormats/TrackReco/interface/Track.h"
00030 #include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h"
00031
00032 #include "FWCore/Framework/interface/ESHandle.h"
00033 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00034 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
00035
00036 #include "CondFormats/DataRecord/interface/SiStripDeDxMip_3D_Rcd.h"
00037 #include "CondFormats/DataRecord/interface/SiStripDeDxElectron_3D_Rcd.h"
00038 #include "CondFormats/DataRecord/interface/SiStripDeDxProton_3D_Rcd.h"
00039 #include "CondFormats/DataRecord/interface/SiStripDeDxPion_3D_Rcd.h"
00040 #include "CondFormats/DataRecord/interface/SiStripDeDxKaon_3D_Rcd.h"
00041
00042
00043 #include "TFile.h"
00044
00045 using namespace reco;
00046 using namespace std;
00047 using namespace edm;
00048
00049 DeDxDiscriminatorProducer::DeDxDiscriminatorProducer(const edm::ParameterSet& iConfig)
00050 {
00051
00052 produces<ValueMap<DeDxData> >();
00053
00054 m_tracksTag = iConfig.getParameter<edm::InputTag>("tracks");
00055 m_trajTrackAssociationTag = iConfig.getParameter<edm::InputTag>("trajectoryTrackAssociation");
00056
00057 usePixel = iConfig.getParameter<bool>("UsePixel");
00058 useStrip = iConfig.getParameter<bool>("UseStrip");
00059 if(!usePixel && !useStrip)
00060 edm::LogWarning("DeDxHitsProducer") << "Pixel Hits AND Strip Hits will not be used to estimate dEdx --> BUG, Please Update the config file";
00061
00062 Formula = iConfig.getUntrackedParameter<unsigned>("Formula" , 0);
00063 Reccord = iConfig.getUntrackedParameter<string> ("Reccord" , "SiStripDeDxMip_3D_Rcd");
00064 ProbabilityMode = iConfig.getUntrackedParameter<string> ("ProbabilityMode" , "Accumulation");
00065
00066
00067 MinTrackMomentum = iConfig.getUntrackedParameter<double> ("minTrackMomentum" , 0.0);
00068 MaxTrackMomentum = iConfig.getUntrackedParameter<double> ("maxTrackMomentum" , 99999.0);
00069 MinTrackEta = iConfig.getUntrackedParameter<double> ("minTrackEta" , -5.0);
00070 MaxTrackEta = iConfig.getUntrackedParameter<double> ("maxTrackEta" , 5.0);
00071 MaxNrStrips = iConfig.getUntrackedParameter<unsigned>("maxNrStrips" , 255);
00072 MinTrackHits = iConfig.getUntrackedParameter<unsigned>("MinTrackHits" , 3);
00073
00074 shapetest = iConfig.getParameter<bool>("ShapeTest");
00075 useCalibration = iConfig.getParameter<bool>("UseCalibration");
00076 m_calibrationPath = iConfig.getParameter<string>("calibrationPath");
00077
00078 Prob_ChargePath = NULL;
00079 }
00080
00081
00082 DeDxDiscriminatorProducer::~DeDxDiscriminatorProducer(){}
00083
00084
00085 void DeDxDiscriminatorProducer::beginRun(edm::Run & run, const edm::EventSetup& iSetup)
00086 {
00087 edm::ESHandle<PhysicsTools::Calibration::HistogramD3D> DeDxMapHandle_;
00088 if( strcmp(Reccord.c_str(),"SiStripDeDxMip_3D_Rcd")==0){
00089 iSetup.get<SiStripDeDxMip_3D_Rcd>() .get(DeDxMapHandle_);
00090 }else if(strcmp(Reccord.c_str(),"SiStripDeDxPion_3D_Rcd")==0){
00091 iSetup.get<SiStripDeDxPion_3D_Rcd>().get(DeDxMapHandle_);
00092 }else if(strcmp(Reccord.c_str(),"SiStripDeDxKaon_3D_Rcd")==0){
00093 iSetup.get<SiStripDeDxKaon_3D_Rcd>().get(DeDxMapHandle_);
00094 }else if(strcmp(Reccord.c_str(),"SiStripDeDxProton_3D_Rcd")==0){
00095 iSetup.get<SiStripDeDxProton_3D_Rcd>().get(DeDxMapHandle_);
00096 }else if(strcmp(Reccord.c_str(),"SiStripDeDxElectron_3D_Rcd")==0){
00097 iSetup.get<SiStripDeDxElectron_3D_Rcd>().get(DeDxMapHandle_);
00098 }else{
00099
00100
00101 exit(0);
00102 }
00103 DeDxMap_ = *DeDxMapHandle_.product();
00104
00105 double xmin = DeDxMap_.rangeX().min;
00106 double xmax = DeDxMap_.rangeX().max;
00107 double ymin = DeDxMap_.rangeY().min;
00108 double ymax = DeDxMap_.rangeY().max;
00109 double zmin = DeDxMap_.rangeZ().min;
00110 double zmax = DeDxMap_.rangeZ().max;
00111
00112 if(Prob_ChargePath)delete Prob_ChargePath;
00113 Prob_ChargePath = new TH3D ("Prob_ChargePath" , "Prob_ChargePath" , DeDxMap_.numberOfBinsX(), xmin, xmax, DeDxMap_.numberOfBinsY() , ymin, ymax, DeDxMap_.numberOfBinsZ(), zmin, zmax);
00114
00115
00116
00117 if(strcmp(ProbabilityMode.c_str(),"Accumulation")==0){
00118
00119 for(int i=0;i<=Prob_ChargePath->GetXaxis()->GetNbins()+1;i++){
00120
00121 for(int j=0;j<=Prob_ChargePath->GetYaxis()->GetNbins()+1;j++){
00122
00123
00124 double Ni = 0;
00125 for(int k=0;k<=Prob_ChargePath->GetZaxis()->GetNbins()+1;k++){ Ni+=DeDxMap_.binContent(i,j,k);}
00126
00127 for(int k=0;k<=Prob_ChargePath->GetZaxis()->GetNbins()+1;k++){
00128 double tmp = 0;
00129 for(int l=0;l<=k;l++){ tmp+=DeDxMap_.binContent(i,j,l);}
00130
00131 if(Ni>0){
00132 Prob_ChargePath->SetBinContent (i, j, k, tmp/Ni);
00133
00134 }else{
00135 Prob_ChargePath->SetBinContent (i, j, k, 0);
00136 }
00137 }
00138 }
00139 }
00140 }else if(strcmp(ProbabilityMode.c_str(),"Integral")==0){
00141
00142 for(int i=0;i<=Prob_ChargePath->GetXaxis()->GetNbins()+1;i++){
00143
00144 for(int j=0;j<=Prob_ChargePath->GetYaxis()->GetNbins()+1;j++){
00145
00146
00147 double Ni = 0;
00148 for(int k=0;k<=Prob_ChargePath->GetZaxis()->GetNbins()+1;k++){ Ni+=DeDxMap_.binContent(i,j,k);}
00149
00150 for(int k=0;k<=Prob_ChargePath->GetZaxis()->GetNbins()+1;k++){
00151 double tmp = DeDxMap_.binContent(i,j,k);
00152
00153 if(Ni>0){
00154 Prob_ChargePath->SetBinContent (i, j, k, tmp/Ni);
00155
00156 }else{
00157 Prob_ChargePath->SetBinContent (i, j, k, 0);
00158 }
00159 }
00160 }
00161 }
00162 }else{
00163
00164
00165 exit(0);
00166 }
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182 if(MODsColl.size()==0){
00183 edm::ESHandle<TrackerGeometry> tkGeom;
00184 iSetup.get<TrackerDigiGeometryRecord>().get( tkGeom );
00185 m_tracker = tkGeom.product();
00186
00187 vector<GeomDet*> Det = tkGeom->dets();
00188 for(unsigned int i=0;i<Det.size();i++){
00189 DetId Detid = Det[i]->geographicalId();
00190 int SubDet = Detid.subdetId();
00191
00192 if( SubDet == StripSubdetector::TIB || SubDet == StripSubdetector::TID ||
00193 SubDet == StripSubdetector::TOB || SubDet == StripSubdetector::TEC ){
00194
00195 StripGeomDetUnit* DetUnit = dynamic_cast<StripGeomDetUnit*> (Det[i]);
00196 if(!DetUnit)continue;
00197
00198 const StripTopology& Topo = DetUnit->specificTopology();
00199 unsigned int NAPV = Topo.nstrips()/128;
00200
00201 double Eta = DetUnit->position().basicVector().eta();
00202 double R = DetUnit->position().basicVector().transverse();
00203 double Thick = DetUnit->surface().bounds().thickness();
00204
00205 stModInfo* MOD = new stModInfo;
00206 MOD->DetId = Detid.rawId();
00207 MOD->SubDet = SubDet;
00208 MOD->Eta = Eta;
00209 MOD->R = R;
00210 MOD->Thickness = Thick;
00211 MOD->NAPV = NAPV;
00212 MODsColl[MOD->DetId] = MOD;
00213 }
00214 }
00215
00216 MakeCalibrationMap();
00217 }
00218
00219 }
00220
00221 void DeDxDiscriminatorProducer::endJob()
00222 {
00223 MODsColl.clear();
00224 }
00225
00226
00227
00228 void DeDxDiscriminatorProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00229 {
00230 auto_ptr<ValueMap<DeDxData> > trackDeDxDiscrimAssociation(new ValueMap<DeDxData> );
00231 ValueMap<DeDxData>::Filler filler(*trackDeDxDiscrimAssociation);
00232
00233 Handle<TrajTrackAssociationCollection> trajTrackAssociationHandle;
00234 iEvent.getByLabel(m_trajTrackAssociationTag, trajTrackAssociationHandle);
00235 const TrajTrackAssociationCollection TrajToTrackMap = *trajTrackAssociationHandle.product();
00236
00237 edm::Handle<reco::TrackCollection> trackCollectionHandle;
00238 iEvent.getByLabel(m_tracksTag,trackCollectionHandle);
00239
00240 edm::ESHandle<TrackerGeometry> tkGeom;
00241 iSetup.get<TrackerDigiGeometryRecord>().get( tkGeom );
00242 m_tracker = tkGeom.product();
00243
00244 std::vector<DeDxData> dEdxDiscrims( TrajToTrackMap.size() );
00245
00246 unsigned track_index = 0;
00247 for(TrajTrackAssociationCollection::const_iterator it = TrajToTrackMap.begin(); it!=TrajToTrackMap.end(); ++it, track_index++) {
00248 dEdxDiscrims[track_index] = DeDxData(-1, -2, 0 );
00249
00250 const Track track = *it->val;
00251 const Trajectory traj = *it->key;
00252
00253 if(track.eta() <MinTrackEta || track.eta()>MaxTrackEta ){continue;}
00254 if(track.p() <MinTrackMomentum || track.p() >MaxTrackMomentum){continue;}
00255 if(track.found()<MinTrackHits ){continue;}
00256
00257 std::vector<double> vect_probs;
00258 vector<TrajectoryMeasurement> measurements = traj.measurements();
00259
00260 unsigned int NClusterSaturating = 0;
00261 for(vector<TrajectoryMeasurement>::const_iterator measurement_it = measurements.begin(); measurement_it!=measurements.end(); measurement_it++){
00262
00263 TrajectoryStateOnSurface trajState = measurement_it->updatedState();
00264 if( !trajState.isValid() ) continue;
00265
00266 const TrackingRecHit* hit = (*measurement_it->recHit()).hit();
00267 const SiStripRecHit2D* sistripsimplehit = dynamic_cast<const SiStripRecHit2D*>(hit);
00268 const SiStripMatchedRecHit2D* sistripmatchedhit = dynamic_cast<const SiStripMatchedRecHit2D*>(hit);
00269 const SiStripRecHit1D* sistripsimple1dhit = dynamic_cast<const SiStripRecHit1D*>(hit);
00270
00271 double Prob;
00272 if(sistripsimplehit){
00273 Prob = GetProbability(DeDxTools::GetCluster(sistripsimplehit), trajState,sistripsimplehit->geographicalId());
00274 if(shapetest && !(DeDxTools::shapeSelection(DeDxTools::GetCluster(sistripsimplehit)->amplitudes()))) Prob=-1.0;
00275 if(Prob>=0) vect_probs.push_back(Prob);
00276
00277 if(ClusterSaturatingStrip(DeDxTools::GetCluster(sistripsimplehit),sistripsimplehit->geographicalId())>0)NClusterSaturating++;
00278
00279 }else if(sistripmatchedhit){
00280 Prob = GetProbability(DeDxTools::GetCluster(sistripmatchedhit->monoHit()), trajState, sistripmatchedhit->monoId());
00281 if(shapetest && !(DeDxTools::shapeSelection(DeDxTools::GetCluster(sistripmatchedhit->monoHit())->amplitudes()))) Prob=-1.0;
00282 if(Prob>=0) vect_probs.push_back(Prob);
00283
00284 Prob = GetProbability(DeDxTools::GetCluster(sistripmatchedhit->stereoHit()), trajState,sistripmatchedhit->stereoId());
00285 if(Prob>=0) vect_probs.push_back(Prob);
00286
00287 if(ClusterSaturatingStrip(DeDxTools::GetCluster(sistripmatchedhit->monoHit()),sistripmatchedhit->monoId()) >0)NClusterSaturating++;
00288 if(ClusterSaturatingStrip(DeDxTools::GetCluster(sistripmatchedhit->stereoHit()),sistripmatchedhit->stereoId())>0)NClusterSaturating++;
00289 }else if(sistripsimple1dhit){
00290 Prob = GetProbability(DeDxTools::GetCluster(sistripsimple1dhit), trajState, sistripsimple1dhit->geographicalId());
00291 if(shapetest && !(DeDxTools::shapeSelection(DeDxTools::GetCluster(sistripsimple1dhit)->amplitudes()))) Prob=-1.0;
00292 if(Prob>=0) vect_probs.push_back(Prob);
00293 if(ClusterSaturatingStrip(DeDxTools::GetCluster(sistripsimple1dhit),sistripsimple1dhit->geographicalId())>0)NClusterSaturating++;
00294 }else{
00295 }
00296 }
00297
00298 double estimator = ComputeDiscriminator(vect_probs);
00299 int size = vect_probs.size();
00300 float Error = -1;
00301
00302
00303
00304 Error = NClusterSaturating;
00305 dEdxDiscrims[track_index] = DeDxData(estimator, Error, size );
00306
00307
00308 }
00309
00310 filler.insert(trackCollectionHandle, dEdxDiscrims.begin(), dEdxDiscrims.end());
00311 filler.fill();
00312 iEvent.put(trackDeDxDiscrimAssociation);
00313 }
00314
00315
00316 int DeDxDiscriminatorProducer::ClusterSaturatingStrip(const SiStripCluster* cluster,
00317 const uint32_t & detId){
00318 const vector<uint8_t>& ampls = cluster->amplitudes();
00319
00320 stModInfo* MOD = NULL;
00321 if(useCalibration)MOD = MODsColl[detId];
00322
00323 int SaturatingStrip = 0;
00324 for(unsigned int i=0;i<ampls.size();i++){
00325 int StripCharge = ampls[i];
00326 if(MOD){StripCharge = (int)(StripCharge / MOD->Gain);}
00327 if(StripCharge>=254)SaturatingStrip++;
00328 }
00329 return SaturatingStrip;
00330 }
00331
00332 double DeDxDiscriminatorProducer::GetProbability(const SiStripCluster* cluster, TrajectoryStateOnSurface trajState,
00333 const uint32_t & detId)
00334 {
00335
00336 LocalVector trackDirection = trajState.localDirection();
00337 double cosine = trackDirection.z()/trackDirection.mag();
00338 const vector<uint8_t>& ampls = cluster->amplitudes();
00339
00340
00341 stModInfo* MOD = MODsColl[detId];
00342
00343
00344
00345 if( ampls.size()>MaxNrStrips) {return -1;}
00346
00347
00348
00349
00350
00351
00352 double charge = 0;
00353 if(useCalibration){
00354 for(unsigned int i=0;i<ampls.size();i++){
00355 int CalibratedCharge = ampls[i];
00356 CalibratedCharge = (int)(CalibratedCharge / MOD->Gain);
00357 if(CalibratedCharge>=1024){
00358 CalibratedCharge = 255;
00359 }else if(CalibratedCharge>254){
00360 CalibratedCharge = 254;
00361 }
00362 charge+=CalibratedCharge;
00363 }
00364 }else{
00365 charge = DeDxDiscriminatorTools::charge(ampls);
00366 }
00367 double path = DeDxDiscriminatorTools::path(cosine,MOD->Thickness);
00368
00369 int BinX = Prob_ChargePath->GetXaxis()->FindBin(trajState.localMomentum().mag());
00370 int BinY = Prob_ChargePath->GetYaxis()->FindBin(path);
00371 int BinZ = Prob_ChargePath->GetZaxis()->FindBin(charge/path);
00372 return Prob_ChargePath->GetBinContent(BinX,BinY,BinZ);
00373 }
00374
00375
00376 double DeDxDiscriminatorProducer::ComputeDiscriminator(std::vector<double>& vect_probs)
00377 {
00378 double estimator = -1;
00379 int size = vect_probs.size();
00380 if(size<=0)return estimator;
00381
00382 if(Formula==0){
00383 double P = 1;
00384 for(int i=0;i<size;i++){
00385 if(vect_probs[i]<=0.0001){P *= pow(0.0001 , 1.0/size);}
00386 else {P *= pow(vect_probs[i], 1.0/size);}
00387 }
00388 estimator = P;
00389 }else if(Formula==1){
00390 std::sort(vect_probs.begin(), vect_probs.end(), std::less<double>() );
00391 for(int i=0;i<size;i++){if(vect_probs[i]<=0.0001)vect_probs[i] = 0.0001; }
00392
00393 double SumJet = 0.;
00394 for(int i=0;i<size;i++){ SumJet+= log(vect_probs[i]); }
00395
00396 double Loginvlog=log(-SumJet);
00397 double Prob =1.;
00398 double lfact=1.;
00399
00400 for(int l=1; l!=size; l++){
00401 lfact*=l;
00402 Prob+=exp(l*Loginvlog-log(1.*lfact));
00403 }
00404
00405 double LogProb=log(Prob);
00406 double ProbJet=std::min(exp(std::max(LogProb+SumJet,-30.)),1.);
00407 estimator = -log10(ProbJet)/4.;
00408 estimator = 1-estimator;
00409 }else if(Formula==2){
00410 std::sort(vect_probs.begin(), vect_probs.end(), std::less<double>() );
00411 double P = 1.0/(12*size);
00412 for(int i=1;i<=size;i++){
00413 P += pow(vect_probs[i-1] - ((2.0*i-1.0)/(2.0*size)),2);
00414 }
00415 P *= (3.0/size);
00416 estimator = P;
00417 }else{
00418 std::sort(vect_probs.begin(), vect_probs.end(), std::less<double>() );
00419 double P = 1.0/(12*size);
00420 for(int i=1;i<=size;i++){
00421 P += vect_probs[i-1] * pow(vect_probs[i-1] - ((2.0*i-1.0)/(2.0*size)),2);
00422 }
00423 P *= (3.0/size);
00424 estimator = P;
00425 }
00426
00427 return estimator;
00428 }
00429
00430
00431 void DeDxDiscriminatorProducer::MakeCalibrationMap(){
00432 if(!useCalibration)return;
00433
00434
00435 TChain* t1 = new TChain("SiStripCalib/APVGain");
00436 t1->Add(m_calibrationPath.c_str());
00437
00438 unsigned int tree_DetId;
00439 unsigned char tree_APVId;
00440 double tree_Gain;
00441
00442 t1->SetBranchAddress("DetId" ,&tree_DetId );
00443 t1->SetBranchAddress("APVId" ,&tree_APVId );
00444 t1->SetBranchAddress("Gain" ,&tree_Gain );
00445
00446 for (unsigned int ientry = 0; ientry < t1->GetEntries(); ientry++) {
00447 t1->GetEntry(ientry);
00448 stModInfo* MOD = MODsColl[tree_DetId];
00449 MOD->Gain = tree_Gain;
00450 }
00451
00452 delete t1;
00453
00454 }
00455
00456
00457 DEFINE_FWK_MODULE(DeDxDiscriminatorProducer);