CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/CalibMuon/DTCalibration/plugins/DTTTrigCorrectionFirst.cc

Go to the documentation of this file.
00001 
00002 /*
00003  *  See header file for a description of this class.
00004  *
00005  *  $Date: 2010/02/16 10:03:23 $
00006  *  $Revision: 1.3 $
00007  *  \author S. Maselli - INFN Torino
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   // Create the object to be written to DB
00053   DTTtrig* tTrigNewMap = new DTTtrig();  
00054   //Get the superlayers list
00055   vector<DTSuperLayer*> dtSupLylist = muonGeom->superLayers();
00056 
00057   //Loop on all superlayers to compute the mean 
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   }//End of loop on superlayers 
00084 
00085   average =  average/ counter;
00086   averageSigma = averageSigma/counter;
00087   averagekfactor = kfactor;
00088 
00089   //  cout << " average counter "<< average << " "<< counter <<endl;
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   }//End of loop on superlayers 
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     //Compute new ttrig
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     //check if ttrigMean is similar to the mean
00134     if (abs(ttrigMean - average) < rmsLimit*rms ){
00135       newTTrigMean = ttrigMean;
00136       newTTrigSigma = ttrigSigma;
00137       newkfactor = kfactor;
00138     } else {
00139       // do not consider if ttrig == 0
00140       if(ttrigMean > 0) {
00141         //cout << "ttrig chamber " << ttrigMean <<" "<<chamber<<endl;
00142         if(((*sl)->id().superlayer()) == 1){
00143           //cout << " superlayer " << ((*sl)->id().superlayer()) <<endl; 
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           //cout << " superlayer " << ((*sl)->id().superlayer()) <<endl; 
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           //cout << " superlayer " << ((*sl)->id().superlayer()) <<endl; 
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         //      cout << "SL not present " << ttrigMean << " " <<((*sl)->id().superlayer()) <<endl;
00265         newTTrigMean = average;
00266         newTTrigSigma = averageSigma;
00267         newkfactor = averagekfactor;
00268         cout<<"####### NotPresent SL: " << (*sl)->id() << " from "<< ttrigMean <<" to "<< newTTrigMean <<endl;
00269       }
00270     }
00271 
00272     //Store new ttrig in the new map
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   }//End of loop on superlayers 
00282 
00283   
00284   //Write object to DB
00285   cout << "[DTTTrigCorrection]: Writing ttrig object to DB!" << endl;
00286   string record = "DTTtrigRcd";
00287    DTCalibDBUtils::writeToDB<DTTtrig>(record, tTrigNewMap);
00288 } 
00289 
00290 
00291