00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "CalibMuon/DTCalibration/plugins/DTTTrigCorrectionFirst.h"
00011
00012 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00013
00014 #include "FWCore/Framework/interface/ESHandle.h"
00015 #include "FWCore/Framework/interface/EventSetup.h"
00016 #include "Geometry/Records/interface/MuonGeometryRecord.h"
00017 #include "Geometry/DTGeometry/interface/DTGeometry.h"
00018 #include "Geometry/DTGeometry/interface/DTSuperLayer.h"
00019
00020 #include "CondFormats/DTObjects/interface/DTTtrig.h"
00021 #include "CondFormats/DataRecord/interface/DTTtrigRcd.h"
00022 #include "CalibMuon/DTCalibration/interface/DTCalibDBUtils.h"
00023
00024 #include <iostream>
00025 #include <fstream>
00026
00027 using namespace edm;
00028 using namespace std;
00029
00030 DTTTrigCorrectionFirst::DTTTrigCorrectionFirst(const ParameterSet& pset) {
00031
00032 debug = pset.getUntrackedParameter<bool>("debug",false);
00033 ttrigMin = pset.getUntrackedParameter<double>("ttrigMin",0);
00034 ttrigMax = pset.getUntrackedParameter<double>("ttrigMax",5000);
00035 rmsLimit = pset.getUntrackedParameter<double>("rmsLimit",5.);
00036
00037 dbLabel = pset.getUntrackedParameter<string>("dbLabel", "");
00038 }
00039
00040 DTTTrigCorrectionFirst::~DTTTrigCorrectionFirst(){}
00041
00042 void DTTTrigCorrectionFirst::beginRun( const edm::Run& run, const edm::EventSetup& setup ) {
00043 ESHandle<DTTtrig> tTrig;
00044 setup.get<DTTtrigRcd>().get(dbLabel,tTrig);
00045 tTrigMap = &*tTrig;
00046 cout << "[DTTTrigCorrection]: TTrig version: " << tTrig->version() << endl;
00047
00048 setup.get<MuonGeometryRecord>().get(muonGeom);
00049 }
00050
00051 void DTTTrigCorrectionFirst::endJob() {
00052
00053 DTTtrig* tTrigNewMap = new DTTtrig();
00054
00055 vector<DTSuperLayer*> dtSupLylist = muonGeom->superLayers();
00056
00057
00058 double average = 0.;
00059 double average2 = 0.;
00060 double rms = 0.;
00061 double averageSigma = 0.;
00062 double average2Sigma = 0.;
00063 double rmsSigma = 0.;
00064 double counter = 0.;
00065 double averagekfactor = 0;
00066 float kfactor = 0;
00067
00068 for (vector<DTSuperLayer*>::const_iterator sl = dtSupLylist.begin();
00069 sl != dtSupLylist.end(); sl++) {
00070 float ttrigMean = 0;
00071 float ttrigSigma = 0;
00072 tTrigMap->get((*sl)->id(),
00073 ttrigMean,
00074 ttrigSigma,
00075 kfactor,
00076 DTTimeUnits::ns);
00077 if( ttrigMean < ttrigMax && ttrigMean > ttrigMin ) {
00078 average += ttrigMean;
00079 averageSigma += ttrigSigma;
00080 if(ttrigMean > 0)
00081 counter += 1.;
00082 }
00083 }
00084
00085 average = average/ counter;
00086 averageSigma = averageSigma/counter;
00087 averagekfactor = kfactor;
00088
00089
00090
00091 for (vector<DTSuperLayer*>::const_iterator sl = dtSupLylist.begin();
00092 sl != dtSupLylist.end(); sl++) {
00093 float ttrigMean = 0;
00094 float ttrigSigma = 0;
00095 float kfactor = 0;
00096 tTrigMap->get((*sl)->id(),
00097 ttrigMean,
00098 ttrigSigma,
00099 kfactor,
00100 DTTimeUnits::ns);
00101 if( ttrigMean < ttrigMax && ttrigMean > ttrigMin ) {
00102 average2 += (ttrigMean-average)*(ttrigMean-average);
00103 average2Sigma += (ttrigSigma-averageSigma)*(ttrigSigma-averageSigma);
00104 }
00105 }
00106
00107 rms = average2 /(counter-1);
00108 rmsSigma = average2Sigma /(counter-1);
00109 rms = sqrt(rms);
00110 rmsSigma = sqrt(rmsSigma);
00111 cout << "average averageSigma counter rms "<< average <<" " << averageSigma << " " << counter << " " << rms <<endl;
00112
00113
00114 for (vector<DTSuperLayer*>::const_iterator sl = dtSupLylist.begin();
00115 sl != dtSupLylist.end(); sl++) {
00116
00117 double newTTrigMean = 0;
00118 double newTTrigSigma = 0;
00119 double newkfactor =0;
00120 float tempttrigMean = 0;
00121 float tempttrigSigma = 0;
00122 float tempkfactor = 0;
00123 float ttrigMean = 0;
00124 float ttrigSigma = 0;
00125 float kfactor = 0;
00126 tTrigMap->get((*sl)->id(),
00127 ttrigMean,
00128 ttrigSigma,
00129 kfactor,
00130 DTTimeUnits::ns);
00131 int chamber = (*sl)->id().chamberId().station();
00132
00133
00134 if (abs(ttrigMean - average) < rmsLimit*rms ){
00135 newTTrigMean = ttrigMean;
00136 newTTrigSigma = ttrigSigma;
00137 newkfactor = kfactor;
00138 } else {
00139
00140 if(ttrigMean > 0) {
00141
00142 if(((*sl)->id().superlayer()) == 1){
00143
00144 DTSuperLayerId slId((*sl)->id().chamberId(),3);
00145 tTrigMap->get(slId,
00146 tempttrigMean,
00147 tempttrigSigma,
00148 tempkfactor,
00149 DTTimeUnits::ns);
00150 if (abs(tempttrigMean - average) < rmsLimit*rms) {
00151 newTTrigMean = tempttrigMean;
00152 newTTrigSigma = tempttrigSigma;
00153 newkfactor = tempkfactor;
00154 cout <<"Chamber "<< chamber << " sl " << ((*sl)->id().superlayer()) << "has ttrig "<< ttrigMean
00155 << " -> takes value of sl 3 " << newTTrigMean <<endl;
00156 } else if(chamber == 4){
00157 cout << "No correction possible within same chamber (sl1) " <<endl;
00158 newTTrigMean = average;
00159 newTTrigSigma = averageSigma;
00160 newkfactor = averagekfactor;
00161 cout<<"####### Bad SL: " << (*sl)->id() << " from "<< ttrigMean <<" to "<< newTTrigMean <<endl;
00162 } else if(chamber != 4){
00163 DTSuperLayerId slId((*sl)->id().chamberId(),2);
00164 tTrigMap->get(slId,
00165 tempttrigMean,
00166 tempttrigSigma,
00167 tempkfactor,
00168 DTTimeUnits::ns);
00169 if (abs(tempttrigMean - average) < rmsLimit*rms) {
00170 newTTrigMean = tempttrigMean;
00171 newTTrigSigma = tempttrigSigma;
00172 newkfactor = tempkfactor;
00173 cout <<"Chamber "<< chamber << " sl " << ((*sl)->id().superlayer()) << "has ttrig "<< ttrigMean
00174 <<" -> takes value of sl 2 " << newTTrigMean <<endl;
00175 } else {
00176 cout << "No correction possible within same chamber (sl1) " <<endl;
00177 newTTrigMean = average;
00178 newTTrigSigma = averageSigma;
00179 newkfactor = averagekfactor;
00180 cout<<"####### Bad SL: " << (*sl)->id() << " from "<< ttrigMean <<" to "<< newTTrigMean <<endl;
00181 }
00182 }
00183 } else if (((*sl)->id().superlayer()) == 2) {
00184
00185 DTSuperLayerId slId((*sl)->id().chamberId(),1);
00186 tTrigMap->get(slId,
00187 tempttrigMean,
00188 tempttrigSigma,
00189 tempkfactor,
00190 DTTimeUnits::ns);
00191 if (abs(tempttrigMean - average) < rmsLimit*rms) {
00192 newTTrigMean = tempttrigMean;
00193 newTTrigSigma = tempttrigSigma;
00194 newkfactor = tempkfactor;
00195 cout <<"Chamber "<< chamber << " sl " << ((*sl)->id().superlayer()) << "has ttrig "<< ttrigMean
00196 << " -> takes value of sl 1 " << newTTrigMean <<endl;
00197 } else {
00198 DTSuperLayerId slId((*sl)->id().chamberId(),3);
00199 tTrigMap->get(slId,
00200 tempttrigMean,
00201 tempttrigSigma,
00202 tempkfactor,
00203 DTTimeUnits::ns);
00204 if (abs(tempttrigMean - average) < rmsLimit*rms) {
00205 newTTrigMean = tempttrigMean;
00206 newTTrigSigma = tempttrigSigma;
00207 newkfactor = tempkfactor;
00208 cout <<"Chamber "<< chamber << " sl " << ((*sl)->id().superlayer()) << "has ttrig "<< ttrigMean
00209 << "-> takes value of sl 3 " << newTTrigMean <<endl;
00210 } else {
00211 cout << "No correction possible within same chamber (sl2) " <<endl;
00212 newTTrigMean = average;
00213 newTTrigSigma = averageSigma;
00214 newkfactor = averagekfactor;
00215 cout<<"####### Bad SL: " << (*sl)->id() << " from "<< ttrigMean <<" to "<< newTTrigMean <<endl;
00216 }
00217 }
00218
00219
00220 } else if (((*sl)->id().superlayer()) == 3) {
00221
00222 DTSuperLayerId slId((*sl)->id().chamberId(),1);
00223 tTrigMap->get(slId,
00224 tempttrigMean,
00225 tempttrigSigma,
00226 tempkfactor,
00227 DTTimeUnits::ns);
00228 if (abs(tempttrigMean - average) < rmsLimit*rms) {
00229 newTTrigMean = tempttrigMean;
00230 newTTrigSigma = tempttrigSigma;
00231 newkfactor = tempkfactor;
00232 cout <<"Chamber "<< chamber << " sl " << ((*sl)->id().superlayer()) << "has ttrig "<< ttrigMean
00233 << " -> takes value of sl 1 " << newTTrigMean <<endl;
00234 } else if(chamber == 4) {
00235 cout << "No correction possible within same chamber (sl3)" <<endl;
00236 newTTrigMean = average;
00237 newTTrigSigma = averageSigma;
00238 newkfactor = averagekfactor;
00239 cout<<"####### Bad SL: " << (*sl)->id() << " from "<< ttrigMean <<" to "<< newTTrigMean <<endl;
00240 } else if(chamber != 4){
00241 DTSuperLayerId slId((*sl)->id().chamberId(),2);
00242 tTrigMap->get(slId,
00243 tempttrigMean,
00244 tempttrigSigma,
00245 tempkfactor,
00246 DTTimeUnits::ns);
00247 if (abs(tempttrigMean - average) < rmsLimit*rms) {
00248 newTTrigMean = tempttrigMean;
00249 newTTrigSigma = tempttrigSigma;
00250 newkfactor = tempkfactor;
00251 cout <<"Chamber "<< chamber << " sl " << ((*sl)->id().superlayer()) << "has ttrig "<< ttrigMean
00252 << " -> takes value of sl 2 " << newTTrigMean <<endl;
00253 } else {
00254 cout << "No correction possible within same chamber (sl3) " <<endl;
00255 newTTrigMean = average;
00256 newTTrigSigma = averageSigma;
00257 newkfactor = averagekfactor;
00258 cout<<"####### Bad SL: " << (*sl)->id() << " from "<< ttrigMean <<" to "<< newTTrigMean <<endl;
00259 }
00260 }
00261
00262 }
00263 } else {
00264
00265 newTTrigMean = average;
00266 newTTrigSigma = averageSigma;
00267 newkfactor = averagekfactor;
00268 cout<<"####### NotPresent SL: " << (*sl)->id() << " from "<< ttrigMean <<" to "<< newTTrigMean <<endl;
00269 }
00270 }
00271
00272
00273 tTrigNewMap->set((*sl)->id(), newTTrigMean, newTTrigSigma, newkfactor, DTTimeUnits::ns);
00274 if(debug){
00275 cout<<"New tTrig: " << (*sl)->id()
00276 << " from "<< ttrigMean <<" to "<< newTTrigMean <<endl;
00277 cout<<"New tTrigSigma: " << (*sl)->id()
00278 << " from "<<ttrigSigma <<" to "<< newTTrigSigma <<endl;
00279
00280 }
00281 }
00282
00283
00284
00285 cout << "[DTTTrigCorrection]: Writing ttrig object to DB!" << endl;
00286 string record = "DTTtrigRcd";
00287 DTCalibDBUtils::writeToDB<DTTtrig>(record, tTrigNewMap);
00288 }
00289
00290
00291