Vimal Bhatia

336 papers B 17C 4Misc 4Journal 189Unranked 118
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Wirel. Commun. Lett.
Sukhsagar, Nagendra Kumar, Ambuj Kumar Mishra, Vimal Bhatia, Ondrej Krejcar
2026 J jnl
IEEE Trans. Cogn. Commun. Netw.
Abhinav Singh Parihar, Keshav Singh, Vimal Bhatia, Chih-Peng Li, Derrick Wing Kwan Ng
2026 book
Vimal Bhatia, Zhiguo Ding, Keshav Singh, Amit Baghel, Abhinav Singh Parihar, Deepak Kumar
2026 J jnl
IEEE Internet Things J.
Sukanya Deka, Kuntal Deka, Nhan Thanh Nguyen, Sanjeev Sharma, Vimal Bhatia, Nandana Rajatheva
2026 J jnl
IEEE Wirel. Commun. Lett.
Yukti Kaura, Justin Jose, Brejesh Lall, Ranjan K. Mallik, Amit Singhal, Vimal Bhatia
2026 J jnl
IET Commun.
Rangeet Mitra, Sandesh Jain, K. Venkateswaran, Rajat Kumar, Vimal Bhatia, Ondrej Krejcar
2026 conf
NCC
Avinash Upadhyay, Shashwat Saxena, Ritu Raj Singh, Pravindra Kumar, Anand Srivastava, Vimal Bhatia
2026 J jnl
IEEE Wirel. Commun. Lett.
Yujie Ma, Wenqi Huang, Zhiguo Ding, Daniel K. C. So, Vimal Bhatia
2026 J jnl
IEEE Wirel. Commun. Lett.
Puspraj Singh Chauhan, Vimal Bhatia, Sonia Aïssa, Ondrej Krejcar
2026 J jnl
IEEE Trans. Veh. Technol.
Anupma Sharma, Keshav Singh, Vimal Bhatia, Chih-Peng Li, Zhiguo Ding
2026 J jnl
IEEE Trans. Cogn. Commun. Netw.
Abhinav Singh Parihar, Keshav Singh, Vimal Bhatia, Chih-Peng Li, Zhiguo Ding
2026 J jnl
IEEE Wirel. Commun. Lett.
Pawan Maurya, Dharmendra Dixit, Ambuj Kumar Mishra, Vimal Bhatia, Ondrej Krejcar
2026 J jnl
Wirel. Pers. Commun.
Ankit Jain, Imran Ullah Khan, Puspraj Singh Chauhan, Vimal Bhatia
2025 conf
ANTS
Uday Kumar Singh, Rangeet Mitra, Amit Kumar Mishra, Vimal Bhatia, K. Venkateswaran, Arijit Datta, Rama Rao Thipparaju
2025 J jnl
IEEE Commun. Lett.
Nargis Fayaz, Justin Jose, Ranjan K. Mallik, Brejesh Lall, Vimal Bhatia
2025 J jnl
IEEE Wirel. Commun. Lett.
Sukhsagar, Nagendra Kumar, Vimal Bhatia, Ondrej Krejcar
2025 J jnl
IEEE Trans. Veh. Technol.
Puspraj Singh Chauhan, Paresh Chandra Sau, Sandeep Kumar, Sonia Aïssa, Osamah S. Badarneh, Vimal Bhatia
2025 J jnl
IEEE Wirel. Commun. Lett.
Anupma Sharma, Keshav Singh, Vimal Bhatia, Chih-Peng Li, Zhiguo Ding
2025 J jnl
Phys. Commun.
Parth Toshniwal, Justin Jose, Sumit Gautam, Vimal Bhatia, Ondrej Krejcar
2025 conf
ANTS
Shashwat Saxena, Anand Srivastava, Vimal Bhatia, Pravindra Kumar, Ritu Raj Singh
2025 conf
ANTS
Rohit Prajapati, Atharva Navarkar, Aditya Guhagarkar, Vimal Bhatia
2025 J jnl
IEEE Trans. Veh. Technol.
Thushan Sivalingam, Bhagyashree Gour, Shivani Yadav, Vimal Bhatia, Nandana Rajatheva
2025 J jnl
IEEE Access
Sandesh Jain, Pankaj Kumar, Rangeet Mitra, Praveen Kumar Singya, Sanjeev Sharma, Vimal Bhatia
2025 conf
ANTS
Atul Verma, Rangeet Mitra, Sandesh Jain, K. Venkateswaran, Vimal Bhatia
2025 conf
ANTS
Suman Palrecha, Pravindra Kumar, Vimal Bhatia, Anand Srivastava, Ritu Raj Singh
2025 J jnl
Phys. Commun.
Puspraj Singh Chauhan, Paresh Chandra Sau, Sandeep Kumar, Ankit Jain, Sonia Aïssa, Vimal Bhatia
2025 J jnl
Wirel. Pers. Commun.
Vaishali Sharma, Sanjeev Sharma, Vimal Bhatia, Peter Brida
2025 B conf
WCNC
Chinthani Kumaradasa, Deepak Kumar, Nandana Rajatheva, Vimal Bhatia
2025 J jnl
IEEE Wirel. Commun. Lett.
Amit Baghel, Abhinav Singh Parihar, Vimal Bhatia, Ondrej Krejcar, Kwonhue Choi
2025 conf
EuCNC/6G Summit
Deepak Kumar, Chandan Kumar Singh, Onel L. Alcaraz López, Vimal Bhatia, Matti Latva-aho
2025 conf
ICC Workshops
Abhinav Singh Parihar, Keshav Singh, Chih-Peng Li, Vimal Bhatia, Trung Q. Duong
2025 conf
ANTS
Umesh Singh, Sunil Chavda, Sumit Gautam, Ashwani Sharma, Vimal Bhatia
2025 J jnl
IEEE Trans. Veh. Technol.
Deepak Kumar, Chandan Kumar Singh, Onel L. Alcaraz López, Vimal Bhatia, Matti Latva-aho
2025 J jnl
IEEE Wirel. Commun. Lett.
Shubham Bisen, Vimal Bhatia, Brejesh Lall, Ondrej Krejcar
2025 J jnl
IEEE Trans. Wirel. Commun.
Deepak Kumar, Chandan Kumar Singh, Onel L. Alcaraz López, Vimal Bhatia, Matti Latva-aho
2025 J jnl
IEEE Trans. Veh. Technol.
Supriya Kumari, Seshan Srirangarajan, Vimal Bhatia
2025 J jnl
IEEE Wirel. Commun. Lett.
Amit Baghel, Divyanshi Singh, Abhinav Singh Parihar, Peter Brida, Vimal Bhatia, Ondrej Krejcar, Nandana Rajatheva, Matti Latva-aho
2025 conf
ANTS
Shravan Kumar Namdeo, Amit Baghel, Vimal Bhatia
2025 J jnl
IEEE Wirel. Commun. Lett.
Pranjul S. Chauhan, Raviteja Allu, Keshav Singh, Vimal Bhatia, Zhiguo Ding
2025 J jnl
IET Quantum Commun.
Vimal Bhatia, Adolph Kasegenya, Bowen Chen
2025 J jnl
IEEE Wirel. Commun. Lett.
Amit Baghel, Divyanshi Singh, Abhinav Singh Parihar, Vimal Bhatia, Nandana Rajatheva, Matti Latva-aho
2025 J jnl
Digit. Signal Process.
Puspraj Singh Chauhan, Paresh Chandra Sau, Sandeep Kumar, Ankit Jain, Vimal Bhatia
2025 B conf
WCNC
Anupma Sharma, Keshav Singh, Vimal Bhatia, Chih-Peng Li
2025 conf
ANTS
Xue Hu, Hong Chen, Weidong Shao, Vimal Bhatia, Suman Palrecha, Bowen Chen
2025 conf
NCC
Dhruv Sanghvi, Sandesh Jain, Manisha Pattanaik, Vimal Bhatia
2025 conf
JC&S
Guddu Kumar, Vimal Bhatia, Markku J. Juntti
2025 conf
ANTS
Mahima Chouksey, Sandesh Jain, Vimal Bhatia
2025 conf
ANTS
Pranjul S. Chauhan, Raviteja Allu, Keshav Singh, Vimal Bhatia, Sudeep Biswas
2025 J jnl
IEEE Trans. Cogn. Commun. Netw.
Justin Jose, Parvez Shaik, Shubham Bisen, Ondrej Krejcar, Kwonhue Choi, Vimal Bhatia
2024 conf
ICC
Sravani Kurma, Keshav Singh, Vimal Bhatia, Chih-Peng Li, Theodoros A. Tsiftsis
2024 J jnl
IEEE Trans. Cogn. Commun. Netw.
Vidya Bhasker Shukla, Ondrej Krejcar, Kwonhue Choi, Ambuj Kumar Mishra, Vimal Bhatia
2024 J jnl
IEEE Wirel. Commun. Lett.
Vidya Bhasker Shukla, Vimal Bhatia, Kwonhue Choi
2024 conf
RADIOELEKTRONIKA
Yashveer Singh, Pragya Swami, Vimal Bhatia, Peter Brida
2024 J jnl
IEEE Access
Vivek Pathak, R. Chethan, Rahul Jashvantbhai Pandya, Sridhar Iyer, Vimal Bhatia
2024 B conf
PIMRC
Vaishali Sharma, Prakhar Keshari, Sanjeev Sharma, Kuntal Deka, Sandesh Jain, Vimal Bhatia
2024 Misc conf
COMSNETS
Shubham Bisen, Vimal Bhatia
2024 J jnl
IEEE Commun. Lett.
Vidya Bhasker Shukla, Vimal Bhatia, Kwonhue Choi
2024 J jnl
CoRR
Prasoon Raghuwanshi, Onel Luis Alcaraz López, Vimal Bhatia, Matti Latva-aho
2024 conf
WPMC
Rajat Kumar, Vidya Bhasker Shukla, Rangeet Mitra, Vimal Bhatia, Nandana Rajatheva, Matti Latva-aho
2024 J jnl
IET Quantum Commun.
Purva Sharma, Vimal Bhatia, Shashi Prakash
2024 J jnl
IEEE Access
Sanjeev Sharma, Amit Kumar Mishra, M. Hemanta Kumar, Kuntal Deka, Vimal Bhatia
2024 conf
WPMC
Pawan Maurya, Vimal Bhatia, Nandana Rajatheva, Matti Latva-aho
2024 B conf
PIMRC
Sandesh Jain, Praveen Kumar Singya, Vidya Bhasker Shukla, Sudhan Majhi, Vimal Bhatia
2024 J jnl
IEEE Trans. Veh. Technol.
Amit Baghel, Abhinav Singh Parihar, Kwonhue Choi, Vimal Bhatia
2024 conf
ANTS
Amit Baghel, Divyanshi Singh, Vimal Bhatia, Nandana Rajatheva, Matti Latva-aho
2024 J jnl
IEEE Trans. Veh. Technol.
Amit Baghel, Abhinav Singh Parihar, Vimal Bhatia, Kwonhue Choi, Amit Kumar Mishra
2024 B conf
PIMRC
Shubham Bisen, Justin Jose, Sandesh Jain, Aryan Kaushik, Vimal Bhatia
2024 J jnl
IEEE Trans. Veh. Technol.
Shubham Bisen, Justin Jose, Zhiguo Ding, Kwonhue Choi, Vimal Bhatia
2024 J jnl
IEEE Open J. Commun. Soc.
Parvez Shaik, Kamal K. Garg, Praveen Kumar Singya, Vimal Bhatia, Ondrej Krejcar, Mohamed-Slim Alouini
2024 conf
GLOBECOM (Workshops)
Abhinav Singh Parihar, Keshav Singh, Chih-Peng Li, Vimal Bhatia, Trung Q. Duong
2024 conf
NCC
Abhinav Singh Parihar, Amit Baghel, Pragya Swami, Vimal Bhatia
2024 conf
ANTS
Pranjul S. Chauhan, Justin Jose, Granthik Halder, Brejesh Lall, Peter Brida, Vimal Bhatia
2024 J jnl
ICT Express
Kamal K. Garg, Parvez Shaik, Rachna Sharma, Peter Brida, Ondrej Krejcar, Vimal Bhatia
2024 J jnl
IEEE Syst. J.
Justin Jose, Anirudh Agarwal, Parvez Shaik, Vinat Goyal, Kwonhue Choi, Vimal Bhatia
2024 J jnl
IEEE Trans. Veh. Technol.
Justin Jose, Shubham Bisen, Parvez Shaik, Sudip Biswas, Keshav Singh, Ondrej Krejcar, Vimal Bhatia
2024 J jnl
IEEE Internet Things J.
Abhinav Singh Parihar, Keshav Singh, Vimal Bhatia, Chih-Peng Li, Trung Q. Duong
2024 J jnl
IEEE Wirel. Commun. Lett.
Supriya Kumari, Seshan Srirangarajan, Vimal Bhatia
2024 J jnl
Ad Hoc Networks
Justin Jose, Parvez Shaik, Shubham Bisen, Amrita Srivastava, Vimal Bhatia, Kwonhue Choi
2024 J jnl
IEEE Access
Vaishali Sharma, Deepak Kumar, Sanjeev Sharma, Vimal Bhatia, Ondrej Krejcar, Peter Brida
2024 conf
WPMC
Aditya Guhagarkar, Thushan Sivalingam, Vimal Bhatia, Nandana Rajatheva, Matti Latva-aho
2024 J jnl
EURASIP J. Wirel. Commun. Netw.
Shubham Bisen, Vimal Bhatia, Peter Brida
2024 J jnl
IEEE Consumer Electron. Mag.
Krishnendu S. Tharakan, B. N. Bharath, Vimal Bhatia, Jamel Nebhen, Michal Dobrovolny, Tharmalingam Ratnarajah
2024 J jnl
Photonic Netw. Commun.
Anupma Sharma, Vidya Bhasker Shukla, Vimal Bhatia, Kwonhue Choi
2023 J jnl
Int. J. Commun. Syst.
Shubham Bisen, Parvez Shaik, Justin Jose, Jamel Nebhen, Ondrej Krejcar, Vimal Bhatia
2023 conf
ANTS
Vidya Bhasker Shukla, Aryan Kaushik, Vimal Bhatia
2023 J jnl
IEEE Wirel. Commun. Lett.
Amit Singh, Sanjeev Sharma, Kuntal Deka, Vimal Bhatia
2023 J jnl
J. Commun. Inf. Networks
Amit Singh, Sanjeev Sharma, Kuntal Deka, Vimal Bhatia
2023 J jnl
IEEE Access
Nikhil Kaler, Vimal Bhatia, Amit Kumar Mishra
2023 J jnl
IET Quantum Commun.
Purva Sharma, Shubham Gupta, Vimal Bhatia, Shashi Prakash
2023 ch.
A Glimpse Beyond 5G in Wireless Networks
Parvez Shaik, Vimal Bhatia
2023 conf
EuCNC/6G Summit
Justin Jose, Parvez Shaik, Shubham Bisen, Vimal Bhatia
2023 conf
ANTS
Thushan Sivalingam, Anupma Sharma, Vimal Bhatia, Nandana Rajatheva, Sanjeev Sharma, Kuntal Deka
2023 Misc conf
COMSNETS
Justin Jose, Parvez Shaik, Shubham Bisen, Vinat Goyal, Vimal Bhatia
2023 J jnl
IEEE Access
Sumanta Kumar Nanda, Guddu Kumar, Amit Kumar Naik, Mohammed Abdel-Hafez, Vimal Bhatia, Ondrej Krejcar, Abhinoy Kumar Singh
2023 J jnl
IEEE Commun. Lett.
Shubham Bisen, Justin Jose, Vimal Bhatia, Amit Kumar Mishra, Kwonhue Choi
2023 conf
ANTS
Vimal Bhatia, Shubham Bisen
2023 J jnl
IEEE Syst. J.
Sanjeev Sharma, Kuntal Deka, Vimal Bhatia
2023 J jnl
Biomed. Signal Process. Control.
Sumanta Kumar Nanda, Guddu Kumar, Vimal Bhatia, Abhinoy Kumar Singh
2023 conf
ANTS
Anupma Sharma, Prakhar Keshari, Vimal Bhatia
2023 ch.
A Glimpse Beyond 5G in Wireless Networks
Pragya Swami, Vimal Bhatia
2023 J jnl
IEEE Commun. Lett.
Deepak Kumar, Praveen Kumar Singya, Ondrej Krejcar, Kwonhue Choi, Vimal Bhatia
2023 J jnl
IEEE Wirel. Commun. Lett.
Abhinav Singh Parihar, Pragya Swami, Kwonhue Choi, Peter Brida, Vimal Bhatia
2023 conf
NCC
Deepak Kumar, Praveen Kumar Singya, Vimal Bhatia
2023 J jnl
IEEE Trans. Cogn. Commun. Netw.
Deepak Kumar, Praveen Kumar Singya, Ondrej Krejcar, Vimal Bhatia
2023 conf
ANTS
Supriya Kumari, Seshan Srirangarajan, Vimal Bhatia
2023 J jnl
Phys. Commun.
R. K. Hindustani, Dharmendra Dixit, Sanjeev Sharma, Vimal Bhatia
2023 B conf
WCNC
Shubham Bisen, Vimal Bhatia
2023 conf
ANTS
Navneet Garg, Abhinav Singh Parihar, Vimal Bhatia
2023 conf
ICC Workshops
Gulshan Rai, Kamal Agrawal, Shankar Prakriya, Vimal Bhatia, Kamal K. Garg
2023 J jnl
IEEE Trans. Veh. Technol.
Vidya Bhasker Shukla, Rangeet Mitra, Ondrej Krejcar, Vimal Bhatia, Kwonhue Choi
2023 J jnl
IEEE Trans. Veh. Technol.
Deepak Kumar, Praveen Kumar Singya, Ondrej Krejcar, Kwonhue Choi, Vimal Bhatia
2023 B conf
WCNC
Deepak Kumar, Praveen Kumar Singya, Vimal Bhatia
2023 J jnl
IEEE Syst. J.
Deepak Kumar, Praveen Kumar Singya, Jamel Nebhen, Vimal Bhatia
2023 J jnl
IEEE Access
Vivek Pathak, Rahul Jashvantbhai Pandya, Vimal Bhatia, Onel Luiz Alcaraz López
2023 conf
ANTS
Purva Sharma, Vimal Bhatia, Shashi Prakash
2023 J jnl
IEEE Trans. Cogn. Commun. Netw.
Deepak Kumar, Praveen Kumar Singya, Kwonhue Choi, Vimal Bhatia
2023 J jnl
Sensors
Purva Sharma, Kwonhue Choi, Ondrej Krejcar, Pavel Blazek, Vimal Bhatia, Shashi Prakash
2023 conf
ANTS
Amit K. Shrivastava, Satish Kumar, Khushboo Sahu, Bhavesh Sonwani, Dixit Sharma, Dipti S. Srivastava, Navneet Garg, Arzad Alam Kherani, Vimal Bhatia, Soumava Mukherjee, Samrat Mukhopadhyay, Priyanka Das, Rajarshi Mahapatra, Debanjan Das, Brejesh Lall
2023 conf
NCC
Vidya Bhasker Shukla, Vimal Bhatia
2022 J jnl
IEEE Wirel. Commun.
Abdelaali Chaoub, Marco Giordani, Brejesh Lall, Vimal Bhatia, Adrian Kliks, Luciano Leonel Mendes, Khaled M. Rabie, Harri Saarnisaari, Amit Singhal, Nan Zhang, Sudhir Dixit, Michele Zorzi
2022 book
Sudhir Dixit, Vimal Bhatia, Sanjram Premjit Khanganba, Anuj Agrawal
2022 J jnl
IEEE Trans. Veh. Technol.
Arijit Datta, Aneesh Nema, Vimal Bhatia
2022 J jnl
Comput. Electron. Agric.
Puneet Singh Thakur, Bhavya Tiwari, Abhishek Kumar, Bhavesh Gedam, Vimal Bhatia, Ondrej Krejcar, Michal Dobrovolny, Jamel Nebhen, Shashi Prakash
2022 conf
FNWF
Sudhir S. Dixit, Ashutosh Dutta, Sandeep Agrawal, Marvin Arias Olivas, Vimal Bhatia, Carlos Daniel Altamirano Carrillo, Pranav Jha, Jabhera Matogoro, Amit Karna, Sanjram Premjit Khanganba, Catherine Kimambo, Román A. Lara-Cueva, Fisseha Mekuria, Apurva N. Mody, Nelson Wasilwa, Brad Kloza, Matt Borst
2022 conf
SPCOM
M. Hemanta Kumar, Sanjeev Sharma, Kuntal Deka, Vimal Bhatia
2022 J jnl
IEEE Trans. Commun.
Krishnendu S. Tharakan, B. N. Bharath, Navneet Garg, Vimal Bhatia, Tharmalingam Ratnarajah
2022 conf
SPCOM
Vidya Bhasker Shukla, Rangeet Mitra, Vimal Bhatia
2022 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Guddu Kumar, Sumanta Kumar Nanda, Alok Kumar Verma, Vimal Bhatia, Abhinoy Kumar Singh
2022 conf
ANTS
Deepak Kumar, Praveen Kumar Singya, Vimal Bhatia
2022 conf
NCC
Abhinav Singh Parihar, Pragya Swami, Vimal Bhatia
2022 J jnl
IEEE Trans. Veh. Technol.
Abhinav Singh Parihar, Pragya Swami, Vimal Bhatia
2022 J jnl
JOCN
Kamal K. Garg, Parvez Shaik, Vimal Bhatia, Ondrej Krejcar
2022 J jnl
CoRR
S. Krishnendu, B. N. Bharath, Vimal Bhatia
2022 J jnl
Trans. Emerg. Telecommun. Technol.
Justin Jose, Anirudh Agarwal, Vimal Bhatia, Ondrej Krejcar
2022 conf
ANTS
Vaishali Sharma, Sanjeev Sharma, Vimal Bhatia
2022 J jnl
IEEE Trans. Veh. Technol.
Pragya Swami, Mukesh Kumar Mishra, Vimal Bhatia, Tharmalingam Ratnarajah, Aditya Trivedi
2022 conf
ANTS
Amit Singh, M. Hemanta Kumar, Sanjeev Sharma, Vimal Bhatia
2022 conf
ANTS
Anupma Sharma, Vimal Bhatia
2022 conf
ANTS
Anupma Sharma, Vidya Bhaskar Shukla, Vimal Bhatia
2021 J jnl
IEEE Open J. Commun. Soc.
Praveen Kumar Singya, Parvez Shaik, Nagendra Kumar, Vimal Bhatia, Mohamed-Slim Alouini
2021 J jnl
IEEE Trans. Veh. Technol.
Deepak Kumar, Praveen Kumar Singya, Vimal Bhatia
2021 conf
ANTS
Vidya Bhasker Shukla, Rangeet Mitra, Vimal Bhatia
2021 J jnl
IEEE Access
Puneet Singh, Amit Chatterjee, Laxman Singh Rajput, Sanjeev Kumar, Vennampally Nataraj, Vimal Bhatia, Shashi Prakash
2021 J jnl
IEEE Commun. Lett.
Rangeet Mitra, Sanjeev Sharma, Georges Kaddoum, Vimal Bhatia
2021 J jnl
Sensors
Elie Sfeir, Rangeet Mitra, Georges Kaddoum, Vimal Bhatia
2021 conf
ANTS
Vaishali Sharma, Sanjeev Sharma, Vimal Bhatia
2021 J jnl
IEEE Trans. Commun.
Navneet Garg, Mathini Sellathurai, Vimal Bhatia, Tharmalingam Ratnarajah
2021 conf
ANTS
Anuj Agrawal, Vimal Bhatia
2021 J jnl
Int. J. Commun. Syst.
Arijit Datta, Vimal Bhatia, Manish Mandloi, Ganapati Panda
2021 J jnl
IEEE Trans. Commun.
Rangeet Mitra, Georges Kaddoum, Vimal Bhatia
2021 conf
CCNC
Pragya Swami, Vimal Bhatia
2021 conf
VTC Spring
Deepak Kumar, Praveen Kumar Singya, Vimal Bhatia
2021 J jnl
Nano Commun. Networks
Mahendra Singh Thakur, Sanjeev Sharma, Vimal Bhatia
2021 conf
VTC Spring
Krishnendu S. Tharakan, B. N. Bharath, Vimal Bhatia
2021 J jnl
IEEE Access
Sumanta Kumar Nanda, Guddu Kumar, Vimal Bhatia, Abhinoy Kumar Singh
2021 J jnl
IEEE Access
Uday Kumar Singh, Rangeet Mitra, Vimal Bhatia, Amit Kumar Mishra
2021 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Sandesh Jain, Rangeet Mitra, Vimal Bhatia
2021 conf
VTC Spring
Yash Doshi, B. N. Bharath, Navneet Garg, Vimal Bhatia, Tharmalingam Ratnarajah
2021 J jnl
IEEE Commun. Lett.
Arijit Datta, Manish Mandloi, Vimal Bhatia
2021 J jnl
IEEE Wirel. Commun. Lett.
Mahendra Singh Thakur, Sanjeev Sharma, Vimal Bhatia
2021 conf
VTC Spring
Caslav Stefanovic, Stefan R. Panic, Vimal Bhatia, Nagendra Kumar, Sanjeev Sharma
2021 J jnl
IEEE Trans. Veh. Technol.
Shubham Bisen, Parvez Shaik, Vimal Bhatia
2021 J jnl
IEEE Open J. Commun. Soc.
Caslav Stefanovic, Stefan Panic, Vimal Bhatia, Nagendra Kumar
2021 J jnl
IEEE Commun. Lett.
Dharmendra Dixit, Nagendra Kumar, Sanjeev Sharma, Vimal Bhatia, Stefan Panic, Caslav Stefanovic
2021 B conf
WCNC
Parvez Shaik, Praveen Kumar Singya, Kamal K. Garg, Vimal Bhatia
2021 B conf
WCNC
Deepak Kumar, Praveen Kumar Singya, Vimal Bhatia
2021 J jnl
IEEE Commun. Lett.
Elie Sfeir, Rangeet Mitra, Georges Kaddoum, Vimal Bhatia
2021 J jnl
IEEE Trans. Veh. Technol.
Vimal Bhatia, Sandesh Jain, Kamal K. Garg, Rangeet Mitra
2021 J jnl
IEEE Commun. Lett.
Rangeet Mitra, Vimal Bhatia, Sandesh Jain, Kwonhue Choi
2021 J jnl
IEEE Trans. Veh. Technol.
Abhinav Singh Parihar, Pragya Swami, Vimal Bhatia, Zhiguo Ding
2021 conf
VTC Spring
Justin Jose, Parvez Shaik, Vimal Bhatia
2021 J jnl
IEEE Open J. Commun. Soc.
Kamal K. Garg, Parvez Shaik, Praveen Kumar Singya, Vimal Bhatia
2021 J jnl
IEEE Open J. Commun. Soc.
Purva Sharma, Anuj Agrawal, Vimal Bhatia, Shashi Prakash, Amit Kumar Mishra
2021 conf
ANTS
Purva Sharma, Vimal Bhatia, Shashi Prakash
2021 J jnl
CoRR
Purva Sharma, Vimal Bhatia, Shashi Prakash
2021 conf
ANTS
Sanjeev Sharma, Rangeet Mitra, Vimal Bhatia
2021 J jnl
CoRR
Amit Chatterjee, Jitendra Dhanotiya, Vimal Bhatia, Shashi Prakash
2021 J jnl
IEEE Syst. J.
Pragya Swami, Vimal Bhatia, Satyanarayana Vuppala, Tharmalingam Ratnarajah
2021 J jnl
IEEE Commun. Lett.
Justin Jose, Parvez Shaik, Vimal Bhatia
2021 J jnl
Frontiers Commun. Networks
Harri Saarnisaari, Abdelaali Chaoub, Marjo Heikkilä, Amit Singhal, Vimal Bhatia
2020 J jnl
CoRR
Samad Ali, Walid Saad, Nandana Rajatheva, Kapseok Chang, Daniel Steinbach, Benjamin Sliwa, Christian Wietfeld, Kai Mei, Hamid Shiri, Hans-Jürgen Zepernick, Thi My Chinh Chu, Ijaz Ahmad, Jyrki Huusko, Jaakko Suutala, Shubhangi Bhadauria, Vimal Bhatia, Rangeet Mitra, SaiDhiraj Amuru, Robert Abbas, Baohua Shao, Michele Capobianco, Guanghui Yu, Maëlick Claes, Teemu Karvonen, Mingzhe Chen, Maksym A. Girnyk, Hassan Malik
2020 J jnl
CoRR
Abdelaali Chaoub, Marco Giordani, Brejesh Lall, Vimal Bhatia, Adrian Kliks, Luciano Leonel Mendes, Khaled M. Rabie, Harri Saarnisaari, Amit Singhal, Nan Zhang, Sudhir Dixit
2020 J jnl
CoRR
Harri Saarnisaari, Sudhir Dixit, Mohamed-Slim Alouini, Abdelaali Chaoub, Marco Giordani, Adrian Kliks, Marja Matinmikko-Blue, Nan Zhang, Anuj Agrawal, Mats Andersson, Vimal Bhatia, Wei Cao, Yunfei Chen, Wei Feng, Marjo Heikkilä, Josep Miquel Jornet, Luciano Leonel Mendes, Heikki Karvonen, Brejesh Lall, Matti Latva-aho, Xiangling Li, Kalle Lähetkangas, Moshe T. Masonta, Alok Pandey, Pekka Pirinen, Khaled M. Rabie, Tlou M. Ramoroka, Hanna Saarela, Amit Singhal, Kaibo Tian, Justin Wang, Chenchen Zhang, Yang Zhen, Haibo Zhou
2020 J jnl
Comput. Electron. Agric.
Puneet Singh, Amit Chatterjee, Vimal Bhatia, Shashi Prakash
2020 conf
EUSIPCO
Arijit Datta, Manekar Tushar Deo, Vimal Bhatia
2020 C conf
TENCON
Vaishali Sharma, Sanjeev Sharma, Vimal Bhatia
2020 J jnl
IEEE Commun. Lett.
Sandesh Jain, Rangeet Mitra, Vimal Bhatia
2020 J jnl
IEEE Trans. Mol. Biol. Multi Scale Commun.
Mahendra Singh Thakur, Sanjeev Sharma, Vimal Bhatia
2020 J jnl
IEEE Trans. Veh. Technol.
Sandesh Jain, Rangeet Mitra, Vimal Bhatia
2020 J jnl
CoRR
S. Krishnendu, B. N. Bharath, Navneet Garg, Vimal Bhatia, Tharmalingam Ratnarajah
2020 J jnl
IEEE Commun. Lett.
Rangeet Mitra, Sandesh Jain, Vimal Bhatia
2020 J jnl
IEEE Trans. Veh. Technol.
Rangeet Mitra, Farshad Miramirkhani, Vimal Bhatia, Murat Uysal
2020 J jnl
IEEE Commun. Lett.
Anuj Agrawal, Vimal Bhatia, Shashi Prakash
2020 conf
IEEE ANTS
Amit Kumar Meena, Neminath Hubballi, Yogendra Singh, Vimal Bhatia, Katrin Franke
2020 J jnl
IEEE Access
Parvez Shaik, Praveen Kumar Singya, Vimal Bhatia
2020 C conf
TENCON
Shubham Bisen, Parvez Shaik, Vimal Bhatia
2020 J jnl
IET Commun.
Nagendra Kumar, Praveen Kumar Singya, Vimal Bhatia
2020 conf
SPCOM
Parvez Shaik, Praveen Kumar Singya, Nagendra Kumar, Kamal K. Garg, Vimal Bhatia
2020 conf
NCC
Parvez Shaik, Deepak Kumar, Vimal Bhatia
2020 J jnl
IEEE Trans. Veh. Technol.
Praveen Kumar Singya, Nagendra Kumar, Vimal Bhatia, Mohamed-Slim Alouini
2020 J jnl
IEEE Trans. Commun.
Navneet Garg, Mathini Sellathurai, Vimal Bhatia, B. N. Bharath, Tharmalingam Ratnarajah
2020 C conf
TENCON
Pimmy Gandotra, Vimal Bhatia, Brejesh Lall
2020 conf
NCC
Kamal K. Garg, Vimal Bhatia
2020 J jnl
IEEE Trans. Veh. Technol.
Pragya Swami, Mukesh Kumar Mishra, Vimal Bhatia, Tharmalingam Ratnarajah
2020 C conf
TENCON
Anupma Sharma, Sandesh Jain, Rangeet Mitra, Vimal Bhatia
2020 conf
ICCSPA
Anupma Sharma, Sandesh Jain, Rangeet Mitra, Vimal Bhatia
2020 conf
IEEE ANTS
Purva Sharma, Vimal Bhatia, Shashi Prakash
2020 J jnl
IEEE Commun. Lett.
Elie Sfeir, Rangeet Mitra, Georges Kaddoum, Vimal Bhatia
2020 conf
EuCNC
Varun Chhangani, Rangeet Mitra, Vimal Bhatia
2020 conf
ICCSPA
Pavan Kumar Anand, Sandesh Jain, Rangeet Mitra, Vimal Bhatia
2020 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Uday Kumar Singh, Rangeet Mitra, Vimal Bhatia, Amit Kumar Mishra
2020 conf
OFC
Anuj Agrawal, Vimal Bhatia, Shashi Prakash
2020 conf
IEEE ANTS
Pimmy Gandotra, Vimal Bhatia, Brejesh Lall
2019 J jnl
Swarm Evol. Comput.
Arijit Datta, Vimal Bhatia
2019 conf
ANTS
Parvez Shaik, Praveen Kumar Singya, Vimal Bhatia, Nagendra Kumar
2019 conf
NCC
Kamal K. Garg, Praveen Kumar Singya, Vimal Bhatia
2019 J jnl
IEEE Consumer Electron. Mag.
Arijit Datta, Vimal Bhatia, Josef Noll, Sudhir Dixit
2019 J jnl
IEEE Wirel. Commun. Lett.
Krishnendu S. Tharakan, B. N. Bharath, Vimal Bhatia
2019 J jnl
IEEE Trans. Veh. Technol.
Sanjeev Sharma, Anubha Gupta, Vimal Bhatia
2019 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Abhijeet Bishnu, Vimal Bhatia
2019 conf
ONDM
Anuj Agrawal, Vimal Bhatia, Shashi Prakash
2019 conf
ONDM
Sandesh Jain, Anuj Agrawal, Vimal Bhatia, Shashi Prakash
2019 conf
ISWCS
Sanjeev Sharma, Vimal Bhatia, Anubha Gupta, Kuntal Deka
2019 conf
ANTS
Parvez Shaik, Praveen Kumar Singya, Vimal Bhatia
2019 B conf
PIMRC
Arijit Datta, Manish Mandloi, Vimal Bhatia
2019 conf
ANTS
Sanjeev Sharma, Kuntal Deka, Vimal Bhatia
2019 J jnl
IEEE Commun. Lett.
Sanjeev Sharma, Kuntal Deka, Vimal Bhatia, Anubha Gupta
2019 J jnl
IEEE Syst. J.
Sanjeev Sharma, Vimal Bhatia, Anubha Gupta
2019 J jnl
IEEE Trans. Aerosp. Electron. Syst.
Uday Kumar Singh, Rangeet Mitra, Vimal Bhatia, Amit Kumar Mishra
2019 conf
ANTS
Sandesh Jain, Anuj Agrawal, Rangeet Mitra, Vimal Bhatia, Shashi Prakash
2019 J jnl
IEEE Trans. Veh. Technol.
Rangeet Mitra, Vimal Bhatia
2019 J jnl
IEEE Trans. Veh. Technol.
Rangeet Mitra, Farshad Miramirkhani, Vimal Bhatia, Murat Uysal
2019 B conf
PIMRC
Sandesh Jain, Rangeet Mitra, Vimal Bhatia
2019 J jnl
CoRR
Rangeet Mitra, Paschalis C. Sofotasios, Vimal Bhatia, Sami Muhaidat
2019 B conf
PIMRC
Mahendra Singh Thakur, Sandesh Jain, Sanjeev Sharma, Vimal Bhatia
2019 J jnl
IEEE Commun. Lett.
Parvez Shaik, Praveen Kumar Singya, Vimal Bhatia
2019 J jnl
IEEE Access
Praveen Kumar Singya, Nagendra Kumar, Vimal Bhatia, Mohamed-Slim Alouini
2019 J jnl
IEEE Syst. J.
Pragya Swami, Vimal Bhatia, Satyanarayana Vuppala, Tharmalingam Ratnarajah
2019 J jnl
CoRR
Navneet Garg, Vimal Bhatia, B. N. Bharath, Mathini Sellathurai, Tharmalingam Ratnarajah
2019 Misc conf
ACSSC
Navneet Garg, Mathini Sellathurai, Bharath Bettagere, Vimal Bhatia, Tharmalingam Ratnarajah
2019 conf
ISWCS
Pragya Swami, Mukesh Kumar Mishra, Vimal Bhatia, Tharmalingam Ratnarajah
2019 J jnl
JOCN
Kamal K. Garg, Praveen Kumar Singya, Vimal Bhatia
2019 J jnl
Int. J. Commun. Syst.
Arijit Datta, Manish Mandloi, Vimal Bhatia
2019 J jnl
IEEE Wirel. Commun. Lett.
Sanjeev Sharma, Vimal Bhatia, Kuntal Deka, Anubha Gupta
2019 conf
ANTS
Navneet Garg, Mathini Sellathurai, Faheem Ahmad Khan, Tharmalingam Ratnarajah, Vimal Bhatia
2019 conf
ONDM
Anuj Agrawal, Vimal Bhatia, Shashi Prakash
2019 conf
ANTS
Uday Kumar Singh, Rangeet Mitra, Vimal Bhatia, Amit Kumar Mishra
2019 conf
ANTS
Mahendra Singh Thakur, Sandesh Jain, Vimal Bhatia
2019 conf
ANTS
Mahendra Singh Thakur, Sanjeev Sharma, Vimal Bhatia
2019 J jnl
IEEE Consumer Electron. Mag.
Sanjeev Sharma, Vimal Bhatia, Amit Kumar Mishra
2018 J jnl
IEEE Trans. Veh. Technol.
Pragya Swami, Vimal Bhatia, Satyanarayana Vuppala, Tharmalingam Ratnarajah
2018 J jnl
IEEE Trans. Veh. Technol.
Nagendra Kumar, Praveen Kumar Singya, Vimal Bhatia
2018 J jnl
IEEE Commun. Lett.
Sandesh Jain, Rangeet Mitra, Vimal Bhatia
2018 conf
ANTS
Abhijeet Bishnu, Vimal Bhatia
2018 J jnl
Telecommun. Syst.
Abhijeet Bishnu, Vimal Bhatia
2018 conf
ICC
Sanjeev Sharma, Vimal Bhatia, Anubha Gupta
2018 conf
ANTS
Abhijeet Bishnu, Suman Kumar Das, Megha Soni, Vimal Bhatia
2018 conf
ANTS
Praharsh Deep Singh, Dharmendra Singh Yadav, Vimal Bhatia
2018 J jnl
CoRR
Parvez Shaik, Praveen Kumar Singya, Vimal Bhatia
2018 J jnl
IEEE Trans. Cogn. Commun. Netw.
Abhijeet Bishnu, Vimal Bhatia
2018 conf
ANTS
Arijit Datta, Manish Mandloi, Vimal Bhatia
2018 J jnl
IEEE Commun. Lett.
Praveen Kumar Singya, Nagendra Kumar, Vimal Bhatia
2018 conf
SPCOM
Sanjeev Sharma, Abhijeet Bishnu, Anubha Gupta, Vimal Bhatia
2018 J jnl
IEEE Commun. Lett.
Sanjeev Sharma, Anubha Gupta, Vimal Bhatia
2018 conf
GLOBECOM Workshops
Pragya Swami, Vimal Bhatia, Satyanarayana Vuppala, Tharmalingam Ratnarajah
2018 conf
ANTS
Sandesh Jain, Rangeet Mitra, Vimal Bhatia
2018 J jnl
Comput. Electr. Eng.
Rangeet Mitra, Vimal Bhatia
2018 J jnl
IEEE Trans. Veh. Technol.
Abhijeet Bishnu, Vimal Bhatia
2018 conf
ANTS
Uday Kumar Singh, Rangeet Mitra, Vimal Bhatia, Amit Kumar Mishra
2018 J jnl
Wirel. Pers. Commun.
Manish Mandloi, Vimal Bhatia
2018 conf
ANTS
Mahendra Singh Thakur, Sanjeev Sharma, Vimal Bhatia
2018 conf
ANTS
Kamal K. Garg, Praveen Kumar Singya, Vimal Bhatia
2018 conf
VTC Spring
Mahendra Singh Thakur, Vimal Bhatia
2018 conf
ANTS
Pragya Swami, Vimal Bhatia, Satyanarayana Vuppala, Tharmalingam Ratnarajah
2018 B conf
GLOBECOM
Praveen Kumar Singya, Nagendra Kumar, Vimal Bhatia
2018 J jnl
Wirel. Pers. Commun.
Nagendra Kumar, Vimal Bhatia
2018 J jnl
Int. J. Commun. Syst.
Praveen Kumar Singya, Nagendra Kumar, Vimal Bhatia
2018 conf
VTC Spring
Rangeet Mitra, Vimal Bhatia
2018 J jnl
IEEE Internet Things J.
Abhijeet Bishnu, Vimal Bhatia
2018 conf
GLOBECOM Workshops
Sanjeev Sharma, Kuntal Deka, Vimal Bhatia, Anubha Gupta
2017 conf
NCC
Sanjeev Sharma, Vimal Bhatia, Anubha Gupta
2017 conf
VTC Spring
Sanjeev Sharma, Anubha Gupta, Vimal Bhatia
2017 B conf
GLOBECOM
Abhijeet Bishnu, Vimal Bhatia
2017 conf
VTC Spring
Nagendra Kumar, Praveen Kumar Singya, Vimal Bhatia
2017 J jnl
Telecommun. Syst.
Manish Mandloi, Mohammed Azahar Hussain, Vimal Bhatia
2017 J jnl
IEEE Wirel. Commun. Lett.
Manish Mandloi, Vimal Bhatia
2017 J jnl
Signal Image Video Process.
Rangeet Mitra, Vimal Bhatia
2017 J jnl
IET Commun.
Manish Mandloi, Mohammed Azahar Hussain, Vimal Bhatia
2017 J jnl
IEEE Wirel. Commun. Lett.
Abhijeet Bishnu, Vimal Bhatia
2017 B conf
GLOBECOM
Sanjeev Sharma, Anubha Gupta, Vimal Bhatia
2017 B conf
WCNC
Manish Mandloi, Vimal Bhatia
2017 J jnl
IEEE Commun. Lett.
Rangeet Mitra, Vimal Bhatia
2017 J jnl
IEEE Commun. Lett.
Manish Mandloi, Vimal Bhatia
2017 conf
GLOBECOM Workshops
Pragya Swami, Vimal Bhatia, Satyanarayana Vuppala, Tharmalingam Ratnarajah
2017 conf
VTC Spring
Praveen Kumar Singya, Nagendra Kumar, Vimal Bhatia, Faheem Ahmad Khan
2017 J jnl
IEEE Wirel. Commun. Lett.
Nagendra Kumar, Sanjeev Sharma, Vimal Bhatia
2017 J jnl
Int. J. Commun. Syst.
Nagendra Kumar, Vimal Bhatia
2017 J jnl
IET Commun.
Nagendra Kumar, Praveen Kumar Singya, Vimal Bhatia
2017 J jnl
CoRR
Rangeet Mitra, Vimal Bhatia
2017 J jnl
IEEE Trans. Commun.
Rangeet Mitra, Vimal Bhatia
2017 conf
ANTS
Arijit Datta, Vimal Bhatia
2017 J jnl
IEEE Access
Abhijeet Bishnu, Vimal Bhatia
2017 J jnl
CoRR
Sanjeev Sharma, Anubha Gupta, Vimal Bhatia
2017 J jnl
Comput. Electr. Eng.
Sanjeev Sharma, Vimal Bhatia, Anubha Gupta
2017 J jnl
CoRR
Anuj Agrawal, Purva Sharma, Vimal Bhatia, Shashi Prakash
2017 conf
ANTS
Anuj Agrawal, Purva Sharma, Vimal Bhatia, Shashi Prakash
2017 J jnl
Int. J. Commun. Syst.
Sanjeev Sharma, Vimal Bhatia
2017 conf
VTC Spring
Pragya Swami, Vimal Bhatia, Satyanarayana Vuppala, Tharmalingam Ratnarajah
2016 J jnl
IEEE Access
Sanjeev Kumar Sharma, Anubha Gupta, Vimal Bhatia
2016 J jnl
Expert Syst. Appl.
Manish Mandloi, Vimal Bhatia
2016 Misc conf
COMSNETS
Manish Mandloi, Mohammed Azahar Hussain, Vimal Bhatia
2016 J jnl
IEEE Wirel. Commun. Lett.
Nagendra Kumar, Vimal Bhatia
2016 conf
SPCOM
Abhijeet Bishnu, Vimal Bhatia
2016 conf
ANTS
Manish Mandloi, Mohammed Azahar Hussain, Vimal Bhatia
2016 J jnl
Wirel. Pers. Commun.
Nagendra Kumar, Vimal Bhatia
2016 B conf
WCNC
Nagendra Kumar, Vimal Bhatia
2016 conf
ANTS
Praveen Kumar Singya, Nagendra Kumar, Vimal Bhatia
2016 conf
ANTS
Sanjeev Sharma, Vimal Bhatia
2016 conf
SPAWC
Sanjeev Kumar Sharma, Vimal Bhatia, Anubha Gupta
2015 conf
EUSIPCO
Rangeet Mitra, Vimal Bhatia
2015 J jnl
Expert Syst. Appl.
Manish Mandloi, Vimal Bhatia
2015 J jnl
CoRR
Rangeet Mitra, Vimal Bhatia
2015 J jnl
CoRR
Rangeet Mitra, Vimal Bhatia
2015 J jnl
CoRR
Manish Mandloi, Mohammed Azahar Hussain, Vimal Bhatia
2015 conf
EUSIPCO
Manish Mandloi, Vimal Bhatia
2015 conf
CSCN
Abhijeet Bishnu, Vimal Bhatia
2015 J jnl
Wirel. Pers. Commun.
Nagendra Kumar, Vimal Bhatia
2014 conf
ICIT
Rangeet Mitra, Vimal Bhatia
2014 conf
IEEE ANTS
Manish Mandloi, Vimal Bhatia
2014 conf
ICIT
Rangeet Mitra, Vimal Bhatia
2007 J jnl
Signal Process.
Vimal Bhatia, Bernard Mulgrew
2007 J jnl
IET Commun.
Vimal Bhatia, Bernard Mulgrew, David D. Falconer
2006 J jnl
Signal Process.
Vimal Bhatia, Bernard Mulgrew, Apostolos T. Georgiadis
2005 conf
EUSIPCO
Yu Gong, Vimal Bhatia, Bernard Mulgrew, Colin F. N. Cowan
2005 conf
EUSIPCO
Vimal Bhatia, Bernard Mulgrew, David D. Falconer
2004 conf
EUSIPCO
Vimal Bhatia, Bernard Mulgrew, Apostolos T. Georgiadis
s3-storage/s3_uploader.py
← Index s3-storage/s3_uploader.py python
# python s3_uploader.py /path/to/files repository_name --notes "Optional notes"
import hashlib
import multiprocessing
from multiprocessing import Pool
import sys
import logging
from logging.handlers import QueueHandler
from datetime import datetime
import os
import time
import json
from enum import Enum
import tempfile
import magic
from typing import Optional, Dict, Any
from dotenv import load_dotenv
from datetime import timezone

# File handling
import py7zr
import pyzipper
from magika import Magika

# S3 and database
from minio import Minio
import clickhouse_connect

load_dotenv(override=True)

class UploadResult(Enum):
    CORRECTLY = 0
    FAILED = 1
    SKIPPED = 2  # For duplicates

class FileNameFormatter(logging.Formatter):
    def format(self, record):
        record.filenameinfo = getattr(record, "filenameinfo", "unknown")
        return super().format(record)

def setup_logger(log_file, filename):
    """Set up a logger for a specific file"""
    logger = logging.getLogger(filename)
    if not logger.handlers:
        if os.getenv("SERVER_ENV") == "prod":
            logger.setLevel(logging.INFO)
        else:
            logger.setLevel(logging.DEBUG)
            
        # Create file handler
        handler = logging.FileHandler(log_file)
        formatter = FileNameFormatter(
            "%(asctime)s - %(filenameinfo)s - %(levelname)s - %(message)s"
        )
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        logger.propagate = False
    return logger

def logger_thread(log_queue, log_file):
    handler = logging.FileHandler(log_file)
    formatter = FileNameFormatter(
        "%(asctime)s - %(filenameinfo)s - %(levelname)s - %(message)s"
    )
    handler.setFormatter(formatter)

    while True:
        try:
            record = log_queue.get()
            if record is None:
                break
            message = formatter.format(record)
            handler.stream.write(message + "\n")
            handler.stream.flush()
        except Exception:
            import traceback
            print("[ERR] Error in logger thread:", file=sys.stderr)
            traceback.print_exc(file=sys.stderr)

def get_s3_key(sha256: str, is_archived: bool, original_ext: str = None) -> str:
    """
    Generate S3 key using sharding pattern with appropriate extension
    
    Args:
        sha256: The file's SHA256 hash
        is_archived: Whether the file was already archived (zip/7z)
        original_ext: The original file extension (if any)
    """
    # If file was already archived, keep its extension
    if is_archived and original_ext and original_ext.lower() in ['.zip', '.7z']:
        extension = original_ext
    else:
        # For files we archived ourselves, use .zip
        extension = '.zip'
        
    return f"{sha256[:2]}/{sha256[2:4]}/{sha256}{extension}"

def process_single_file(args):
    """Independent worker function for processing a single file"""
    filepath, file_number, total_files, config, log_file = args
    filename = os.path.basename(filepath)
    base_logger = setup_logger(log_file, filename)
    extra = {"filenameinfo": filename}
    logger = logging.LoggerAdapter(base_logger, extra)
    s3_client = None
    ch_client = None

    try:
        logger.info(f"Processing file {file_number}/{total_files}: {filepath}")

        # Create connections for this process
        s3_client = Minio(
            config["s3_endpoint"],
            access_key=config["s3_access_key"],
            secret_key=config["s3_secret_key"],
            secure=True
        )
        
        ch_client = clickhouse_connect.get_client(
            host=config['clickhouse_host'],
            port=config['clickhouse_port'],
            username=config['clickhouse_user'],
            password=config['clickhouse_password'],
            database=config['clickhouse_database'],
            verify=config['clickhouse_verify']
        )

        # Process the file and get contents
        ext = os.path.splitext(filepath.lower())[1]
        is_archived = ext in ['.zip', '.7z']

        with tempfile.TemporaryDirectory() as temp_dir:
            try:
                if filename.startswith("."):
                    logger.debug(f"Skipping hidden file: {filename}")
                    return UploadResult.SKIPPED

                elif ext == ".zip":
                    logger.debug(f"Processing ZIP file: {filepath}")
                    with pyzipper.AESZipFile(filepath) as zf:
                        zf.pwd = b"infected"
                        filename = zf.namelist()[0]
                        zf.extractall(temp_dir)
                        extracted_path = os.path.join(temp_dir, filename)
                        
                        with open(extracted_path, "rb") as f:
                            file_content = f.read()
                        with open(filepath, "rb") as f:
                            archive_content = f.read()
                            
                elif ext == ".7z":
                    logger.debug(f"Processing 7z file: {filepath}")
                    with py7zr.SevenZipFile(filepath, mode="r", password="infected") as z:
                        z.extractall(path=temp_dir)
                        # Get first file in the archive
                        for root, _, files in os.walk(temp_dir):
                            if files:
                                filename = files[0]
                                extracted_path = os.path.join(root, filename)
                                break
                                
                        with open(extracted_path, "rb") as f:
                            file_content = f.read()
                        with open(filepath, "rb") as f:
                            archive_content = f.read()
                else:
                    logger.debug(f"Processing non-archived file: {filepath}")
                    # For non-archived files, create password protected zip
                    with open(filepath, "rb") as f:
                        file_content = f.read()
                    filename = os.path.basename(filepath)
                    
                    # Create password protected zip
                    with tempfile.NamedTemporaryFile(delete=False) as temp_zip:
                        with pyzipper.AESZipFile(
                            temp_zip.name,
                            'w',
                            compression=pyzipper.ZIP_LZMA,
                            encryption=pyzipper.WZ_AES
                        ) as zf:
                            zf.pwd = b'infected'
                            zf.writestr(filename, file_content)
                        
                        with open(temp_zip.name, 'rb') as f:
                            archive_content = f.read()
                    
                    os.unlink(temp_zip.name)

                # Calculate hash
                sha256 = hashlib.sha256(file_content).hexdigest()
                # s3_key = f"{sha256[:2]}/{sha256[2:4]}/{sha256}"
                s3_key = get_s3_key(sha256, is_archived, ext if is_archived else None)
                logger.debug(f"Calculated SHA256: {sha256}")

                # Check if exists in S3
                try:
                    s3_client.stat_object(config["s3_bucket"], s3_key)
                    exists = True
                    logger.debug(f"File exists in S3: {s3_key}")
                except:
                    exists = False
                    logger.debug(f"File does not exist in S3: {s3_key}")

                # Prepare metadata
                max_timestamp = int(datetime(9999, 12, 31, 23, 59, 59, tzinfo=timezone.utc).timestamp() * 1000)
                now = datetime.now(timezone.utc)
                now_timestamp = int(now.timestamp() * 1000)
                inverted_timestamp = datetime.fromtimestamp((max_timestamp - now_timestamp)/1000, tz=timezone.utc)


                data = [[
                    sha256,                     # String
                    filename,                   # String
                    config['repository'],       # String
                    len(file_content),         # UInt64
                    magic.from_buffer(file_content),        # String
                    magic.from_buffer(file_content, mime=True),  # String
                    Magika().identify_bytes(file_content).output.ct_label,  # String
                    now,                       # upload_date
                    now,                       # first_seen
                    inverted_timestamp,        # version_date for replacing
                    config['s3_bucket'],       # String
                    s3_key,                    # String
                    config['notes'] if config['notes'] else None  # Nullable(String)
                ]]

                column_names = [
                    'sha256', 'filename', 'repository', 'file_size',
                    'filetype', 'filetype_mime', 'filetype_magika',
                    'upload_date', 'first_seen', 'version_date', 's3_bucket', 's3_key', 'notes'
                ]

                column_type_names = [
                    'String', 'String', 'LowCardinality(String)', 'UInt64',
                    'String', 'String', 'String',
                    'DateTime64(3, \'UTC\')', 'DateTime64(3, \'UTC\')', 
                    'DateTime64(3, \'UTC\')', 'String', 'String', 'Nullable(String)'
                ]
                
                if exists:
                    # Just update database
                    try:
                        ch_client.insert(
                            'samples_catalog',
                            data,
                            column_names=column_names,
                            column_type_names=column_type_names,
                            settings={'input_format_values_interpret_expressions': 0}
                        )
                        logger.info(f"Updated metadata for existing file: {sha256}")
                    except Exception as e:
                        logger.error(f"Error inserting metadata: {str(e)}")
                        import traceback
                        logger.error(f"Full traceback: {traceback.format_exc()}")
                    return UploadResult.SKIPPED
                else:
                    try:    
                        # Upload to S3 and insert metadata
                        import io
                        file_data = io.BytesIO(archive_content)
                        s3_client.put_object(
                            bucket_name=config['s3_bucket'],
                                object_name=s3_key,
                                data=file_data,
                                length=len(archive_content)
                            )
                        logger.info(f"Uploaded to S3: {s3_key}")
                    except Exception as e:
                        logger.error(f"Error uploading to S3: {str(e)}")
                        import traceback
                        logger.error(f"Full traceback: {traceback.format_exc()}")
                        return UploadResult.FAILED
                    
                    try:
                        ch_client.insert(
                            'samples_catalog',
                            data,
                            column_names=column_names,
                            column_type_names=column_type_names,
                            settings={'input_format_values_interpret_expressions': 0}
                        )
                        logger.info(f"Successfully processed file: {sha256}")
                        return UploadResult.CORRECTLY
                    except Exception as e:
                        logger.error(f"Error inserting metadata: {str(e)}")
                        import traceback
                        logger.error(f"Full traceback: {traceback.format_exc()}")
                        return UploadResult.FAILED

            except Exception as e:
                logger.error(f"Error processing file: {str(e)}")
                import traceback
                logger.error(f"Full traceback: {traceback.format_exc()}")
                return UploadResult.FAILED

    except Exception as e:
        logger.error(f"Error in worker: {str(e)}")
        return UploadResult.FAILED
    finally:
        # if s3_client:
        #     s3_client.close()
        if ch_client:
            ch_client.close()
        if base_logger and base_logger.handlers:
            for handler in base_logger.handlers:
                handler.close()
            base_logger.handlers.clear()

class S3Uploader:
    def __init__(self, path: str, repository: str, notes: Optional[str] = None):
        """
        Initialize S3 uploader
        
        Args:
            path: Path to file or directory to process
            repository: Repository name
            notes: Optional notes to add to all files
        """
        self.path = path
        self.repository = repository
        self.notes = notes
        
        # Initialize multiprocessing components
        self.manager = multiprocessing.Manager()
        # self.log_queue = self.manager.Queue()
        self.total_results = self.manager.dict({result: 0 for result in UploadResult})
        
        # Set up logging
        self.today = datetime.today().strftime("%Y%m%dT%H%M%S")
        # self.log_file = os.getenv("LOG_FILE_PATH", "./logs/") + f"{self.today}-{self.repository}-upload.txt"
        log_base_path = os.getenv("LOG_FILE_PATH")
        if not log_base_path:
            log_base_path = os.path.join(os.getcwd(), "logs")  # Default to ./logs directory
        self.log_file = os.path.join(log_base_path, f"{self.today}-{self.repository}-upload.txt")
        os.makedirs(os.path.dirname(self.log_file), exist_ok=True)

        # Initialize S3 client
        self.s3_client = Minio(
            os.getenv("S3_ENDPOINT"),
            access_key=os.getenv("S3_ACCESS_KEY"),
            secret_key=os.getenv("S3_SECRET_KEY"),
            secure=True  # Set to False if not using HTTPS
        )
        self.bucket_name = os.getenv("S3_BUCKET")

        # Initialize ClickHouse client
        self.ch_client = clickhouse_connect.get_client(
            host=os.getenv('CLICKHOUSE_HOST'),
            port=os.getenv('CLICKHOUSE_PORT'),
            username=os.getenv('CLICKHOUSE_USER'),
            password=os.getenv('CLICKHOUSE_PASSWORD'),
            database=os.getenv('CLICKHOUSE_DATABASE'),
            verify=os.getenv('CLICKHOUSE_ENFORCE_SSL', 'False')
        )
        
        # Ensure database table exists
        self._create_table()

    def _create_table(self):
        """Create the file catalog table if it doesn't exist"""
        create_table_query = """
            CREATE TABLE IF NOT EXISTS samples_catalog (
                sha256 String,
                filename String,
                repository LowCardinality(String),
                file_size UInt64,
                filetype String,
                filetype_mime String,
                filetype_magika String,
                upload_date DateTime64(3, 'UTC'),
                first_seen DateTime64(3, 'UTC'),
                version_date DateTime64(3, 'UTC'),  -- This will be inverted timestamp
                s3_bucket String,
                s3_key String,
                notes Nullable(String),
                PRIMARY KEY (sha256, repository)
            ) ENGINE = ReplacingMergeTree(version_date)
            ORDER BY (sha256, repository)
        """
        self.ch_client.command(create_table_query)

    # # def upload(self):
    # #     """Main upload function with multiprocessing support"""
    # #     start_time = time.time()

    # #     config = {
    # #         "s3_endpoint": os.getenv("S3_ENDPOINT"),
    # #         "s3_access_key": os.getenv("S3_ACCESS_KEY"),
    # #         "s3_secret_key": os.getenv("S3_SECRET_KEY"),
    # #         "s3_bucket": os.getenv("S3_BUCKET"),
    # #         "clickhouse_host": os.getenv("CLICKHOUSE_HOST"),
    # #         "clickhouse_port": os.getenv("CLICKHOUSE_PORT"),
    # #         "clickhouse_user": os.getenv("CLICKHOUSE_USER"),
    # #         "clickhouse_password": os.getenv("CLICKHOUSE_PASSWORD"),
    # #         "clickhouse_database": os.getenv("CLICKHOUSE_DATABASE"),
    # #         "clickhouse_verify": os.getenv("CLICKHOUSE_ENFORCE_SSL", "False"),
    # #         "repository": self.repository,
    # #         "notes": self.notes
    # #     }

    # #     try:
    # #         # Get list of files
    # #         if os.path.isfile(self.path):
    # #             files = [self.path] if not self.path.endswith('.txt') else [
    # #                 line.strip() for line in open(self.path) 
    # #                 if line.strip() and not os.path.basename(line.strip()).startswith('.')
    # #             ]
    # #         elif os.path.isdir(self.path):
    # #             files = [
    # #                 os.path.join(root, file)
    # #                 for root, _, files in os.walk(self.path)
    # #                 for file in files
    # #                 if not file.startswith('.')
    # #             ]
    # #         else:
    # #             print(f"[ERR] Invalid path: {self.path}")
    # #             return

    # #         total_files = len(files)
    # #         print(f"Found {total_files} files to process")

    # #         with Pool(processes=max(1, multiprocessing.cpu_count() - 1)) as pool:
    # #             results = pool.map(
    # #                 process_single_file,
    # #                 [(f, i + 1, total_files, config, self.log_file) for i, f in enumerate(files)]
    # #             )

    # #         # Update statistics
    # #         for result in results:
    # #             if result is not None:
    # #                 self.total_results[result] += 1

    # #         # Generate summary
    # #         end_time = time.time()
    # #         elapsed_time = end_time - start_time
    # #         elapsed_time_pretty = time.strftime("%H:%M:%S", time.gmtime(elapsed_time))

    # #         summary = (
    # #             f"\n\nUpload finished for {self.path}"
    # #             f"\nTime required: {elapsed_time_pretty}"
    # #             f"\nResults:"
    # #             f"\n- Total processed: {sum(self.total_results.values())}"
    # #             f"\n- Successfully uploaded: {self.total_results[UploadResult.CORRECTLY]}"
    # #             f"\n- Skipped (already exists): {self.total_results[UploadResult.SKIPPED]}"
    # #             f"\n- Failed: {self.total_results[UploadResult.FAILED]}\n"
    # #         )

    # #         with open(self.log_file, "a") as f:
    # #             f.write(summary)

    # #         print(summary)

    # #     except Exception as e:
    # #         print(f"[ERR] Error in upload process: {str(e)}")

    # def upload(self):
    #     """Main upload function with multiprocessing support"""
    #     start_time = time.time()
    #     BATCH_SIZE = 1000  # Process files in batches of 1000

    #     config = {
    #         "s3_endpoint": os.getenv("S3_ENDPOINT"),
    #         "s3_access_key": os.getenv("S3_ACCESS_KEY"),
    #         "s3_secret_key": os.getenv("S3_SECRET_KEY"),
    #         "s3_bucket": os.getenv("S3_BUCKET"),
    #         "clickhouse_host": os.getenv("CLICKHOUSE_HOST"),
    #         "clickhouse_port": os.getenv("CLICKHOUSE_PORT"),
    #         "clickhouse_user": os.getenv("CLICKHOUSE_USER"),
    #         "clickhouse_password": os.getenv("CLICKHOUSE_PASSWORD"),
    #         "clickhouse_database": os.getenv("CLICKHOUSE_DATABASE"),
    #         "clickhouse_verify": os.getenv("CLICKHOUSE_ENFORCE_SSL", "False"),
    #         "repository": self.repository,
    #         "notes": self.notes
    #     }

    #     try:
    #         # Get list of files
    #         if os.path.isfile(self.path):
    #             files = [self.path] if not self.path.endswith('.txt') else [
    #                 line.strip() for line in open(self.path) 
    #                 if line.strip() and not os.path.basename(line.strip()).startswith('.')
    #             ]
    #         elif os.path.isdir(self.path):
    #             files = [
    #                 os.path.join(root, file)
    #                 for root, _, files in os.walk(self.path)
    #                 for file in files
    #                 if not file.startswith('.')
    #             ]
    #         else:
    #             print(f"[ERR] Invalid path: {self.path}")
    #             return

    #         total_files = len(files)
    #         print(f"Found {total_files} files to process")

    #         # Process files in batches
    #         for i in range(0, total_files, BATCH_SIZE):
    #             batch_files = files[i:i + BATCH_SIZE]
    #             batch_start = i + 1
    #             batch_end = min(i + BATCH_SIZE, total_files)
    #             print(f"\nProcessing batch {batch_start}-{batch_end} of {total_files}")
                
    #             with Pool(processes=max(1, multiprocessing.cpu_count() - 1)) as pool:
    #                 batch_results = pool.map(
    #                     process_single_file,
    #                     [(f, j + 1, total_files, config, self.log_file) 
    #                         for j, f in enumerate(batch_files, start=i)]
    #                 )
                    
    #                 # Update statistics for this batch
    #                 for result in batch_results:
    #                     if result is not None:
    #                         self.total_results[result] += 1

    #                 # Print intermediate summary
    #                 print(f"Batch {batch_start}-{batch_end} completed:")
    #                 print(f"- Successfully uploaded: {sum(1 for r in batch_results if r == UploadResult.CORRECTLY)}")
    #                 print(f"- Skipped (exists): {sum(1 for r in batch_results if r == UploadResult.SKIPPED)}")
    #                 print(f"- Failed: {sum(1 for r in batch_results if r == UploadResult.FAILED)}")

    #         # Generate final summary
    #         end_time = time.time()
    #         elapsed_time = end_time - start_time
    #         elapsed_time_pretty = time.strftime("%H:%M:%S", time.gmtime(elapsed_time))

    #         summary = (
    #             f"\n\nUpload finished for {self.path}"
    #             f"\nTime required: {elapsed_time_pretty}"
    #             f"\nResults:"
    #             f"\n- Total processed: {sum(self.total_results.values())}"
    #             f"\n- Successfully uploaded: {self.total_results[UploadResult.CORRECTLY]}"
    #             f"\n- Skipped (already exists): {self.total_results[UploadResult.SKIPPED]}"
    #             f"\n- Failed: {self.total_results[UploadResult.FAILED]}\n"
    #         )

    #         with open(self.log_file, "a") as f:
    #             f.write(summary)

    #         print(summary)

    #     except Exception as e:
    #         print(f"[ERR] Error in upload process: {str(e)}")

    def upload(self):
        """Main upload function with multiprocessing support"""
        start_time = time.time()
        BATCH_SIZE = 1000  # Process files in batches of 1000

        config = {
            "s3_endpoint": os.getenv("S3_ENDPOINT"),
            "s3_access_key": os.getenv("S3_ACCESS_KEY"),
            "s3_secret_key": os.getenv("S3_SECRET_KEY"),
            "s3_bucket": os.getenv("S3_BUCKET"),
            "clickhouse_host": os.getenv("CLICKHOUSE_HOST"),
            "clickhouse_port": os.getenv("CLICKHOUSE_PORT"),
            "clickhouse_user": os.getenv("CLICKHOUSE_USER"),
            "clickhouse_password": os.getenv("CLICKHOUSE_PASSWORD"),
            "clickhouse_database": os.getenv("CLICKHOUSE_DATABASE"),
            "clickhouse_verify": os.getenv("CLICKHOUSE_ENFORCE_SSL", "False"),
            "repository": self.repository,
            "notes": self.notes
        }

        try:
            # Get all existing filenames for this repository
            query = f"SELECT filename FROM samples_catalog WHERE repository = '{self.repository}'"
            # existing_files = set()
            # for row in self.ch_client.query(query).result_rows:
            #     filename = os.path.splitext(row[0])[0]  # Strip extension
            #     existing_files.add(filename)
            existing_files = set(row[0] for row in self.ch_client.query(query).result_rows)
            print(f"Found {len(existing_files)} existing files in repository")

            # Get list of files to process
            if os.path.isfile(self.path):
                files = [self.path] if not self.path.endswith('.txt') else [
                    line.strip() for line in open(self.path) 
                    if line.strip() and not os.path.basename(line.strip()).startswith('.')
                ]
            elif os.path.isdir(self.path):
                files = [
                    os.path.join(root, file)
                    for root, _, files in os.walk(self.path)
                    for file in files
                    if not file.startswith('.')
                ]
            else:
                print(f"[ERR] Invalid path: {self.path}")
                return

            # Filter out files that are already in the repository
            files_to_process = []
            for f in files:
                basename = os.path.splitext(os.path.basename(f))[0]
                if basename not in existing_files:
                    files_to_process.append(f)

            total_files = len(files_to_process)
            skipped_files = len(files) - total_files
            print(f"Found {total_files} new files to process (skipped {skipped_files} existing files)")

            if total_files == 0:
                print("No new files to process")
                return

            # Process files in batches
            for i in range(0, total_files, BATCH_SIZE):
                batch_files = files_to_process[i:i + BATCH_SIZE]
                batch_start = i + 1
                batch_end = min(i + BATCH_SIZE, total_files)
                print(f"\nProcessing batch {batch_start}-{batch_end} of {total_files}")
                
                with Pool(processes=max(1, multiprocessing.cpu_count() - 1)) as pool:
                    batch_results = pool.map(
                        process_single_file,
                        [(f, j + 1, total_files, config, self.log_file) 
                        for j, f in enumerate(batch_files, start=i)]
                    )
                    
                    # Update statistics for this batch
                    for result in batch_results:
                        if result is not None:
                            self.total_results[result] += 1

                    # Print intermediate summary
                    print(f"Batch {batch_start}-{batch_end} completed:")
                    print(f"- Successfully uploaded: {sum(1 for r in batch_results if r == UploadResult.CORRECTLY)}")
                    print(f"- Skipped (exists): {sum(1 for r in batch_results if r == UploadResult.SKIPPED)}")
                    print(f"- Failed: {sum(1 for r in batch_results if r == UploadResult.FAILED)}")

            # Generate final summary
            end_time = time.time()
            elapsed_time = end_time - start_time
            elapsed_time_pretty = time.strftime("%H:%M:%S", time.gmtime(elapsed_time))

            summary = (
                f"\n\nUpload finished for {self.path}"
                f"\nTime required: {elapsed_time_pretty}"
                f"\nResults:"
                f"\n- Files already in repository: {skipped_files}"
                f"\n- New files processed: {total_files}"
                f"\n- Successfully uploaded: {self.total_results[UploadResult.CORRECTLY]}"
                f"\n- Skipped (already exists): {self.total_results[UploadResult.SKIPPED]}"
                f"\n- Failed: {self.total_results[UploadResult.FAILED]}\n"
            )

            with open(self.log_file, "a") as f:
                f.write(summary)

            print(summary)

        except Exception as e:
            print(f"[ERR] Error in upload process: {str(e)}")
            import traceback
            print(traceback.format_exc())

if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser(description='Upload malware samples to S3 and catalog them.')
    parser.add_argument('path', help='Path to file or directory to process')
    parser.add_argument('repository', help='Repository name')
    parser.add_argument('--notes', help='Optional notes to add to all files', default=None)
    
    args = parser.parse_args()
    
    uploader = S3Uploader(args.path, args.repository, args.notes)
    uploader.upload()