CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_4_5_patch3/src/RecoTBCalo/EcalSimpleTBAnalysis/src/EcalSimple2007H4TBAnalyzer.cc

Go to the documentation of this file.
00001 
00008 //
00009 // $Id: EcalSimple2007H4TBAnalyzer.cc,v 1.3 2010/01/04 15:09:12 ferriff Exp $
00010 //
00011 //
00012 
00013 #include "RecoTBCalo/EcalSimpleTBAnalysis/interface/EcalSimple2007H4TBAnalyzer.h"
00014 #include "DataFormats/EcalRecHit/interface/EcalUncalibratedRecHit.h"
00015 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
00016 #include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
00017 #include "TBDataFormats/EcalTBObjects/interface/EcalTBHodoscopeRecInfo.h"
00018 #include "TBDataFormats/EcalTBObjects/interface/EcalTBTDCRecInfo.h"
00019 #include "TBDataFormats/EcalTBObjects/interface/EcalTBEventHeader.h"
00020 
00021 #include "FWCore/Framework/interface/ESHandle.h"
00022 
00023 #include "Geometry/Records/interface/CaloGeometryRecord.h"
00024 #include "Geometry/CaloGeometry/interface/CaloCellGeometry.h"
00025 #include "Geometry/CaloGeometry/interface/TruncatedPyramid.h"
00026 
00027 //#include<fstream>
00028 
00029 #include "TFile.h"
00030 #include "TH1.h"
00031 #include "TH2.h"
00032 #include "TF1.h"
00033 
00034 #include <iostream>
00035 #include <string>
00036 #include <stdexcept>
00037 //
00038 // constants, enums and typedefs
00039 //
00040 
00041 //
00042 // static data member definitions
00043 //
00044 
00045 //
00046 // constructors and destructor
00047 //
00048 
00049 
00050 //========================================================================
00051 EcalSimple2007H4TBAnalyzer::EcalSimple2007H4TBAnalyzer( const edm::ParameterSet& iConfig ) : xtalInBeam_(0)
00052 //========================================================================
00053 {
00054    //now do what ever initialization is needed
00055    rootfile_          = iConfig.getUntrackedParameter<std::string>("rootfile","ecalSimpleTBanalysis.root");
00056    digiCollection_     = iConfig.getParameter<std::string>("digiCollection");
00057    digiProducer_       = iConfig.getParameter<std::string>("digiProducer");
00058    hitCollection_     = iConfig.getParameter<std::string>("hitCollection");
00059    hitProducer_       = iConfig.getParameter<std::string>("hitProducer");
00060    hodoRecInfoCollection_     = iConfig.getParameter<std::string>("hodoRecInfoCollection");
00061    hodoRecInfoProducer_       = iConfig.getParameter<std::string>("hodoRecInfoProducer");
00062    tdcRecInfoCollection_     = iConfig.getParameter<std::string>("tdcRecInfoCollection");
00063    tdcRecInfoProducer_       = iConfig.getParameter<std::string>("tdcRecInfoProducer");
00064    eventHeaderCollection_     = iConfig.getParameter<std::string>("eventHeaderCollection");
00065    eventHeaderProducer_       = iConfig.getParameter<std::string>("eventHeaderProducer");
00066 
00067 
00068    std::cout << "EcalSimple2007H4TBAnalyzer: fetching hitCollection: " << hitCollection_.c_str()
00069         << " produced by " << hitProducer_.c_str() << std::endl;
00070 
00071 }
00072 
00073 
00074 //========================================================================
00075 EcalSimple2007H4TBAnalyzer::~EcalSimple2007H4TBAnalyzer()
00076 //========================================================================
00077 {
00078   // do anything here that needs to be done at desctruction time
00079   // (e.g. close files, deallocate resources etc.)
00080   // Amplitude vs TDC offset
00081 //   if (h_ampltdc)
00082 //   delete h_ampltdc;
00083   
00084 //   // Reconstructed energies
00085 //   delete h_e1x1;
00086 //   delete h_e3x3; 
00087 //   delete h_e5x5; 
00088   
00089 //   delete h_bprofx; 
00090 //   delete h_bprofy; 
00091   
00092 //   delete h_qualx; 
00093 //   delete h_qualy; 
00094   
00095 //   delete h_slopex; 
00096 //   delete h_slopey; 
00097   
00098 //   delete h_mapx; 
00099 //   delete h_mapy; 
00100 
00101 }
00102 
00103 //========================================================================
00104 void
00105 EcalSimple2007H4TBAnalyzer::beginRun(edm::Run const &, edm::EventSetup const& iSetup) {
00106 //========================================================================
00107 
00108   edm::ESHandle<CaloGeometry> pG;
00109   iSetup.get<CaloGeometryRecord>().get(pG);   
00110 
00111   
00112   theTBGeometry_ =  &(*pG);
00113 //  const std::vector<DetId>& validIds=theTBGeometry_->getValidDetIds(DetId::Ecal,EcalEndcap);
00114 //   std::cout << "Found " << validIds.size() << " channels in the geometry" << std::endl;
00115 //   for (unsigned int i=0;i<validIds.size();++i)
00116 //     std::cout << EEDetId(validIds[i]) << std::endl;
00117 
00118 // Amplitude vs TDC offset
00119   h_ampltdc = new TH2F("h_ampltdc","Max Amplitude vs TDC offset", 100,0.,1.,1000, 0., 4000.);
00120 
00121   // Reconstructed energies
00122   h_tableIsMoving = new TH1F("h_tableIsMoving","TableIsMoving", 100000, 0., 100000.);
00123 
00124   h_e1x1 = new TH1F("h_e1x1","E1x1 energy", 1000, 0., 4000.);
00125   h_e3x3 = new TH1F("h_e3x3","E3x3 energy", 1000, 0., 4000.);
00126   h_e5x5 = new TH1F("h_e5x5","E5x5 energy", 1000, 0., 4000.);
00127 
00128   h_e1x1_center = new TH1F("h_e1x1_center","E1x1 energy", 1000, 0., 4000.);
00129   h_e3x3_center = new TH1F("h_e3x3_center","E3x3 energy", 1000, 0., 4000.);
00130   h_e5x5_center = new TH1F("h_e5x5_center","E5x5 energy", 1000, 0., 4000.);
00131 
00132   h_e1e9 = new TH1F("h_e1e9","E1/E9 ratio", 600, 0., 1.2);
00133   h_e1e25 = new TH1F("h_e1e25","E1/E25 ratio", 600, 0., 1.2);
00134   h_e9e25 = new TH1F("h_e9e25","E9/E25 ratio", 600, 0., 1.2);
00135 
00136   h_S6 = new TH1F("h_S6","Amplitude S6", 1000, 0., 4000.);
00137 
00138   h_bprofx = new TH1F("h_bprofx","Beam Profile X",100,-20.,20.);
00139   h_bprofy = new TH1F("h_bprofy","Beam Profile Y",100,-20.,20.);
00140 
00141   h_qualx = new TH1F("h_qualx","Beam Quality X",5000,0.,5.);
00142   h_qualy = new TH1F("h_qualy","Beam Quality X",5000,0.,5.);
00143 
00144   h_slopex = new TH1F("h_slopex","Beam Slope X",500, -5e-4 , 5e-4 );
00145   h_slopey = new TH1F("h_slopey","Beam Slope Y",500, -5e-4 , 5e-4 );
00146 
00147   char hname[50];
00148   char htitle[50];
00149   for (unsigned int icry=0;icry<25;icry++)
00150     {       
00151       sprintf(hname,"h_mapx_%d",icry);
00152       sprintf(htitle,"Max Amplitude vs X %d",icry);
00153       h_mapx[icry] = new TH2F(hname,htitle,80,-20,20,1000,0.,4000.);
00154       sprintf(hname,"h_mapy_%d",icry);
00155       sprintf(htitle,"Max Amplitude vs Y %d",icry);
00156       h_mapy[icry] = new TH2F(hname,htitle,80,-20,20,1000,0.,4000.);
00157     }
00158   
00159   h_e1e9_mapx = new TH2F("h_e1e9_mapx","E1/E9 vs X",80,-20,20,600,0.,1.2);
00160   h_e1e9_mapy = new TH2F("h_e1e9_mapy","E1/E9 vs Y",80,-20,20,600,0.,1.2);
00161 
00162   h_e1e25_mapx = new TH2F("h_e1e25_mapx","E1/E25 vs X",80,-20,20,600,0.,1.2);
00163   h_e1e25_mapy = new TH2F("h_e1e25_mapy","E1/E25 vs Y",80,-20,20,600,0.,1.2);
00164 
00165   h_e9e25_mapx = new TH2F("h_e9e25_mapx","E9/E25 vs X",80,-20,20,600,0.,1.2);
00166   h_e9e25_mapy = new TH2F("h_e9e25_mapy","E9/E25 vs Y",80,-20,20,600,0.,1.2);
00167 
00168   h_Shape_ = new TH2F("h_Shape_","Xtal in Beam Shape",250,0,10,350,0,3500);
00169 
00170 }
00171 
00172 //========================================================================
00173 void
00174 EcalSimple2007H4TBAnalyzer::endJob() {
00175 //========================================================================
00176 
00177   TFile f(rootfile_.c_str(),"RECREATE");
00178 
00179   // Amplitude vs TDC offset
00180   h_ampltdc->Write(); 
00181 
00182   // Reconstructed energies
00183   h_e1x1->Write(); 
00184   h_e3x3->Write(); 
00185   h_e5x5->Write(); 
00186 
00187   h_e1x1_center->Write(); 
00188   h_e3x3_center->Write(); 
00189   h_e5x5_center->Write(); 
00190 
00191   h_e1e9->Write(); 
00192   h_e1e25->Write(); 
00193   h_e9e25->Write(); 
00194 
00195   h_S6->Write(); 
00196   h_bprofx->Write(); 
00197   h_bprofy->Write(); 
00198 
00199   h_qualx->Write(); 
00200   h_qualy->Write(); 
00201 
00202   h_slopex->Write(); 
00203   h_slopey->Write(); 
00204   
00205   h_Shape_->Write();
00206 
00207   for (unsigned int icry=0;icry<25;icry++)
00208     {       
00209       h_mapx[icry]->Write(); 
00210       h_mapy[icry]->Write(); 
00211     }
00212 
00213   h_e1e9_mapx->Write(); 
00214   h_e1e9_mapy->Write(); 
00215 
00216   h_e1e25_mapx->Write(); 
00217   h_e1e25_mapy->Write(); 
00218 
00219   h_e9e25_mapx->Write(); 
00220   h_e9e25_mapy->Write(); 
00221 
00222   h_tableIsMoving->Write();
00223 
00224   f.Close();
00225 }
00226 
00227 //
00228 // member functions
00229 //
00230 
00231 //========================================================================
00232 void
00233 EcalSimple2007H4TBAnalyzer::analyze( edm::Event const & iEvent, edm::EventSetup const & iSetup ) {
00234 //========================================================================
00235 
00236    using namespace edm;
00237    using namespace cms;
00238 
00239 
00240 
00241    Handle<EEDigiCollection> pdigis;
00242    const EEDigiCollection* digis=0;
00243    //std::cout << "EcalSimple2007H4TBAnalyzer::analyze getting product with label: " << digiProducer_.c_str()<< " prodname: " << digiCollection_.c_str() << endl;
00244    iEvent.getByLabel( digiProducer_, digiCollection_,pdigis);
00245    if ( pdigis.isValid() ) {
00246      digis = pdigis.product(); // get a ptr to the product
00247      //iEvent.getByLabel( hitProducer_, phits);
00248    } else {
00249            edm::LogError("EcalSimple2007H4TBAnalyzerError") << "Error! can't get the product " << digiCollection_;
00250    }
00251 
00252    // fetch the digis and compute signal amplitude
00253    Handle<EEUncalibratedRecHitCollection> phits;
00254    const EEUncalibratedRecHitCollection* hits=0;
00255    //std::cout << "EcalSimple2007H4TBAnalyzer::analyze getting product with label: " << digiProducer_.c_str()<< " prodname: " << digiCollection_.c_str() << endl;
00256    iEvent.getByLabel( hitProducer_, hitCollection_,phits);
00257    if (phits.isValid()) {
00258      hits = phits.product(); // get a ptr to the product
00259      //iEvent.getByLabel( hitProducer_, phits);
00260    } else {
00261            edm::LogError("EcalSimple2007H4TBAnalyzerError") << "Error! can't get the product " << hitCollection_;
00262    }
00263 
00264    Handle<EcalTBHodoscopeRecInfo> pHodo;
00265    const EcalTBHodoscopeRecInfo* recHodo=0;
00266    //std::cout << "EcalSimple2007H4TBAnalyzer::analyze getting product with label: " << digiProducer_.c_str()<< " prodname: " << digiCollection_.c_str() << endl;
00267    iEvent.getByLabel( hodoRecInfoProducer_, hodoRecInfoCollection_, pHodo);
00268    if ( pHodo.isValid() ) {
00269      recHodo = pHodo.product(); // get a ptr to the product
00270    } else {
00271            edm::LogError("EcalSimple2007H4TBAnalyzerError") << "Error! can't get the product " << hodoRecInfoCollection_;
00272    }
00273 
00274    Handle<EcalTBTDCRecInfo> pTDC;
00275    const EcalTBTDCRecInfo* recTDC=0;
00276    //std::cout << "EcalSimple2007H4TBAnalyzer::analyze getting product with label: " << digiProducer_.c_str()<< " prodname: " << digiCollection_.c_str() << endl;
00277    iEvent.getByLabel( tdcRecInfoProducer_, tdcRecInfoCollection_, pTDC);
00278    if ( pTDC.isValid() ) {
00279      recTDC = pTDC.product(); // get a ptr to the product
00280    } else {
00281            edm::LogError("EcalSimple2007H4TBAnalyzerError") << "Error! can't get the product " << tdcRecInfoCollection_;
00282    }
00283 
00284    Handle<EcalTBEventHeader> pEventHeader;
00285    const EcalTBEventHeader* evtHeader=0;
00286    //std::cout << "EcalSimple2007H4TBAnalyzer::analyze getting product with label: " << digiProducer_.c_str()<< " prodname: " << digiCollection_.c_str() << endl;
00287    iEvent.getByLabel( eventHeaderProducer_ , pEventHeader );
00288    if ( pEventHeader.isValid() ) {
00289      evtHeader = pEventHeader.product(); // get a ptr to the product
00290    } else {
00291            edm::LogError("EcalSimple2007H4TBAnalyzerError") << "Error! can't get the product " << eventHeaderProducer_;
00292    }
00293    
00294    
00295    if (!hits)
00296      {
00297        //       std::cout << "1" << std::endl;
00298        return;
00299      }
00300 
00301    if (!recTDC)
00302      {
00303        //       std::cout << "2" << std::endl;
00304        return;
00305      }
00306 
00307    if (!recHodo)
00308      {
00309        //       std::cout << "3" << std::endl;
00310        return;
00311      }
00312 
00313    if (!evtHeader)
00314      {
00315        //       std::cout << "4" << std::endl;
00316        return;
00317      }
00318 
00319    if (hits->size() == 0)
00320      {
00321        //       std::cout << "5" << std::endl;
00322        return;
00323      }
00324 
00325    //Accessing various event information
00326    if (evtHeader->tableIsMoving())
00327      h_tableIsMoving->Fill(evtHeader->eventNumber());
00328 
00329 //    std::cout << "event " << evtHeader->eventNumber() 
00330 //           << "\trun number " << evtHeader->runNumber()   
00331 //           << "\tburst number " << evtHeader->burstNumber()   
00332 //           << "\tbeginLV1A " << evtHeader->begBurstLV1A()
00333 //           << "\tendLV1A " << evtHeader->endBurstLV1A()
00334 //           << "\ttime " << evtHeader->date()
00335 //           << "\thas errors " << int(evtHeader->syncError())
00336 //           << std::endl;
00337 
00338 //    std::cout << "scaler";
00339 //    for (int iscaler=0;iscaler < 36;iscaler++)
00340 //      std::cout << "\t#" << iscaler << " " <<  evtHeader->scaler(iscaler);
00341 //    std::cout<<std::endl;
00342 
00343    //S6 beam scintillator
00344    h_S6->Fill(evtHeader->S6ADC());
00345 
00346    if (xtalInBeamTmp.null())
00347      {
00348        xtalInBeamTmp = EBDetId(1,evtHeader->crystalInBeam(),EBDetId::SMCRYSTALMODE);
00349        xtalInBeam_ = EEDetId( 35 - ((xtalInBeamTmp.ic()-1)%20) ,int(int(xtalInBeamTmp.ic())/int(20))+51, -1);
00350        std::cout<< "Xtal In Beam is " << xtalInBeam_.ic() << xtalInBeam_ << std::endl;
00351        for (unsigned int icry=0;icry<25;icry++)
00352          {
00353            unsigned int row = icry / 5;
00354            unsigned int column= icry %5;
00355            int ix=xtalInBeam_.ix()+row-2;
00356            int iy=xtalInBeam_.iy()+column-2;
00357            EEDetId tempId(ix, iy, xtalInBeam_.zside());
00358            //Selecting matrix of xtals used in 2007H4TB
00359            if (tempId.ix()<16 || tempId.ix()>35 || tempId.iy()<51 || tempId.iy()>75)
00360              Xtals5x5[icry]=EEDetId(0);
00361            else
00362              {
00363                Xtals5x5[icry]=tempId;
00364                const CaloCellGeometry* cell=theTBGeometry_->getGeometry(Xtals5x5[icry]);
00365                if (!cell) 
00366                  continue;
00367                const TruncatedPyramid* tp ( dynamic_cast<const TruncatedPyramid*>(cell) ) ;
00368                std::cout << "** Xtal in the matrix **** row " << row  << ", column " << column << ", xtal " << Xtals5x5[icry] << " Position " << tp->getPosition(0.) << std::endl;
00369              }
00370          }
00371      }
00372    else 
00373      if (xtalInBeamTmp != EBDetId(1,evtHeader->crystalInBeam(),EBDetId::SMCRYSTALMODE)) //run analysis only on first xtal in beam
00374        return;
00375 
00376    //Avoid moving table events
00377    if (evtHeader->tableIsMoving())
00378      {
00379        std::cout << "Table is moving" << std::endl;
00380        return;
00381      }
00382 
00383 
00384    
00385    // Searching for max amplitude xtal alternative to use xtalInBeam_
00386    EEDetId maxHitId(0); 
00387    float maxHit= -999999.;
00388    for(EEUncalibratedRecHitCollection::const_iterator ithit = hits->begin(); ithit != hits->end(); ++ithit) 
00389      {
00390        if (ithit->amplitude()>=maxHit)
00391          {
00392            maxHit=ithit->amplitude();
00393            maxHitId=ithit->id();
00394          }
00395        
00396      }   
00397    if (maxHitId==EEDetId(0))
00398      {
00399        std::cout << "No maxHit found" << std::endl;
00400        return;
00401      }
00402 
00403     
00404    //Filling the digis shape for the xtalInBeam
00405    bool gain_switch = false;
00406    double samples_save[10]; for(int i=0; i < 10; ++i) samples_save[i]=0.0;
00407    double gain_save[10];    for(int i=0; i < 10; ++i) gain_save[i]=0.0;
00408    
00409    int sMax = -1;
00410    double eMax = 0.;
00411    for ( EEDigiCollection::const_iterator digiItr= digis->begin();digiItr != digis->end(); 
00412          ++digiItr ) 
00413      {          
00414        if ( EEDetId((*digiItr).id()) != xtalInBeam_ )
00415          continue;
00416        
00417        EEDataFrame myDigi = (*digiItr);
00418        for (int sample = 0; sample < myDigi.size(); ++sample)
00419          {
00420            double analogSample = myDigi.sample(sample).adc();
00421            double gainSample   = myDigi.sample(sample).gainId();
00422            samples_save[sample] = analogSample;
00423            gain_save[sample]    = gainSample;
00424            //  std::cout << analogSample << " ";
00425            if ( eMax < analogSample )
00426              {
00427                eMax = analogSample;
00428                sMax = sample;
00429              }
00430            if(gainSample != 1) gain_switch = true;
00431          }
00432        // std::cout << std::endl;
00433      }
00434 
00435    for(int i =0; i < 10; ++i) 
00436      h_Shape_->Fill(double(i)+recTDC->offset(),samples_save[i]);
00437 
00438 
00439 
00440    // Taking amplitudes in 5x5
00441    double amplitude[25];
00442    double amplitude3x3=0;  
00443    double amplitude5x5=0;  
00444    for (unsigned int icry=0;icry<25;icry++)
00445      {
00446        if (!Xtals5x5[icry].null())
00447          {
00448            amplitude[icry]=(hits->find(Xtals5x5[icry]))->amplitude();
00449            amplitude5x5 += amplitude[icry];
00450            // Is in 3x3?
00451            if ( icry == 6  || icry == 7  || icry == 8 ||
00452                 icry == 11 || icry == 12 || icry ==13 ||
00453                 icry == 16 || icry == 17 || icry ==18   )
00454              {
00455                amplitude3x3+=amplitude[icry];
00456              }
00457          }
00458      }
00459 
00460    //Filling amplitudes
00461    h_e1x1->Fill(amplitude[12]);
00462    h_e3x3->Fill(amplitude3x3);
00463    h_e5x5->Fill(amplitude5x5);
00464 
00465    h_e1e9->Fill(amplitude[12]/amplitude3x3);
00466    h_e1e25->Fill(amplitude[12]/amplitude5x5);
00467    h_e9e25->Fill(amplitude3x3/amplitude5x5);
00468 
00469    //Checking stability of amplitude vs TDC
00470    if (recTDC)
00471      h_ampltdc->Fill(recTDC->offset(),amplitude[12]);
00472 
00473    //Various amplitudes as a function of hodoscope coordinates
00474    if (recHodo)
00475      {
00476        float x=recHodo->posX();
00477        float y=recHodo->posY();
00478        float xslope=recHodo->slopeX();
00479        float yslope=recHodo->slopeY();
00480        float xqual=recHodo->qualX();
00481        float yqual=recHodo->qualY();
00482        
00483        //Filling beam profiles
00484        h_bprofx->Fill(x);
00485        h_bprofy->Fill(y);
00486        h_qualx->Fill(xqual);
00487        h_qualy->Fill(yqual);
00488        h_slopex->Fill(xslope);
00489        h_slopey->Fill(yslope);
00490 
00491        //Fill central events
00492 
00493        
00494        if ( fabs(x + 2.5) < 2.5 && fabs(y + 0.5) < 2.5)
00495          {
00496            h_e1x1_center->Fill(amplitude[12]);
00497            h_e3x3_center->Fill(amplitude3x3);
00498            h_e5x5_center->Fill(amplitude5x5);
00499          }
00500 
00501        for (unsigned int icry=0;icry<25;icry++)
00502          {       
00503            h_mapx[icry]->Fill(x,amplitude[icry]);
00504            h_mapy[icry]->Fill(y,amplitude[icry]);
00505          }
00506 
00507        h_e1e9_mapx->Fill(x,amplitude[12]/amplitude3x3);
00508        h_e1e9_mapy->Fill(y,amplitude[12]/amplitude3x3);
00509 
00510        h_e1e25_mapx->Fill(x,amplitude[12]/amplitude5x5);
00511        h_e1e25_mapy->Fill(y,amplitude[12]/amplitude5x5);
00512 
00513        h_e9e25_mapx->Fill(x,amplitude3x3/amplitude5x5);
00514        h_e9e25_mapy->Fill(y,amplitude3x3/amplitude5x5);
00515      }
00516 
00517 }
00518 
00519