// system include files
#include <memory>

// user include files
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/EDAnalyzer.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "FWCore/Framework/interface/ESHandle.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/ServiceRegistry/interface/Service.h"

#include "CondCore/DBCommon/interface/DBWriter.h"
#include "CondCore/DBCommon/interface/DBSession.h"
#include "CondCore/DBCommon/interface/Exception.h"
#include "CondCore/DBCommon/interface/ServiceLoader.h"
#include "CondCore/DBCommon/interface/ConnectMode.h"
#include "CondCore/DBCommon/interface/MessageLevel.h"
#include "CondCore/IOVService/interface/IOV.h"
#include "CondCore/MetaDataService/interface/MetaData.h"
#include "FWCore/Framework/interface/IOVSyncValue.h"
#include "SealKernel/Service.h"
#include "POOLCore/POOLContext.h"
#include "SealKernel/Context.h"

#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
#include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
#include "Geometry/CommonTopologies/interface/StripTopology.h"

#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "CondFormats/DataRecord/interface/SiStripFedCablingRcd.h"
#include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
#include "CondFormats/SiStripObjects/interface/FedChannelConnection.h"
#include "CalibFormats/SiStripObjects/interface/SiStripFecCabling.h"
// clhep
#include "CLHEP/Random/RandFlat.h"

#include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetType.h"
#include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
#include "DataFormats/FEDRawData/interface/FEDNumbering.h"

#include "FWCore/MessageLogger/interface/MessageLogger.h"

#include "CommonTools/TrackerMap/interface/TmModule.h"
#include "CommonTools/TrackerMap/interface/FedTrackerMap.h"
#include "CommonTools/TrackerMap/interface/TmApvPair.h"

using namespace std;
using namespace edm;

class SiStripFedCablingAnalyzer : public edm::EDAnalyzer {
   public:
      explicit SiStripFedCablingAnalyzer( const edm::ParameterSet& );
      ~SiStripFedCablingAnalyzer();
      virtual void analyze( const edm::Event&, const edm::EventSetup& );
   private:
    FedTrackerMap * fedtkMap;
    TrackerMap * tkMap;
    int nev;
};

SiStripFedCablingAnalyzer::SiStripFedCablingAnalyzer( const edm::ParameterSet& iConfig )
{ //now do what ever initialization is needed
  ::putenv("CORAL_AUTH_USER=me");
  ::putenv("CORAL_AUTH_PASSWORD=mypass"); 
  nev =0;
}

SiStripFedCablingAnalyzer::~SiStripFedCablingAnalyzer(){
fedtkMap->print();
tkMap->print();
}

void SiStripFedCablingAnalyzer::analyze( const edm::Event& iEvent, const edm::EventSetup& iSetup ) {
  edm::ESHandle<SiStripFedCabling> tkFed;
  std::cout<<"SiStripFedCablingAnalyzer::analyze --- "<<endl;
  iSetup.get<SiStripFedCablingRcd>().get(tkFed);
  
  if(nev==0){
  fedtkMap = new FedTrackerMap(tkFed);} 
  tkMap = new TrackerMap();
  const vector<unsigned short> feds = tkFed->feds();
  cout<<"SiStripFedCabling has "<< feds.size()<<" active FEDS in SiStripFedCablingAnalizer"<<endl;
for(vector<unsigned short>::const_iterator ifed = feds.begin();ifed<feds.end();ifed++){
    const std::vector<FedChannelConnection> theconn = tkFed->connections( *ifed );
    srand(*ifed);
    int red = rand()%256;int green=rand()%256;int blue=rand()%256;
    for(std::vector<FedChannelConnection>::const_iterator iconn = theconn.begin();iconn<theconn.end();iconn++){
      int key = iconn->fedId()*1000+iconn->fedCh();
      TmApvPair* apvpair = SvgApvPair::apvMap[key];
//      if(apvpair!=0){fedtkMap->fillc(iconn->fedId(),iconn->fedCh(),red,green,blue);
//      TmModule *module=apvpair->mod;
//      if(module!=0)tkMap->fillc(module->idex,red,green,blue);
//      }
      if(apvpair!=0 && apvpair->mpos==0){
      TmModule *module=apvpair->mod;
      if(module!=0)fedtkMap->fill(module->idex,(float)module->layer*3.);
      if(module!=0)tkMap->fill(module->idex,(float)module->layer*3.);
      }
      }
      }
  nev++; 
}

//define this as a plug-in
DEFINE_FWK_MODULE(SiStripFedCablingAnalyzer)
